Merge with 87aa076dabd660637a3127d7b8878922b1a63373
authorcavaliet
Fri, 25 May 2012 17:50:54 +0200
changeset 645 5af755809dd1
parent 644 94429061bbfa (current diff)
parent 643 87aa076dabd6 (diff)
child 646 97f5db87d71c
Merge with 87aa076dabd660637a3127d7b8878922b1a63373
src/ldt/ldt/admin.py
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html
virtualenv/res/src/Django-1.3.1.tar.gz
virtualenv/res/src/python-memcached-1.48.tar.gz
--- a/.hgignore	Fri May 25 17:47:20 2012 +0200
+++ b/.hgignore	Fri May 25 17:50:54 2012 +0200
@@ -1,56 +1,32 @@
 
 syntax: regexp
 ^web/index$
-syntax: regexp
 ^web/log$
-syntax: regexp
 ^virtualenv/web/env/
-syntax: regexp
 .*\.pyc$
-
-syntax: regexp
 ^virtualenv/web/project-boot\.py$
-syntax: regexp
 ^web/ldtplatform/config\.py$
 ^web/ldtplatform/\.htaccess$
 ^web/\.htaccess$
-
-syntax: regexp
 ^virtualenv/web/distribute-0\.6\.14\.tar\.gz$
-syntax: regexp
 ^src/ldt/Ldt\.egg-info$
-syntax: regexp
 ^src/ldt/dist$
-
-syntax: regexp
 ^web/static/media/ldt$
-syntax: regexp
 ^web/static/site/admin$
-syntax: regexp
 ^web/static/site/ldt$
-syntax: regexp
 ^virtualenv/setup/project-boot\.py$
-syntax: regexp
 ^virtualenv/setup/env/
+^src/ldt/build$
+^src/ldt/ldt\.egg-info$
+^src/ldt/distribute-0\.6\.14\.tar\.gz$
+^src/ldt/distribute-0\.6\.14-py2\.6\.egg$
+^src/ldt/MANIFEST\.in$
+^src/ldt/MANIFEST$
+^\.pydevproject$
+^web/static/media/cache$
+^\.settings/org\.eclipse\.core\.resources\.prefs$
+^web/static/media/thumbnails$
+^virtualenv/sync/env
 
 syntax: regexp
-^src/ldt/build$
-syntax: regexp
-^src/ldt/ldt\.egg-info$
-syntax: regexp
-^src/ldt/distribute-0\.6\.14\.tar\.gz$
-syntax: regexp
-^src/ldt/distribute-0\.6\.14-py2\.6\.egg$
-syntax: regexp
-^src/ldt/MANIFEST\.in$
-
-syntax: regexp
-^src/ldt/MANIFEST$
-syntax: regexp
-^\.pydevproject$
-syntax: regexp
-^web/static/media/cache$
-syntax: regexp
-^\.settings/org\.eclipse\.core\.resources\.prefs$
-syntax: regexp
-^web/static/media/thumbnails$
\ No newline at end of file
+^sbin/sync/config\.py$
\ No newline at end of file
--- a/.hgtags	Fri May 25 17:47:20 2012 +0200
+++ b/.hgtags	Fri May 25 17:50:54 2012 +0200
@@ -52,3 +52,11 @@
 006f1e3e5398ca2fb0d6c7944f37421ce3138717 V01.07
 006f1e3e5398ca2fb0d6c7944f37421ce3138717 V01.07
 81cbac0d6d8c9309cee2663dc2b6dc1d85097cf1 V01.07
+04c71ec19b8036b9285c62985bd920e287aa14aa V01.08
+04c71ec19b8036b9285c62985bd920e287aa14aa V01.08
+0000000000000000000000000000000000000000 V01.08
+0000000000000000000000000000000000000000 V01.08
+dd483c59340c859be7845dd73ecd6da355216b91 V01.08
+dd483c59340c859be7845dd73ecd6da355216b91 V01.08
+14fe3554ad26ccf85f01f68ca07a869a1a20ef17 V01.08
+b419e891b0bde6e88c0337838aca82ec7c5e62b0 V01.09
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/sync/config.py.tmpl	Fri May 25 17:50:54 2012 +0200
@@ -0,0 +1,29 @@
+from fabric.api import env
+
+env.hosts = ['iri@web.iri.centrepompidou.fr']
+env.base_export_path = "~/tmp"
+env.export_prefix = "platform"
+env.remote_web_path = "/iridata/www/ldt/"
+env.platform_web_module = "ldtplatform"
+env.remote_ldt_base_path = "/tmp"
+env.remote_virtualenv_path = "/iridata/virtualenv/platform"
+env.remote_venv_export_path = "/tmp" 
+env.remote_baseline_venv = "/iridata/virtualenv/baseline2.7"
+env.web_rsync_filters = [
+    "+ core",
+    "P .htpasswd",
+    "P .htaccess",
+    "P ldtplatform/.htaccess",
+    "P ldtplatform/config.py",
+    "P ldtplatform/modwsgi.wsgi",
+    "P robots.txt",
+    "P env/***",
+    "P log/***",
+    "P index/***",
+    "P static/media/***",
+    "P crossdomain.xml",
+]
+env.venv_rsync_filters = [
+    "+ core",
+]
+env.web_relaunch_cmd = "supervisorctl restart platform"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/sync/fabfile.py	Fri May 25 17:50:54 2012 +0200
@@ -0,0 +1,194 @@
+from fabric.api import task, run, local, env, cd, put, prefix, sudo
+from fabric.colors import green
+from fabric.contrib.project import rsync_project
+from mercurial import commands, ui, hg, cmdutil
+import imp
+import os, os.path
+import shutil
+import sys
+
+import config
+
+def get_export_path(version):
+    base_path = os.path.join(env.base_export_path,env.export_prefix).lstrip("/")
+    return os.path.expanduser(base_path) + "_%s" % (str(version))
+
+def clean_export_folder(path):
+    print("Removing %s" % path)
+    if os.path.isdir(path):
+        shutil.rmtree(path, ignore_errors=True)
+
+def do_export_version(path, version):
+    print("Export version %s"%str(version))
+    
+    #hgui = ui.ui() 
+    #repo = hg.repository(hgui, cmdutil.findrepo(os.getcwd()))
+    #commands.archive(hgui, repo, path, rev=str(version))
+    
+    local("hg archive -r \'%s\' \"%s\"" % (str(version),path))
+    print("Export version %s done"%str(version))
+    
+def rsync_export(path, remotepath, filters):
+    print("Rsync %s to %s",(path,remotepath))
+    
+    if filters:
+        filter_option_str = " ".join(["--filter \"%s\"" % (f) for f in filters])
+    else:
+        filter_option_str =""
+    
+    run("mkdir -p \"%s\"" % remotepath)
+    rsync_project(remotepath, local_dir=path, extra_opts=filter_option_str, delete=True)
+    print("Rsync %s to %s done",(path,remotepath))
+    
+def clean_rsync_folder(remotepath):
+    print("clean rsync folder %s" % remotepath)
+    run("rm -fr \"%s\"" % remotepath)
+    
+def build_src(path):
+    print("Build source dist at %s" % path)
+    f = None
+    try:
+        f, pathname, description = imp.find_module("setup", [path])
+        print(" 2 Build source dist at %s" % path)
+        setup_mod = imp.load_module("setup", f, pathname, description)
+        print(" 3 Build source dist at %s" % path)
+    finally:
+        if f:
+            f.close()
+        
+    setup_mod.launch_setup("setup.py", ['sdist'])
+    
+    print("Build source dist at %s done" % path)
+    
+
+def get_src_version(path):
+    print("get src version at %s" % path)
+    f = None
+    try:
+        f, pathname, description = imp.find_module("ldt", [path])
+        ldt_mod = imp.load_module("ldt", f, pathname, description)
+    finally:
+        if f:
+            f.close()
+    version = ldt_mod.VERSION
+    version_str = ldt_mod.get_version()
+    
+    return (version, version_str) 
+    
+
+def sync_build(path):
+    print("Sync build %s" % path)
+    with cd(env.remote_ldt_base_path):
+        filename = os.path.basename(path)
+        res_trans = put(path, os.path.join(env.remote_ldt_base_path, filename))
+        print("Sync build %s to %s" % (path,repr(res_trans)))
+        return res_trans
+
+def remove_build(path):
+    print("remove build build %s" % path)
+    run("rm \"%s\"" % path)
+        
+
+def install_build(remotepath, remotevirtualenvpath):
+    print("Install build %s in %s" % (remotepath, remotevirtualenvpath))
+    activate_path = os.path.join(remotevirtualenvpath, "bin/activate")
+    
+    with prefix("source %s" % activate_path):
+        run("pip install \"%s\"" % remotepath)
+
+def collectstatic(remotepath, remotevirtualenvpath):
+    print("Collect static in %s with %s" % (remotepath, remotevirtualenvpath))
+    activate_path = os.path.join(remotevirtualenvpath, "bin/activate")
+    with prefix("source \"%s\"" % activate_path), prefix("export PYTHONPATH=\"%s\"" % remotepath), cd(os.path.join(remotepath, env.platform_web_module)):
+        run("python manage.py collectstatic --noinput")
+        
+        
+
+def export_version(version):
+    print("export version %s" % str(version))
+    
+    export_path = get_export_path(version)
+    
+    clean_export_folder(export_path)
+    do_export_version(export_path,version)
+    
+    return export_path
+
+def do_create_virtualenv(remote_venv_export_path, remotevirtualenvpath):
+    print("Create virtualenv export_path : %s - remote venvpath : %s" % (remote_venv_export_path, remotevirtualenvpath))
+    activate_path = os.path.join(remotevirtualenvpath, "bin/activate")
+    if "remote_baseline_venv" in env and env.remote_baseline_venv:
+        prefix_str = "source \"%s\"" % os.path.join(env.remote_baseline_venv, "bin/activate")
+    else:
+        prefix_str = "echo"
+    run("mkdir -p \"%s\"" % remotevirtualenvpath)
+    with prefix(prefix_str), cd(os.path.join(remote_venv_export_path,"virtualenv","web")):
+        run("python create_python_env.py")
+        run("python project-boot.py --unzip-setuptools --no-site-packages --clear --type-install=local \"%s\"" % remotevirtualenvpath)
+    with prefix("source \"%s\"" % activate_path):
+        run("pip install -r \"%s\"" % os.path.join(remote_venv_export_path,"virtualenv","web","res","srvr_requirements.txt"))
+
+def do_sync_ldt(version, export_path):
+    print("do_sync_ldt with version %s and path %s" % (version,export_path))
+    src_path = export_path + "/src/ldt"
+    build_src(src_path)
+    (_,version_str) = get_src_version(src_path)
+    build_path = os.path.join(src_path,"dist","ldt-%s.tar.gz" % version_str)
+    res_trans = None
+    try:
+        res_trans = sync_build(build_path)
+        install_build(res_trans[0], env.remote_virtualenv_path)        
+    finally:
+        if res_trans:
+            remove_build(res_trans[0])
+
+def do_sync_web(version, export_path):
+    print("do_sync_web with version %s and path %s" % (version,export_path))
+    web_path = os.path.join(export_path,"web/") 
+    rsync_export(web_path, env.remote_web_path, env.web_rsync_filters)    
+
+def relaunch_server():
+    print("Relaunch server")
+    collectstatic(env.remote_web_path, env.remote_virtualenv_path)
+    sudo(env.web_relaunch_cmd, shell=False)
+
+@task
+def sync_web(version):
+    print(green("sync web with version %s" % version))
+    export_path = export_version(version)
+    do_sync_web(version, export_path)    
+    clean_export_folder(export_path)
+    relaunch_server()
+
+@task
+def sync_ldt(version):
+    print(green("sync ldt with version %s" % version))
+    export_path = export_version(version)
+    do_sync_ldt(version, export_path)
+    clean_export_folder(export_path)
+    relaunch_server()    
+
+@task
+def sync_platform(version):
+    print(green("sync platform with version %s" % version))
+    export_path = export_version(version)
+    do_sync_ldt(version, export_path)
+    do_sync_web(version, export_path)
+    clean_export_folder(export_path)
+    relaunch_server()
+
+@task
+def create_virtualenv(version):
+    print(green("create virtualenv with version %s" % version))
+    export_path = export_version(version)
+    venv_remote_export_path = ""
+    try:
+        virtualenv_path = os.path.join(export_path, "virtualenv")
+    
+        venv_remote_export_path = os.path.join(env.remote_venv_export_path, env.export_prefix, version,"virtualenv")
+        rsync_export(virtualenv_path, venv_remote_export_path, env.venv_rsync_filters)
+        do_create_virtualenv(venv_remote_export_path, env.remote_virtualenv_path)
+    finally:
+        clean_export_folder(export_path)
+        if venv_remote_export_path:
+            clean_rsync_folder(venv_remote_export_path)
--- a/sbin/sync/sync_ldt_platform	Fri May 25 17:47:20 2012 +0200
+++ b/sbin/sync/sync_ldt_platform	Fri May 25 17:50:54 2012 +0200
@@ -1,4 +1,3 @@
-
 #!/usr/bin/env bash
 set -e
 if [ -d ~/tmp/platform_V$1 ]; then
--- a/src/ldt/ldt/__init__.py	Fri May 25 17:47:20 2012 +0200
+++ b/src/ldt/ldt/__init__.py	Fri May 25 17:50:54 2012 +0200
@@ -1,4 +1,4 @@
-VERSION = (1, 7, 0, "final", 0)
+VERSION = (1, 9, 0, "final", 0)
 
 
 def get_version():
@@ -15,5 +15,3 @@
 
 __version__ = get_version()
 
-#initialize 
-from ldt.ldt_utils import contentindexer
--- a/src/ldt/ldt/admin.py	Fri May 25 17:47:20 2012 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-##from django.contrib import admin
-#from ldt.management import test_cms
-#
-#"""
-#site admin pour cms page
-#"""
-#if test_cms():
-#    pass
-##    class AdminSite(admin.AdminSite):
-##        index_template = 'admin/page_index.html'
-##        login_template = 'admin/page_login.html'
-##        app_index_template = 'admin/page_app_index.html'    
-#        
-##    admin_site = AdminSite()
-#
-##    from cms.models import Page
-##    from cms.admin import pageadmin
-#
-##    class CmsPageAdmin(pageadmin.PageAdmin):
-##        change_list_template = "admin/cms_change_list.html"
-##       change_form_template = "admin/cms_change_form.html"
-#
-##    admin_site.register(Page, CmsPageAdmin)
-#
-##    from cms.plugins.snippet.models import Snippet
-##    from cms.plugins.snippet.admin import SnippetAdmin
-#
-##    class CmsSnippetAdmin(SnippetAdmin):
-##        change_form_template = "admin/page_change_form.html"
-##        change_list_template = "admin/page_change_list.html"
-##    admin_site.register(Snippet, CmsSnippetAdmin)
--- a/src/ldt/ldt/ldt_utils/__init__.py	Fri May 25 17:47:20 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/__init__.py	Fri May 25 17:50:54 2012 +0200
@@ -1,2 +1,2 @@
-VERSION = (0, 1)
-VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION)))  
\ No newline at end of file
+#initialize 
+from ldt.ldt_utils import contentindexer
--- a/src/ldt/ldt/ldt_utils/contentindexer.py	Fri May 25 17:47:20 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/contentindexer.py	Fri May 25 17:50:54 2012 +0200
@@ -130,70 +130,70 @@
 
 class ContentIndexer(LdtIndexer):
         
-        def __init__(self, contentList, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST, callback=None):
-            super(ContentIndexer, self).__init__(writer, decoupage_blackList)
-            self.__contentList = contentList
-            self.__callback = callback
-                                       
-        def index_all(self):
-            for i,content in enumerate(self.__contentList):
-                if self.__callback:
-                    self.__callback(i,content)
-                self.index_content(content)
-                
-        def index_content(self, content):
+    def __init__(self, contentList, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST, callback=None):
+        super(ContentIndexer, self).__init__(writer, decoupage_blackList)
+        self.__contentList = contentList
+        self.__callback = callback
+                                   
+    def index_all(self):
+        for i,content in enumerate(self.__contentList):
+            if self.__callback:
+                self.__callback(i,content)
+            self.index_content(content)
             
-            url = content.iri_url()
-            filepath = urllib.urlopen(url)
-            doc = lxml.etree.parse(filepath) #@UndefinedVariable
-           
-            self.writer.deleteDocuments(lucene.Term("iri_id", content.iri_id))
-            Segment.objects.filter(iri_id=content.iri_id).delete() #@UndefinedVariable
-            
-            res = doc.xpath("/iri/body/ensembles/ensemble")
+    def index_content(self, content):
+        
+        url = content.iri_url()
+        filepath = urllib.urlopen(url)
+        doc = lxml.etree.parse(filepath) #@UndefinedVariable
+       
+        self.writer.deleteDocuments(lucene.Term("iri_id", content.iri_id))
+        Segment.objects.filter(iri_id=content.iri_id).delete() #@UndefinedVariable
+        
+        res = doc.xpath("/iri/body/ensembles/ensemble")
 
-            for ensemble in res:                
-                self.index_ensemble(ensemble, content)
-            
-            self.writer.commit()
+        for ensemble in res:                
+            self.index_ensemble(ensemble, content)
+        
+        self.writer.commit()
             
             
 class ProjectIndexer(LdtIndexer):
-        
-        def __init__(self, projectList, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST, callback=None):
-            super(ProjectIndexer, self).__init__(writer, decoupage_blackList)                
-            self.__projectList = projectList
-            self.__callback = callback
-                                   
-        def index_all(self):
-            for i,project in enumerate(self.__projectList):
-                if self.__callback:
-                    self.__callback(i,project)
 
-                self.index_project(project)
- 
-        def index_project(self, project):
-            
-            # pocketfilms.utils.log.debug("Indexing project : "+str(project.iri_id))
-            doc = lxml.etree.fromstring(project.ldt_encoded) #@UndefinedVariable
+    def __init__(self, projectList, writer, decoupage_blackList=settings.DECOUPAGE_BLACKLIST, callback=None):
+        super(ProjectIndexer, self).__init__(writer, decoupage_blackList)                
+        self.__projectList = projectList
+        self.__callback = callback
+                              
+    def index_all(self):
+        for i,project in enumerate(self.__projectList):
+            if self.__callback:
+                self.__callback(i,project)
+
+            self.index_project(project)
+
+    def index_project(self, project):
+
+        # pocketfilms.utils.log.debug("Indexing project : "+str(project.iri_id))
+        doc = lxml.etree.fromstring(project.ldt_encoded) #@UndefinedVariable
 
-            self.writer.deleteDocuments(lucene.Term("project_id", project.ldt_id))
-            Segment.objects.filter(project_obj__ldt_id=project.ldt_id).delete() #@UndefinedVariable
-            
-            res = doc.xpath("/iri/annotations/content")
+        self.writer.deleteDocuments(lucene.Term("project_id", project.ldt_id))
+        Segment.objects.filter(project_obj__ldt_id=project.ldt_id).delete() #@UndefinedVariable
+       
+        res = doc.xpath("/iri/annotations/content")
+
+        for content in res:
+            contentId = content.get(u"id", None)
+            content_obj = None
 
-            for content in res:
-                contentId = content.get(u"id", None)
-                content_obj = None
-                
-                clist = Content.objects.filter(iri_id = contentId) #@UndefinedVariable
-                if len(clist) > 0:
-                    content_obj = clist[0]
- 
-                for ensemble in content.getchildren():
-                    self.index_ensemble(ensemble, content_obj, project)
-            
-            self.writer.commit()
+            clist = Content.objects.filter(iri_id = contentId) #@UndefinedVariable
+            if len(clist) > 0:
+                content_obj = clist[0]
+
+            for ensemble in content.getchildren():
+                self.index_ensemble(ensemble, content_obj, project)
+       
+        self.writer.commit()
 
 @receiver(post_save, sender=Project)
 def index_project(sender, **kwargs):
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html	Fri May 25 17:47:20 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html	Fri May 25 17:50:54 2012 +0200
@@ -50,9 +50,9 @@
         <td class="cellimg"><div class="cellimgdiv"><img src="{{LDT_MEDIA_PREFIX}}img/plugin.png" href="{{WEB_URL}}{{json_url_id}}" id="player_project_{{project.ldt_id}}" class="ldt_link_embed" alt="{% trans 'link json by id' %}" title="{% trans 'link json by id' %}"/></div></td>
         <td class="cellimg">
         {% ifequal project.state 2 %}
-        <img src="{{ADMIN_MEDIA_PREFIX}}img/admin/icon-yes.gif" {% if project.change %} alt="{% trans 'Project published, click to unpublish' %}" title="{% trans 'Project published, click to unpublish' %}" class="publishedproject qtiplink" {% else %} class="qtiplink" title="{% trans "You are not allowed to change this project" %}"{% endif %} id="project_{{project.ldt_id}}" /></div>
+        <img src="{{LDT_MEDIA_PREFIX}}img/icon-yes.gif" {% if project.change %} alt="{% trans 'Project published, click to unpublish' %}" title="{% trans 'Project published, click to unpublish' %}" class="publishedproject qtiplink" {% else %} class="qtiplink" title="{% trans "You are not allowed to change this project" %}"{% endif %} id="project_{{project.ldt_id}}" /></div>
         {% else %}
-        <img src="{{ADMIN_MEDIA_PREFIX}}img/admin/icon-no.gif" {% if project.change %} alt="{% trans 'Project not published, click to publish' %}" title="{% trans 'Project not published, click to publish' %}" class="unpublishedproject qtiplink" {% else %} class="qtiplink" title="{% trans "You are not allowed to change this project" %}"{% endif %}id="project_{{project.ldt_id}}" />
+        <img src="{{LDT_MEDIA_PREFIX}}img/icon-no.gif" {% if project.change %} alt="{% trans 'Project not published, click to publish' %}" title="{% trans 'Project not published, click to publish' %}" class="unpublishedproject qtiplink" {% else %} class="qtiplink" title="{% trans "You are not allowed to change this project" %}"{% endif %}id="project_{{project.ldt_id}}" />
         {% endifequal %}
         </td>
         <td>{% thumbnail project.image "50x50" crop="center" format="PNG" as im %}<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" />{% empty %}&nbsp;{% endthumbnail %}</td>
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/publishedprojectslist.html	Fri May 25 17:47:20 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/publishedprojectslist.html	Fri May 25 17:50:54 2012 +0200
@@ -17,7 +17,7 @@
         <td class="cellimg"><div class="cellimgdiv"><img src="{{LDT_MEDIA_PREFIX}}img/page_copy.png" href="{% url ldt.ldt_utils.views.project.copy_project project.ldt_id %}" class="ldt_link_copy_project" alt="{% trans 'copy the project' %}" title="{% trans 'copy the project' %}"/></div></td>
         <td class="cellimg"><div class="cellimgdiv"><img src="{{LDT_MEDIA_PREFIX}}img/plugin.png" href="{{WEB_URL}}{{json_url_id}}" id="player_project_{{project.ldt_id}}" class="ldt_link_embed" alt="{% trans 'link json by id' %}" title="{% trans 'link json by id' %}"/></div></td>
         <td class="cellimg">
-        <img src="{{ADMIN_MEDIA_PREFIX}}img/admin/icon-yes.gif" alt="{% trans 'Project published' %}" id="project_{{project.ldt_id}}" />
+        <img src="{{LDT_MEDIA_PREFIX}}img/icon-yes.gif" alt="{% trans 'Project published' %}" id="project_{{project.ldt_id}}" />
         </td>
         <td>{% thumbnail project.image "50x50" crop="center" format="PNG" as im %}<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" />{% empty %}&nbsp;{% endthumbnail %}</td>
         <td class="projecttitle">
Binary file src/ldt/ldt/locale/en/LC_MESSAGES/django.mo has changed
--- a/src/ldt/ldt/locale/en/LC_MESSAGES/django.po	Fri May 25 17:47:20 2012 +0200
+++ b/src/ldt/ldt/locale/en/LC_MESSAGES/django.po	Fri May 25 17:50:54 2012 +0200
@@ -1,20 +1,21 @@
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
+# Yves-Marie Haussonne <ymh.work@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-03-13 12:32+0100\n"
-"PO-Revision-Date: 2010-02-17 03:53+0100\n"
+"POT-Creation-Date: 2012-04-27 19:39+0200\n"
+"PO-Revision-Date: 2012-04-29 22:26+0200\n"
 "Last-Translator: Yves-Marie Haussonne <ymh.work@gmail.com>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"Language-Team: IRI\n"
+"Language: en\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.0-mac-beta-1\n"
 
 #: forms/widgets.py:17
 msgid "Date"
@@ -24,8 +25,7 @@
 msgid "Time"
 msgstr "Time"
 
-#: ldt_utils/forms.py:32
-#: ldt_utils/templates/front/front_base.html:52
+#: ldt_utils/forms.py:32 ldt_utils/templates/front/front_base.html:52
 #: ldt_utils/templates/ldt/ldt_utils/published_projects.html:53
 msgid "Search"
 msgstr "search"
@@ -34,8 +34,7 @@
 msgid "all"
 msgstr "all"
 
-#: ldt_utils/forms.py:33
-#: ldt_utils/models.py:54
+#: ldt_utils/forms.py:33 ldt_utils/models.py:54
 #: ldt_utils/templates/ldt/ldt_utils/content_list.html:69
 msgid "title"
 msgstr "title"
@@ -60,8 +59,7 @@
 msgid "Content Tag"
 msgstr "Content category"
 
-#: ldt_utils/forms.py:52
-#: ldt_utils/models.py:132
+#: ldt_utils/forms.py:52 ldt_utils/models.py:132
 msgid "content.content_creation_date"
 msgstr "content creation date"
 
@@ -178,18 +176,16 @@
 msgstr "duration (ms)"
 
 #: ldt_utils/models.py:445
-#, fuzzy
 msgid "content_stat.content"
-msgstr "annotation distribution"
+msgstr "annotation statistics"
 
 #: ldt_utils/models.py:446
-#, fuzzy
 msgid "content_stat.annotations_volume"
-msgstr "annotation distribution"
+msgstr "annotation volume"
 
 #: ldt_utils/models.py:447
 msgid "content_stat.polemics_volume"
-msgstr ""
+msgstr "Annotation volume"
 
 #: ldt_utils/models.py:448
 msgid "content.nb_annotation"
@@ -197,7 +193,7 @@
 
 #: ldt_utils/models.py:449
 msgid "content.last_annotated"
-msgstr "last updated"
+msgstr "last annotated"
 
 #: ldt_utils/models.py:504
 msgid "created by"
@@ -207,8 +203,7 @@
 msgid "changed by"
 msgstr "changed by"
 
-#: ldt_utils/utils.py:208
-#: ldt_utils/utils.py:390
+#: ldt_utils/utils.py:208 ldt_utils/utils.py:390
 msgid "Personal cutting"
 msgstr "Personal cutting"
 
@@ -294,8 +289,7 @@
 
 #: ldt_utils/templates/front/front_base.html:69
 #: templates/cms/admin/cms/page/change_form.html:11
-#: templates/ldt/ldt_base.html:97
-#: user/templates/ldt/user/login_form.html:34
+#: templates/ldt/ldt_base.html:97 user/templates/ldt/user/login_form.html:34
 msgid "Log out"
 msgstr "Log out"
 
@@ -339,7 +333,7 @@
 
 #: ldt_utils/templates/front/front_home.html:7
 msgid "front.home"
-msgstr ""
+msgstr "Ligne de Temps Platform"
 
 #: ldt_utils/templates/front/front_home.html:31
 msgid "Last annotated medias"
@@ -374,7 +368,7 @@
 msgstr[0] "%(nb)s user in this group"
 msgstr[1] "%(nb)s users in this group"
 
-#: ldt_utils/templates/front/front_player.html:96
+#: ldt_utils/templates/front/front_player.html:101
 msgid "All annotations on the media"
 msgstr "All annotations on the media"
 
@@ -396,6 +390,8 @@
 " No results for <b>%(search)s</b> with the medias tagged <span class=\"pink"
 "\">%(tag_label)s</span>"
 msgstr ""
+" No results for <b>%(search)s</b> with the medias tagged <span class=\"pink\">"
+"%(tag_label)s</span>"
 
 #: ldt_utils/templates/front/front_search_results.html:55
 msgid "See for all medias"
@@ -510,7 +506,7 @@
 #: ldt_utils/templates/ldt/ldt_utils/create_content.html:52
 #: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:48
 msgid "more options"
-msgstr ""
+msgstr "more options"
 
 #: ldt_utils/templates/ldt/ldt_utils/create_content.html:56
 #: ldt_utils/templates/ldt/ldt_utils/create_ldt.html:52
@@ -521,7 +517,8 @@
 msgid ""
 "The operation could not be performed because one or more error(s) occurred."
 "<br />Please resubmit the media form after making the following changes:"
-msgstr "The operation could not be performed because one or more error(s) occurred."
+msgstr ""
+"The operation could not be performed because one or more error(s) occurred."
 "<br />Please resubmit the media form after making the following changes:"
 
 #: ldt_utils/templates/ldt/ldt_utils/create_content.html:84
@@ -686,7 +683,8 @@
 msgid ""
 "Your current work is modified. Click Cancel and save it one last time before "
 "leaving. Click OK to leave without saving."
-msgstr "Your current work is modified. Click Cancel and save it one last time before "
+msgstr ""
+"Your current work is modified. Click Cancel and save it one last time before "
 "leaving. Click OK to leave without saving."
 
 #: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:78
@@ -889,3 +887,673 @@
 msgid "confirm delete content"
 msgstr "Confirm delete content"
 
+#: ldt_utils/views/content.py:321
+#, python-format
+msgid ""
+"Content '%(title)s' is referenced by this project : %(project_titles)s. "
+"Please delete it beforehand."
+msgid_plural ""
+"Content '%(title)s' is referenced by %(count)d projects: %(project_titles)s. "
+"Please delete them beforehand."
+msgstr[0] ""
+"Content '%(title)s' is referenced by this project : %(project_titles)s. "
+"Please delete it beforehand."
+msgstr[1] ""
+"Content '%(title)s' is referenced by %(count)d projects: %(project_titles)s. "
+"Please delete them beforehand."
+
+#: ldt_utils/views/json.py:34 ldt_utils/views/rdf.py:15
+#: ldt_utils/views/workspace.py:108
+msgid "You can not access this project"
+msgstr "You can not access this project"
+
+#: ldt_utils/views/project.py:110
+#, python-format
+msgid "the project %(title)s is published. please unpublish before deleting."
+msgstr "the project %(title)s is published. please unpublish before deleting."
+
+#: ldt_utils/views/project.py:111 ldt_utils/views/project.py:115
+msgid "can not delete the project. Please correct the following error"
+msgstr "can not delete the project. Please correct the following error"
+
+#: ldt_utils/views/project.py:112 ldt_utils/views/project.py:116
+msgid "title error deleting project"
+msgstr "Error when deleting project"
+
+#: ldt_utils/views/project.py:114
+#, python-format
+msgid ""
+"the project %(title)s is the front project of %(content)s. please delete "
+"this content first."
+msgstr ""
+"the project %(title)s is the front project of %(content)s. please delete "
+"this content first."
+
+#: ldt_utils/views/project.py:118
+#, python-format
+msgid "please confirm deleting project %(title)s"
+msgstr "please confirm deleting project %(title)s"
+
+#: ldt_utils/views/project.py:119
+msgid "confirm deletion"
+msgstr "Confirm deletion"
+
+#: templates/admin/cms_change_form.html:30
+msgid "Approve page deletion"
+msgstr "Approve page deletion"
+
+#: templates/admin/cms_change_form.html:36
+#, python-format
+msgid "(requires approvement at %(moderation_level)s level)"
+msgstr "(requires approvement at %(moderation_level)s level)"
+
+#: templates/admin/cms_change_form.html:37
+msgid "(you can perform actions on this page directly)"
+msgstr "(you can perform actions on this page directly)"
+
+#: templates/admin/cms_change_form.html:50
+msgid "Remove delete request"
+msgstr "Remove delete request"
+
+#: templates/admin/cms_change_form.html:52
+msgid "Approve delete"
+msgstr "Approve delete"
+
+#: templates/admin/cms_change_form.html:52
+msgid "Approve"
+msgstr "Approve"
+
+#: templates/admin/cms_change_form.html:52
+#: templates/admin/cms_change_form.html:53
+msgid "draft"
+msgstr "draft"
+
+#: templates/admin/cms_change_form.html:53
+msgid "Preview"
+msgstr "Preview"
+
+#: templates/admin/cms_change_form.html:56
+#: templates/admin/page_change_form.html:27
+msgid "History"
+msgstr "History"
+
+#: templates/admin/cms_change_form.html:57
+#: templates/admin/page_change_form.html:28
+msgid "View on site"
+msgstr "View on site"
+
+#: templates/admin/cms_change_form.html:87
+#: templates/admin/page_change_form.html:38
+#: templates/admin/page_change_list.html:54
+#: templates/cms/admin/cms/page/change_form.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Please correct the error below."
+msgstr[1] "Please correct the errors below."
+
+#: templates/admin/cms_change_form.html:107
+msgid "All permissions"
+msgstr "All permissions"
+
+#: templates/admin/cms_change_form.html:108
+#: templates/admin/cms_change_form.html:120
+msgid "Loading..."
+msgstr "Loading..."
+
+#: templates/admin/cms_change_form.html:119
+msgid "Page states"
+msgstr "Page states"
+
+#: templates/admin/cms_change_form.html:142
+#, python-format
+msgid ""
+"This page must be moderated at level %(moderation_level)s, post a message "
+"for moderator."
+msgstr ""
+"This page must be moderated at level %(moderation_level)s, post a message "
+"for moderator."
+
+#: templates/admin/cms_change_form.html:144
+msgid "Request approvemet"
+msgstr "Request approvement"
+
+#: templates/admin/cms_change_form.html:234
+#: user/templates/registration/registration_form.html:16
+msgid "Save"
+msgstr "Save"
+
+#: templates/admin/cms_change_form.html:235
+msgid "Save and continue editing"
+msgstr "Save and continue editing"
+
+#: templates/admin/cms_change_list.html:51
+msgid "Successfully moved"
+msgstr "Successfully moved"
+
+#: templates/admin/cms_change_list.html:76
+#, python-format
+msgid "Recover deleted %(name)s"
+msgstr "Recover deleted %(name)s"
+
+#: templates/admin/cms_change_list.html:79
+#: templates/admin/page_change_list.html:46
+#, python-format
+msgid "Add %(name)s"
+msgstr "Add %(name)s"
+
+#: templates/admin/cms_change_list.html:91
+msgid "Pages on:"
+msgstr "Pages on:"
+
+#: templates/admin/cms_change_list.html:108
+msgid "on"
+msgstr "on"
+
+#: templates/admin/cms_change_list.html:108
+msgid "off"
+msgstr "off"
+
+#: templates/admin/cms_change_list.html:110
+#: templates/admin/page_change_list.html:65
+msgid "Filter"
+msgstr "Filter"
+
+#: templates/admin/index.html:18 templates/admin/page_index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Models available in the %(name)s application."
+
+#: templates/admin/index.html:19 templates/admin/page_app_index.html:10
+#: templates/admin/page_index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: templates/admin/index.html:29 templates/admin/page_change_form.html:20
+#: templates/admin/page_index.html:29
+msgid "Add"
+msgstr "Add"
+
+#: templates/admin/index.html:35 templates/admin/page_index.html:35
+msgid "Change"
+msgstr "Change"
+
+#: templates/admin/index.html:64 templates/admin/page_index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "You don't have permission to edit anything."
+
+#: templates/admin/index.html:72 templates/admin/page_index.html:53
+msgid "Recent Actions"
+msgstr "Recent Actions"
+
+#: templates/admin/index.html:73 templates/admin/page_index.html:54
+msgid "My Actions"
+msgstr "My Actions"
+
+#: templates/admin/index.html:77 templates/admin/page_index.html:58
+msgid "None available"
+msgstr "None available"
+
+#: templates/admin/index.html:91 templates/admin/page_index.html:72
+msgid "Unknown content"
+msgstr "Unknown content"
+
+#: templates/admin/page_base.html:20 templates/admin/page_index.html:11
+msgid "Pages"
+msgstr "Pages"
+
+#: templates/admin/page_base_site.html:7
+msgid "Django administration"
+msgstr "Django administration"
+
+#: templates/admin/page_login.html:8
+msgid "Connexion"
+msgstr "Connexion"
+
+#: templates/admin/page_login.html:20
+msgid "Username:"
+msgstr "Username:"
+
+#: templates/admin/page_login.html:24
+msgid "Password:"
+msgstr "Password:"
+
+#: templates/admin/page_login.html:29
+#: user/templates/registration/login.html:39
+msgid "Create an account"
+msgstr "Create an account"
+
+#: templates/admin/page_login.html:30
+#: user/templates/registration/login.html:40
+msgid "Forget password?"
+msgstr "Forget password?"
+
+#: templates/cms/admin/cms/page/change_form.html:11
+msgid "Documentation"
+msgstr "Documentation"
+
+#: templates/cms/admin/cms/page/change_form.html:11
+msgid "Change password"
+msgstr "Change password"
+
+#: templates/cms/admin/cms/page/change_form.html:42
+msgid "Ordering"
+msgstr "Ordering"
+
+#: templates/cms/admin/cms/page/change_form.html:45
+msgid "Order:"
+msgstr "Order:"
+
+#: templates/ldt/ldt_base.html:86
+msgid "header_title"
+msgstr "LDT Platform"
+
+#: templates/ldt/ldt_base.html:90
+msgid "Link to admin"
+msgstr "admin"
+
+#: templates/ldt/ldt_base.html:90
+msgid "Staff"
+msgstr "admin"
+
+#: templates/ldt/ldt_base.html:93
+msgid "front link"
+msgstr "front"
+
+#: templates/ldt/ldt_base.html:94
+#: user/templates/ldt/user/change_profile.html:95
+msgid "Profile change"
+msgstr "Profile change"
+
+#: templates/ldt/ldt_base.html:114 templates/ldt/ldt_base.html.py:115
+msgid "home"
+msgstr "Home"
+
+#: templates/ldt/ldt_base.html:148
+msgid "Version number"
+msgstr "Version"
+
+#: templates/ldt/ldt_base.html:148
+#, python-format
+msgid " web %(WEB_VERSION)s | platform %(VERSION)s"
+msgstr " web %(WEB_VERSION)s | platform %(VERSION)s"
+
+#: templates/ldt/ldt_raw_base.html:14
+msgid "page_title"
+msgstr "LDT Platform"
+
+#: text/models.py:17
+msgid "annotation.external_id"
+msgstr "external id"
+
+#: text/models.py:18
+msgid "annotation.uri"
+msgstr "annotation uri"
+
+#: text/models.py:19
+msgid "annotation.tags"
+msgstr "tags"
+
+#: text/models.py:20
+msgid "annotation.title"
+msgstr "title"
+
+#: text/models.py:21
+msgid "annotation.description"
+msgstr "description"
+
+#: text/models.py:22
+msgid "annotation.text"
+msgstr "text"
+
+#: text/models.py:23
+msgid "annotation.color"
+msgstr "color"
+
+#: text/models.py:24
+msgid "creator.title"
+msgstr "title"
+
+#: text/models.py:25
+msgid "contributor.title"
+msgstr "title"
+
+#: text/models.py:26
+msgid "annotation.creation_date"
+msgstr "creation date"
+
+#: text/models.py:27
+msgid "annotation.update_date"
+msgstr "update date"
+
+#: user/admin.py:27
+msgid "User details"
+msgstr "User details"
+
+#: user/admin.py:28
+msgid "Groups"
+msgstr "Groups"
+
+#: user/admin.py:29
+msgid "Permissions"
+msgstr "Permissions"
+
+#: user/admin.py:40 user/templates/ldt/user/change_profile.html:105
+#: user/templates/ldt/user/login_form.html:61
+msgid "Password"
+msgstr "Password"
+
+#: user/forms.py:27 user/templates/ldt/user/change_password.html:40
+#: user/templates/ldt/user/change_profile.html:118
+msgid "New password"
+msgstr "New password"
+
+#: user/forms.py:29 user/templates/ldt/user/change_password.html:50
+#: user/templates/ldt/user/change_profile.html:131
+msgid "New password confirmation"
+msgstr "New password confirmation"
+
+#: user/forms.py:58 user/forms.py:59
+msgid "E-mail"
+msgstr "E-mail"
+
+#: user/forms.py:70
+msgid "The two emails didn't match."
+msgstr "The two emails didn't match."
+
+#: user/forms.py:81 user/templates/ldt/user/change_profile.html:54
+msgid "First name"
+msgstr "First name"
+
+#: user/forms.py:82
+msgid "Last name"
+msgstr "Last name"
+
+#: user/forms.py:109 user/templates/ldt/user/change_profile.html:83
+msgid "Language"
+msgstr "Language"
+
+#: user/forms.py:123
+msgid "Profile picture"
+msgstr "Profile picture"
+
+#: user/forms.py:133
+#, python-format
+msgid "Image size is limited to %s"
+msgstr "Image size is limited to %s"
+
+#: user/views.py:28
+msgid "Your profile has been updated."
+msgstr "Your profile has been updated."
+
+#: user/views.py:52
+msgid "Your password has been updated."
+msgstr "Your password has been updated."
+
+#: user/views.py:76
+msgid "Your profile picture has been updated."
+msgstr "Your profile picture has been updated."
+
+#: user/views.py:98 user/templates/registration/login.html:24
+msgid "Sorry, that's not a valid username or password."
+msgstr "Sorry, that's not a valid username or password."
+
+#: user/templates/ldt/user/change_password.html:31
+msgid "Old password"
+msgstr "Old password"
+
+#: user/templates/ldt/user/change_password.html:44
+msgid "passwords don't match"
+msgstr "passwords don't match"
+
+#: user/templates/ldt/user/change_password.html:57
+#: user/templates/ldt/user/change_profile.html:144
+#: user/templates/registration/password_change_form.html:14
+#: user/templates/registration/password_change_form.html:17
+msgid "Password change"
+msgstr "Password change"
+
+#: user/templates/ldt/user/change_password.html:61
+msgid "Your new password has been saved."
+msgstr "Your new password has been saved."
+
+#: user/templates/ldt/user/change_profile.html:19
+msgid "Invalid extension ! Your file has to be JPG, JPEG or PNG."
+msgstr "Invalid extension ! Your file has to be JPG, JPEG or PNG."
+
+#: user/templates/ldt/user/change_profile.html:43
+msgid "Username"
+msgstr "Username"
+
+#: user/templates/ldt/user/change_profile.html:70
+msgid "Email"
+msgstr "Email"
+
+#: user/templates/ldt/user/change_profile.html:175
+msgid "Profile picture change"
+msgstr "Profile picture change"
+
+#: user/templates/ldt/user/login_form.html:32
+#: user/templates/registration/password_change_done.html:7
+#: user/templates/registration/password_change_form.html:13
+msgid "Profiles"
+msgstr "Profiles"
+
+#: user/templates/ldt/user/login_form.html:50
+msgid "create account"
+msgstr "create account"
+
+#: user/templates/ldt/user/login_form.html:54
+msgid "Pseudo"
+msgstr "Nickname"
+
+#: user/templates/ldt/user/login_form.html:57
+#: user/templates/ldt/user/login_form.html:64
+msgid "this field is compulsory"
+msgstr "this field is compulsory"
+
+#: user/templates/ldt/user/login_form.html:68
+msgid "reset password"
+msgstr "reset password"
+
+#: user/templates/ldt/user/login_form.html:71
+msgid "Connection"
+msgstr "Connexion"
+
+#: user/templates/registration/activate.html:6
+#: user/templates/registration/activate.html:9
+msgid "Activate account"
+msgstr "Activate account"
+
+#: user/templates/registration/activate.html:12
+msgid "You have activated your account"
+msgstr "You have activated your account"
+
+#: user/templates/registration/activate.html:13
+msgid "Go back to login page"
+msgstr "Go back to login page"
+
+#: user/templates/registration/activation_complete.html:4
+#: user/templates/registration/registration_complete.html:8
+msgid "Sign up successfully"
+msgstr "Sign up successfully"
+
+#: user/templates/registration/activation_complete.html:6
+msgid "activation completed"
+msgstr "activation completed"
+
+#: user/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Thak you for your visit"
+
+#: user/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Log in"
+
+#: user/templates/registration/login.html:46
+msgid "login"
+msgstr "login"
+
+#: user/templates/registration/password_change_done.html:3
+#: user/templates/registration/password_change_done.html:11
+msgid "password change successful"
+msgstr "password change successful"
+
+#: user/templates/registration/password_change_done.html:8
+msgid "password change"
+msgstr "password change"
+
+#: user/templates/registration/password_change_done.html:14
+msgid "Your password has been changed."
+msgstr "Your password has been changed."
+
+#: user/templates/registration/password_change_done.html:15
+msgid "Go back to profiles"
+msgstr "Go back to profiles"
+
+#: user/templates/registration/password_change_form.html:20
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+
+#: user/templates/registration/password_change_form.html:26
+msgid "Old password:"
+msgstr "Old password:"
+
+#: user/templates/registration/password_change_form.html:32
+#: user/templates/registration/password_reset_confirm.html:19
+msgid "New password:"
+msgstr "New password:"
+
+#: user/templates/registration/password_change_form.html:38
+#: user/templates/registration/password_reset_confirm.html:21
+msgid "Confirm password:"
+msgstr "Confirm password:"
+
+#: user/templates/registration/password_change_form.html:44
+#: user/templates/registration/password_reset_confirm.html:22
+msgid "Change my password"
+msgstr "Change my password"
+
+#: user/templates/registration/password_reset_complete.html:6
+#: user/templates/registration/password_reset_confirm.html:6
+#: user/templates/registration/password_reset_confirm.html:9
+#: user/templates/registration/password_reset_done.html:6
+#: user/templates/registration/password_reset_form.html:13
+#: user/templates/registration/password_reset_form.html:15
+#: user/templates/registration/password_reset_form.html:18
+msgid "Password reset"
+msgstr "Password reset"
+
+#: user/templates/registration/password_reset_complete.html:9
+msgid "Password reset complete"
+msgstr "Password reset complete"
+
+#: user/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Your password has been set.  You may go ahead and log in now."
+
+#: user/templates/registration/password_reset_confirm.html:15
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+
+#: user/templates/registration/password_reset_confirm.html:27
+msgid "Password reset unsuccessful"
+msgstr "Password reset unsuccessful"
+
+#: user/templates/registration/password_reset_confirm.html:29
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+
+#: user/templates/registration/password_reset_done.html:8
+msgid "Password reset successful"
+msgstr "Password reset successful"
+
+#: user/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+
+#: user/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "You're receiving this e-mail because you requested a password reset"
+
+#: user/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "for your user account at %(site_name)s"
+
+#: user/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Please go to the following page and choose a new password:"
+
+#: user/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Your username, in case you've forgotten:"
+
+#: user/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Thanks for using our site!"
+
+#: user/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "The %(site_name)s team"
+
+#: user/templates/registration/password_reset_form.html:22
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+
+#: user/templates/registration/password_reset_form.html:27
+msgid "Adresse émail"
+msgstr "Email address"
+
+#: user/templates/registration/password_reset_form.html:32
+msgid "Reset my password"
+msgstr "Reset my password"
+
+#: user/templates/registration/registration_active.html:5
+#: user/templates/registration/registration_active.html:7
+msgid "Activate the account"
+msgstr "Activate the account"
+
+#: user/templates/registration/registration_active.html:9
+msgid ""
+"Vous avez bien activé votre compte, vous pouvez accedez à votre espace "
+"personnel."
+msgstr "You have activated your account, you can access your personnal space"
+
+#: user/templates/registration/registration_active.html:10
+msgid "retourner à la page de connexion"
+msgstr "Back to the login page"
+
+#: user/templates/registration/registration_complete.html:6
+#: user/templates/registration/registration_form.html:11
+msgid "Sign up"
+msgstr "Sign up"
+
+#: user/templates/registration/registration_complete.html:10
+msgid ""
+"We've e-mailed you instructions for activate your account to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"We've e-mailed you instructions for activate your account to the e-mail "
+"address you submitted. You should be receiving it shortly."
Binary file src/ldt/ldt/locale/fr/LC_MESSAGES/django.mo has changed
--- a/src/ldt/ldt/locale/fr/LC_MESSAGES/django.po	Fri May 25 17:47:20 2012 +0200
+++ b/src/ldt/ldt/locale/fr/LC_MESSAGES/django.po	Fri May 25 17:50:54 2012 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-03-13 12:32+0100\n"
+"POT-Creation-Date: 2012-04-27 19:39+0200\n"
 "PO-Revision-Date: 2010-03-09 15:52+0100\n"
 "Last-Translator: Yves-Marie Haussonne <ymh.work@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,8 +24,7 @@
 msgid "Time"
 msgstr "Heure"
 
-#: ldt_utils/forms.py:32
-#: ldt_utils/templates/front/front_base.html:52
+#: ldt_utils/forms.py:32 ldt_utils/templates/front/front_base.html:52
 #: ldt_utils/templates/ldt/ldt_utils/published_projects.html:53
 msgid "Search"
 msgstr "Recherche"
@@ -34,8 +33,7 @@
 msgid "all"
 msgstr "tous"
 
-#: ldt_utils/forms.py:33
-#: ldt_utils/models.py:54
+#: ldt_utils/forms.py:33 ldt_utils/models.py:54
 #: ldt_utils/templates/ldt/ldt_utils/content_list.html:69
 msgid "title"
 msgstr "titre"
@@ -60,8 +58,7 @@
 msgid "Content Tag"
 msgstr "Catégorie de contenu"
 
-#: ldt_utils/forms.py:52
-#: ldt_utils/models.py:132
+#: ldt_utils/forms.py:52 ldt_utils/models.py:132
 msgid "content.content_creation_date"
 msgstr "Date de création du contenu"
 
@@ -205,8 +202,7 @@
 msgid "changed by"
 msgstr "modifié par"
 
-#: ldt_utils/utils.py:208
-#: ldt_utils/utils.py:390
+#: ldt_utils/utils.py:208 ldt_utils/utils.py:390
 msgid "Personal cutting"
 msgstr "Découpages personnels"
 
@@ -292,8 +288,7 @@
 
 #: ldt_utils/templates/front/front_base.html:69
 #: templates/cms/admin/cms/page/change_form.html:11
-#: templates/ldt/ldt_base.html:97
-#: user/templates/ldt/user/login_form.html:34
+#: templates/ldt/ldt_base.html:97 user/templates/ldt/user/login_form.html:34
 msgid "Log out"
 msgstr "Déconnexion"
 
@@ -372,7 +367,7 @@
 msgstr[0] "%(nb)s utilisateur dans ce groupe"
 msgstr[1] "%(nb)s utilisateurs dans ce groupe"
 
-#: ldt_utils/templates/front/front_player.html:96
+#: ldt_utils/templates/front/front_player.html:101
 msgid "All annotations on the media"
 msgstr "Toutes les annotations sur le média"
 
@@ -393,7 +388,9 @@
 msgid ""
 " No results for <b>%(search)s</b> with the medias tagged <span class=\"pink"
 "\">%(tag_label)s</span>"
-msgstr "Aucun résultat pour <b>%(search)s</b> avec les médias taggués <span class=\"pink\">%(tag_label)s</span>"
+msgstr ""
+"Aucun résultat pour <b>%(search)s</b> avec les médias taggués <span class="
+"\"pink\">%(tag_label)s</span>"
 
 #: ldt_utils/templates/front/front_search_results.html:55
 msgid "See for all medias"
@@ -519,7 +516,8 @@
 msgid ""
 "The operation could not be performed because one or more error(s) occurred."
 "<br />Please resubmit the media form after making the following changes:"
-msgstr "opération impossible à cause d'une ou plusieurs erreurs.<br />Veuillez "
+msgstr ""
+"opération impossible à cause d'une ou plusieurs erreurs.<br />Veuillez "
 "resoumettre le formulaire media après avoir fait les changements suivants:"
 
 #: ldt_utils/templates/ldt/ldt_utils/create_content.html:84
@@ -684,7 +682,8 @@
 msgid ""
 "Your current work is modified. Click Cancel and save it one last time before "
 "leaving. Click OK to leave without saving."
-msgstr "Vous avez un travail en cours. Cliquez sur Annuler et sauvegardez votre "
+msgstr ""
+"Vous avez un travail en cours. Cliquez sur Annuler et sauvegardez votre "
 "travail une dernière fois. Cliquez sur OK pour quitter sans sauvegarder."
 
 #: ldt_utils/templates/ldt/ldt_utils/ldt_list.html:78
@@ -887,3 +886,679 @@
 msgid "confirm delete content"
 msgstr "Confirmation effacement contenu"
 
+#: ldt_utils/views/content.py:321
+#, python-format
+msgid ""
+"Content '%(title)s' is referenced by this project : %(project_titles)s. "
+"Please delete it beforehand."
+msgid_plural ""
+"Content '%(title)s' is referenced by %(count)d projects: %(project_titles)s. "
+"Please delete them beforehand."
+msgstr[0] ""
+"Le contenu '%(title)s' est référencé par le projet '%(project_titles)s'."
+"Veuillez l'effacer préalablement."
+msgstr[1] ""
+"Le contenu '%(title)s' est référencé par les projets suivants : '%"
+"(project_titles)s'.Veuillez les effacer préalablement."
+
+#: ldt_utils/views/json.py:34 ldt_utils/views/rdf.py:15
+#: ldt_utils/views/workspace.py:108
+msgid "You can not access this project"
+msgstr "vous n'avez pas l'autorisation d'accéder à ce projet"
+
+#: ldt_utils/views/project.py:110
+#, python-format
+msgid "the project %(title)s is published. please unpublish before deleting."
+msgstr "Le projet %(title)s est publié. Déplublier le avant de l'effacer."
+
+#: ldt_utils/views/project.py:111 ldt_utils/views/project.py:115
+msgid "can not delete the project. Please correct the following error"
+msgstr ""
+"Le projet ne peut pas être effacé. Veuillez corriger les erreurs suivantes."
+
+#: ldt_utils/views/project.py:112 ldt_utils/views/project.py:116
+msgid "title error deleting project"
+msgstr "Erreur lors de l'effacement du projet"
+
+#: ldt_utils/views/project.py:114
+#, python-format
+msgid ""
+"the project %(title)s is the front project of %(content)s. please delete "
+"this content first."
+msgstr ""
+"Le projet %(title)s est référencé par le contenu '%(content)s'.Veuillez "
+"l'effacer préalablement."
+
+#: ldt_utils/views/project.py:118
+#, python-format
+msgid "please confirm deleting project %(title)s"
+msgstr "Veuillez confirmer l'effacement du contenu %(title)s"
+
+#: ldt_utils/views/project.py:119
+msgid "confirm deletion"
+msgstr "Confirmation d'effacement"
+
+#: templates/admin/cms_change_form.html:30
+msgid "Approve page deletion"
+msgstr "Accepter l'effacement de la page"
+
+#: templates/admin/cms_change_form.html:36
+#, python-format
+msgid "(requires approvement at %(moderation_level)s level)"
+msgstr "(Demande l'approbation au niveau %(moderation_level)s)"
+
+#: templates/admin/cms_change_form.html:37
+msgid "(you can perform actions on this page directly)"
+msgstr "(Vous pouvez agir sur cette page directement)"
+
+#: templates/admin/cms_change_form.html:50
+msgid "Remove delete request"
+msgstr "Effacer la requête d'affacement"
+
+#: templates/admin/cms_change_form.html:52
+msgid "Approve delete"
+msgstr "Accepter l'effacement"
+
+#: templates/admin/cms_change_form.html:52
+msgid "Approve"
+msgstr "Accepter"
+
+#: templates/admin/cms_change_form.html:52
+#: templates/admin/cms_change_form.html:53
+msgid "draft"
+msgstr "brouillon"
+
+#: templates/admin/cms_change_form.html:53
+msgid "Preview"
+msgstr "Aperçu"
+
+#: templates/admin/cms_change_form.html:56
+#: templates/admin/page_change_form.html:27
+msgid "History"
+msgstr "Historique"
+
+#: templates/admin/cms_change_form.html:57
+#: templates/admin/page_change_form.html:28
+msgid "View on site"
+msgstr "Voir sur le site"
+
+#: templates/admin/cms_change_form.html:87
+#: templates/admin/page_change_form.html:38
+#: templates/admin/page_change_list.html:54
+#: templates/cms/admin/cms/page/change_form.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Veuillez corriger l'erreur ci-dessous"
+msgstr[1] "Veuillez corriger les erreurs ci-dessous"
+
+#: templates/admin/cms_change_form.html:107
+msgid "All permissions"
+msgstr "Toutes les permissions"
+
+#: templates/admin/cms_change_form.html:108
+#: templates/admin/cms_change_form.html:120
+msgid "Loading..."
+msgstr "Chargement..."
+
+#: templates/admin/cms_change_form.html:119
+msgid "Page states"
+msgstr "Etat de la page"
+
+#: templates/admin/cms_change_form.html:142
+#, python-format
+msgid ""
+"This page must be moderated at level %(moderation_level)s, post a message "
+"for moderator."
+msgstr ""
+"Le niveau nécessaire pour modérer cette page est le niveau %"
+"(moderation_level)s, laisser un message pour le modérateur"
+
+#: templates/admin/cms_change_form.html:144
+msgid "Request approvemet"
+msgstr "Demander l'approbation"
+
+#: templates/admin/cms_change_form.html:234
+#: user/templates/registration/registration_form.html:16
+msgid "Save"
+msgstr "Enregistrer"
+
+#: templates/admin/cms_change_form.html:235
+msgid "Save and continue editing"
+msgstr "Sauver et continuer l'édition"
+
+#: templates/admin/cms_change_list.html:51
+msgid "Successfully moved"
+msgstr "Déplacement réussi"
+
+#: templates/admin/cms_change_list.html:76
+#, python-format
+msgid "Recover deleted %(name)s"
+msgstr "Récupérer %(name)s effacé"
+
+#: templates/admin/cms_change_list.html:79
+#: templates/admin/page_change_list.html:46
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ajouter %(name)s"
+
+#: templates/admin/cms_change_list.html:91
+msgid "Pages on:"
+msgstr "Pages sur :"
+
+#: templates/admin/cms_change_list.html:108
+msgid "on"
+msgstr "on"
+
+#: templates/admin/cms_change_list.html:108
+msgid "off"
+msgstr "off"
+
+#: templates/admin/cms_change_list.html:110
+#: templates/admin/page_change_list.html:65
+msgid "Filter"
+msgstr "Filtre"
+
+#: templates/admin/index.html:18 templates/admin/page_index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Le modèle disponible dans l'application %(name)s."
+
+#: templates/admin/index.html:19 templates/admin/page_app_index.html:10
+#: templates/admin/page_index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: templates/admin/index.html:29 templates/admin/page_change_form.html:20
+#: templates/admin/page_index.html:29
+msgid "Add"
+msgstr "Ajouter"
+
+#: templates/admin/index.html:35 templates/admin/page_index.html:35
+msgid "Change"
+msgstr "modifié par"
+
+#: templates/admin/index.html:64 templates/admin/page_index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Vous n'avez pas l'autorisation d'édition."
+
+#: templates/admin/index.html:72 templates/admin/page_index.html:53
+msgid "Recent Actions"
+msgstr "Actions récentes"
+
+#: templates/admin/index.html:73 templates/admin/page_index.html:54
+msgid "My Actions"
+msgstr "Mes actions"
+
+#: templates/admin/index.html:77 templates/admin/page_index.html:58
+msgid "None available"
+msgstr "Aucune disponible"
+
+#: templates/admin/index.html:91 templates/admin/page_index.html:72
+msgid "Unknown content"
+msgstr "Contenu inconnu"
+
+#: templates/admin/page_base.html:20 templates/admin/page_index.html:11
+msgid "Pages"
+msgstr "Pages"
+
+#: templates/admin/page_base_site.html:7
+msgid "Django administration"
+msgstr "Administration de Django"
+
+#: templates/admin/page_login.html:8
+msgid "Connexion"
+msgstr "Connexion"
+
+#: templates/admin/page_login.html:20
+msgid "Username:"
+msgstr "Nom de utilisateur :"
+
+#: templates/admin/page_login.html:24
+msgid "Password:"
+msgstr "Mot de passe :"
+
+#: templates/admin/page_login.html:29
+#: user/templates/registration/login.html:39
+msgid "Create an account"
+msgstr "Créer un compte"
+
+#: templates/admin/page_login.html:30
+#: user/templates/registration/login.html:40
+msgid "Forget password?"
+msgstr "mot de pass oublié ?"
+
+#: templates/cms/admin/cms/page/change_form.html:11
+msgid "Documentation"
+msgstr "Documentation"
+
+#: templates/cms/admin/cms/page/change_form.html:11
+msgid "Change password"
+msgstr "Modifier le mot de passe"
+
+#: templates/cms/admin/cms/page/change_form.html:42
+msgid "Ordering"
+msgstr "Ordre"
+
+#: templates/cms/admin/cms/page/change_form.html:45
+msgid "Order:"
+msgstr "Ordre :"
+
+#: templates/ldt/ldt_base.html:86
+msgid "header_title"
+msgstr "Plateforme&nbsp;Ldt"
+
+#: templates/ldt/ldt_base.html:90
+msgid "Link to admin"
+msgstr "Administration"
+
+#: templates/ldt/ldt_base.html:90
+msgid "Staff"
+msgstr "admin"
+
+#: templates/ldt/ldt_base.html:93
+msgid "front link"
+msgstr "front"
+
+#: templates/ldt/ldt_base.html:94
+#: user/templates/ldt/user/change_profile.html:95
+msgid "Profile change"
+msgstr "Modification du profil"
+
+#: templates/ldt/ldt_base.html:114 templates/ldt/ldt_base.html.py:115
+msgid "home"
+msgstr "accueil"
+
+#: templates/ldt/ldt_base.html:148
+msgid "Version number"
+msgstr "Numéro de version"
+
+#: templates/ldt/ldt_base.html:148
+#, python-format
+msgid " web %(WEB_VERSION)s | platform %(VERSION)s"
+msgstr "web v%(WEB_VERSION)s | platform v%(VERSION)s "
+
+#: templates/ldt/ldt_raw_base.html:14
+msgid "page_title"
+msgstr "Plateforme Ldt"
+
+#: text/models.py:17
+msgid "annotation.external_id"
+msgstr "id externe"
+
+#: text/models.py:18
+msgid "annotation.uri"
+msgstr "uri"
+
+#: text/models.py:19
+msgid "annotation.tags"
+msgstr "tags"
+
+#: text/models.py:20
+msgid "annotation.title"
+msgstr "titre"
+
+#: text/models.py:21
+msgid "annotation.description"
+msgstr "description"
+
+#: text/models.py:22
+msgid "annotation.text"
+msgstr "texte d'annotation"
+
+#: text/models.py:23
+msgid "annotation.color"
+msgstr "couleur d'annotation"
+
+#: text/models.py:24
+msgid "creator.title"
+msgstr "titre"
+
+#: text/models.py:25
+msgid "contributor.title"
+msgstr "titre"
+
+#: text/models.py:26
+msgid "annotation.creation_date"
+msgstr "date de création"
+
+#: text/models.py:27
+msgid "annotation.update_date"
+msgstr "Date de maj"
+
+#: user/admin.py:27
+msgid "User details"
+msgstr "Détail utilisateur"
+
+#: user/admin.py:28
+msgid "Groups"
+msgstr "Groupes"
+
+#: user/admin.py:29
+msgid "Permissions"
+msgstr "Permissions"
+
+#: user/admin.py:40 user/templates/ldt/user/change_profile.html:105
+#: user/templates/ldt/user/login_form.html:61
+msgid "Password"
+msgstr "Mot de passe"
+
+#: user/forms.py:27 user/templates/ldt/user/change_password.html:40
+#: user/templates/ldt/user/change_profile.html:118
+msgid "New password"
+msgstr "Nouveau mot de passe"
+
+#: user/forms.py:29 user/templates/ldt/user/change_password.html:50
+#: user/templates/ldt/user/change_profile.html:131
+msgid "New password confirmation"
+msgstr "Confirmation du nouveau mot de passe"
+
+#: user/forms.py:58 user/forms.py:59
+msgid "E-mail"
+msgstr "E-mail"
+
+#: user/forms.py:70
+msgid "The two emails didn't match."
+msgstr "les deux emails ne correspondent pas"
+
+#: user/forms.py:81 user/templates/ldt/user/change_profile.html:54
+msgid "First name"
+msgstr "Prénom"
+
+#: user/forms.py:82
+msgid "Last name"
+msgstr "Nom"
+
+#: user/forms.py:109 user/templates/ldt/user/change_profile.html:83
+msgid "Language"
+msgstr "Langue"
+
+#: user/forms.py:123
+msgid "Profile picture"
+msgstr "Image de profil"
+
+#: user/forms.py:133
+#, python-format
+msgid "Image size is limited to %s"
+msgstr "La taille de l'image est limitée à %s"
+
+#: user/views.py:28
+msgid "Your profile has been updated."
+msgstr "Votre profil a été modifié"
+
+#: user/views.py:52
+msgid "Your password has been updated."
+msgstr "Votre mot de passe a été changeé."
+
+#: user/views.py:76
+msgid "Your profile picture has been updated."
+msgstr "Votre image de profil a été modifiée"
+
+#: user/views.py:98 user/templates/registration/login.html:24
+msgid "Sorry, that's not a valid username or password."
+msgstr "Saisissez un nom d'utilisateur et un mot de passe valide."
+
+#: user/templates/ldt/user/change_password.html:31
+msgid "Old password"
+msgstr "Ancien mot de passe"
+
+#: user/templates/ldt/user/change_password.html:44
+msgid "passwords don't match"
+msgstr "les mots de passe ne correspondent pas"
+
+#: user/templates/ldt/user/change_password.html:57
+#: user/templates/ldt/user/change_profile.html:144
+#: user/templates/registration/password_change_form.html:14
+#: user/templates/registration/password_change_form.html:17
+msgid "Password change"
+msgstr "Modification du mot de passe"
+
+#: user/templates/ldt/user/change_password.html:61
+msgid "Your new password has been saved."
+msgstr "Votre mot de passe a été changé."
+
+#: user/templates/ldt/user/change_profile.html:19
+msgid "Invalid extension ! Your file has to be JPG, JPEG or PNG."
+msgstr "extension invalide ! votre fichier doit être JPG, JPEG ou PNG"
+
+#: user/templates/ldt/user/change_profile.html:43
+msgid "Username"
+msgstr "Nom"
+
+#: user/templates/ldt/user/change_profile.html:70
+msgid "Email"
+msgstr "E-mail"
+
+#: user/templates/ldt/user/change_profile.html:175
+msgid "Profile picture change"
+msgstr "Modification de l'image de profil"
+
+#: user/templates/ldt/user/login_form.html:32
+#: user/templates/registration/password_change_done.html:7
+#: user/templates/registration/password_change_form.html:13
+msgid "Profiles"
+msgstr "Les profils"
+
+#: user/templates/ldt/user/login_form.html:50
+msgid "create account"
+msgstr "Créer un compte"
+
+#: user/templates/ldt/user/login_form.html:54
+msgid "Pseudo"
+msgstr "Pseudo"
+
+#: user/templates/ldt/user/login_form.html:57
+#: user/templates/ldt/user/login_form.html:64
+msgid "this field is compulsory"
+msgstr "Ce champs est obligatoire"
+
+#: user/templates/ldt/user/login_form.html:68
+msgid "reset password"
+msgstr "Réinitialiser le mot de passe"
+
+#: user/templates/ldt/user/login_form.html:71
+msgid "Connection"
+msgstr "Connexion"
+
+#: user/templates/registration/activate.html:6
+#: user/templates/registration/activate.html:9
+msgid "Activate account"
+msgstr "Activer le compte"
+
+#: user/templates/registration/activate.html:12
+msgid "You have activated your account"
+msgstr "Vous avez bien activé votre compte."
+
+#: user/templates/registration/activate.html:13
+msgid "Go back to login page"
+msgstr "Retourner à la page de connexion"
+
+#: user/templates/registration/activation_complete.html:4
+#: user/templates/registration/registration_complete.html:8
+msgid "Sign up successfully"
+msgstr "Création de compte avec succès"
+
+#: user/templates/registration/activation_complete.html:6
+msgid "activation completed"
+msgstr "Activation terminée"
+
+#: user/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Merci de votre visite."
+
+#: user/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Se reconnecter"
+
+#: user/templates/registration/login.html:46
+msgid "login"
+msgstr "Connexion"
+
+#: user/templates/registration/password_change_done.html:3
+#: user/templates/registration/password_change_done.html:11
+msgid "password change successful"
+msgstr "Changement de mot de passe réussi"
+
+#: user/templates/registration/password_change_done.html:8
+msgid "password change"
+msgstr "Changement de mot de passe"
+
+#: user/templates/registration/password_change_done.html:14
+msgid "Your password has been changed."
+msgstr "Votre mot de passe a été changé."
+
+#: user/templates/registration/password_change_done.html:15
+msgid "Go back to profiles"
+msgstr "Retourner à la page de mon profil"
+
+#: user/templates/registration/password_change_form.html:20
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Par sécurité, veuillez enter votre ancien mot de passe puis le nouveau a "
+"deux reprise afin de savoir si vous l'avez taper correctement "
+
+#: user/templates/registration/password_change_form.html:26
+msgid "Old password:"
+msgstr "Ancien mot de passe :"
+
+#: user/templates/registration/password_change_form.html:32
+#: user/templates/registration/password_reset_confirm.html:19
+msgid "New password:"
+msgstr "Nouveau mot de passe :"
+
+#: user/templates/registration/password_change_form.html:38
+#: user/templates/registration/password_reset_confirm.html:21
+msgid "Confirm password:"
+msgstr "Confirmer le mot de passe :"
+
+#: user/templates/registration/password_change_form.html:44
+#: user/templates/registration/password_reset_confirm.html:22
+msgid "Change my password"
+msgstr "Modifier mon mot de passe"
+
+#: user/templates/registration/password_reset_complete.html:6
+#: user/templates/registration/password_reset_confirm.html:6
+#: user/templates/registration/password_reset_confirm.html:9
+#: user/templates/registration/password_reset_done.html:6
+#: user/templates/registration/password_reset_form.html:13
+#: user/templates/registration/password_reset_form.html:15
+#: user/templates/registration/password_reset_form.html:18
+msgid "Password reset"
+msgstr "Réinitialiser le mot de passe"
+
+#: user/templates/registration/password_reset_complete.html:9
+msgid "Password reset complete"
+msgstr "Réinitialisation du mot de passe terminée"
+
+#: user/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Votre mot de passe a été défini. vous pouvez vous connecter maintenant."
+
+#: user/templates/registration/password_reset_confirm.html:15
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"veuillez enter votre nouveau mot de pass deux fois afin de le vérifier."
+
+#: user/templates/registration/password_reset_confirm.html:27
+msgid "Password reset unsuccessful"
+msgstr "Reinitialisation du mot de pass a échoué"
+
+#: user/templates/registration/password_reset_confirm.html:29
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Le lien de réinitialisation du mot de passe n'est pas valide, certainement "
+"car il a déjà été utilisé. veuiller demander une nouvelle réinitialisation."
+
+#: user/templates/registration/password_reset_done.html:8
+msgid "Password reset successful"
+msgstr "Réinitialisation du mot de passe réussie"
+
+#: user/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Nous vous avons envoyer les instructions de reinitialisation de votre mot de "
+"passe à l'adresse email que vous nous avez fournie. vous devriez les "
+"recevoir bientôt."
+
+#: user/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Vous recevez ce mail car vous avez demander la réinitialisation du mot de "
+"passe"
+
+#: user/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "Pour votre compte sur le site %(site_name)s"
+
+#: user/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+"veuillez aller à la page suivante et choisissez un nouveau mot de passe :"
+
+#: user/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Pour rappel votre nom d'autilisateur :"
+
+#: user/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Merci de votre visite."
+
+#: user/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "L'équipe du site %(site_name)s"
+
+#: user/templates/registration/password_reset_form.html:22
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Mot de passe oublié ? Entrez votre adresse email ci-dessous pour recevoir "
+"les instructions pour en entrer un nouveau."
+
+#: user/templates/registration/password_reset_form.html:27
+msgid "Adresse émail"
+msgstr "Adresse émail"
+
+#: user/templates/registration/password_reset_form.html:32
+msgid "Reset my password"
+msgstr "Reinitialiser mon mot de passe"
+
+#: user/templates/registration/registration_active.html:5
+#: user/templates/registration/registration_active.html:7
+msgid "Activate the account"
+msgstr "Activer le compte"
+
+#: user/templates/registration/registration_active.html:9
+msgid ""
+"Vous avez bien activé votre compte, vous pouvez accedez à votre espace "
+"personnel."
+msgstr ""
+"Vous avez bien activé votre compte, vous pouvez accedez à votre espace "
+"personnel."
+
+#: user/templates/registration/registration_active.html:10
+msgid "retourner à la page de connexion"
+msgstr "retourner à la page de connexion"
+
+#: user/templates/registration/registration_complete.html:6
+#: user/templates/registration/registration_form.html:11
+msgid "Sign up"
+msgstr "Création d'un compte"
+
+#: user/templates/registration/registration_complete.html:10
+msgid ""
+"We've e-mailed you instructions for activate your account to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Nous vous avons envoyé par courriel les instructions pour activer le compte "
+"à l'adresse que vous avez indiquée. Vous devriez le recevoir rapidement."
Binary file src/ldt/ldt/static/ldt/img/icon-no.gif has changed
Binary file src/ldt/ldt/static/ldt/img/icon-yes.gif has changed
--- a/src/ldt/setup.py	Fri May 25 17:47:20 2012 +0200
+++ b/src/ldt/setup.py	Fri May 25 17:50:54 2012 +0200
@@ -4,6 +4,7 @@
 from distutils.command.install import INSTALL_SCHEMES
 import sys
 
+
 class osx_install_data(install_data):
     # On MacOS, the platform-specific lib dir is /System/Library/Framework/Python/.../
     # which is wrong. Python 2.5 supplied with MacOS 10.5 has an Apple-specific fix
@@ -17,25 +18,6 @@
         self.set_undefined_options('install', ('install_lib', 'install_dir'))
         install_data.finalize_options(self)
 
-if sys.platform == "darwin": 
-    cmdclasses = {'install_data': osx_install_data} 
-else: 
-    cmdclasses = {'install_data': install_data} 
-
-
-root_dir = os.path.dirname(__file__)
-if root_dir != '':
-    os.chdir(root_dir)
-source_dir = 'ldt'
-
-version_variables = {}
-try:
-    execfile(os.path.join(source_dir, "__init__.py"), version_variables)
-except:
-    pass
-
-version = version_variables['__version__']
-
 def fullsplit(path, result=None):
     """
     Split a pathname into components (the opposite of os.path.join) in a
@@ -50,64 +32,94 @@
         return result
     return fullsplit(head, [tail] + result)
 
-packages, data_files = [], []
 
-
-for dirpath, dirnames, filenames in os.walk(source_dir):
-    # Ignore dirnames that start with '.'
-    for i, dirname in enumerate(dirnames):
-        if dirname.startswith('.'): del dirnames[i]
-    if '__init__.py' in filenames:
-        packages.append('.'.join(fullsplit(dirpath)))
-    elif filenames:
-        data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])
+def launch_setup(script_name, script_args):
+    if sys.platform == "darwin": 
+        cmdclasses = {'install_data': osx_install_data} 
+    else: 
+        cmdclasses = {'install_data': install_data} 
+    
+    
+    root_dir = os.path.dirname(__file__)
+    if root_dir != '':
+        os.chdir(root_dir)
+    source_dir = 'ldt'
+    
+    version_variables = {}
+    try:
+        execfile(os.path.join(source_dir, "__init__.py"), version_variables)
+    except:
+        pass
+    
+    version = version_variables['__version__']
+    
+    packages, data_files = [], []
+    
+    
+    for dirpath, dirnames, filenames in os.walk(source_dir):
+        # Ignore dirnames that start with '.'
+        for i, dirname in enumerate(dirnames):
+            if dirname.startswith('.'): del dirnames[i]
+        if '__init__.py' in filenames:
+            packages.append('.'.join(fullsplit(dirpath)))
+        elif filenames:
+            data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])
+    
+    
+    # Tell distutils to put the data_files in platform-specific installation
+    # locations. See here for an explanation:
+    # http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb
+    for scheme in INSTALL_SCHEMES.values():
+        scheme['data'] = scheme['purelib']
+    
+    # Small hack for working with bdist_wininst.
+    # See http://mail.python.org/pipermail/distutils-sig/2004-August/004134.html
+    if len(sys.argv) > 1 and sys.argv[1] == 'bdist_wininst':
+        for file_info in data_files:
+            file_info[0] = '\\PURELIB\\%s' % file_info[0]
+    
+    #write MANIFEST.in
+    
+    with open("MANIFEST.in", "w") as m:    
+        m.write("include CHANGES\n")
+        m.write("include LICENSE\n")
+        m.write("include README\n")
+        m.write("include MANIFEST.in\n")
+        for entry in data_files:
+            file_list = entry[1]
+            for filename in file_list:
+                m.write("include %s\n" % (filename))
+    
+    setup(
+        script_name = script_name,
+        script_args = script_args,
+        name='ldt',
+        version=version,
+        author='IRI',
+        author_email='contact@iri.centrepompidou.fr',
+        packages=packages,
+        data_files=data_files,
+        cmdclass = cmdclasses,
+        scripts=[],
+        url='http://www.iri.centrepompidou.fr/dev/hg/platform',
+        license='LICENSE.txt',
+        description='Platform ldt',
+        long_description=open('README').read(),
+        classifiers=['Development Status :: 5 - Production/Stable',
+                       'Environment :: Web Environment',
+                       'Framework :: Django',
+                       'Intended Audience :: Developers',
+                       'License :: Ceccil-C',
+                       'Operating System :: OS Independent',
+                       'Programming Language :: Python',
+                       'Topic :: Utilities',
+        ],
+    )
 
 
-# Tell distutils to put the data_files in platform-specific installation
-# locations. See here for an explanation:
-# http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb
-for scheme in INSTALL_SCHEMES.values():
-    scheme['data'] = scheme['purelib']
-
-# Small hack for working with bdist_wininst.
-# See http://mail.python.org/pipermail/distutils-sig/2004-August/004134.html
-if len(sys.argv) > 1 and sys.argv[1] == 'bdist_wininst':
-    for file_info in data_files:
-        file_info[0] = '\\PURELIB\\%s' % file_info[0]
-
-#write MANIFEST.in
-
-with open("MANIFEST.in", "w") as m:    
-    m.write("include CHANGES\n")
-    m.write("include LICENSE\n")
-    m.write("include README\n")
-    m.write("include MANIFEST.in\n")
-    for entry in data_files:
-        file_list = entry[1]
-        for filename in file_list:
-            m.write("include %s\n" % (filename))
-
-
-setup(
-    name='ldt',
-    version=version,
-    author='IRI',
-    author_email='contact@iri.centrepompidou.fr',
-    packages=packages,
-    data_files=data_files,
-    cmdclass = cmdclasses,
-    scripts=[],
-    url='http://www.iri.centrepompidou.fr/dev/hg/platform',
-    license='LICENSE.txt',
-    description='Platform ldt',
-    long_description=open('README').read(),
-    classifiers=['Development Status :: 5 - Production/Stable',
-                   'Environment :: Web Environment',
-                   'Framework :: Django',
-                   'Intended Audience :: Developers',
-                   'License :: Ceccil-C',
-                   'Operating System :: OS Independent',
-                   'Programming Language :: Python',
-                   'Topic :: Utilities',
-    ],
-)
+if __name__ == "__main__":
+    
+    script_name = os.path.basename(sys.argv[0])
+    script_args = sys.argv[1:]
+    
+    launch_setup(script_name, script_args)
\ No newline at end of file
--- a/virtualenv/res/lib/lib_create_env.py	Fri May 25 17:47:20 2012 +0200
+++ b/virtualenv/res/lib/lib_create_env.py	Fri May 25 17:50:54 2012 +0200
@@ -15,7 +15,7 @@
 URLS = {
     #'': {'setup': '', 'url':'', 'local':''},
     'DISTRIBUTE': {'setup': 'distribute', 'url':'http://pypi.python.org/packages/source/d/distribute/distribute-0.6.14.tar.gz', 'local':"distribute-0.6.14.tar.gz"},
-    'DJANGO': {'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.3.1/tarball/', 'local':"Django-1.3.1.tar.gz"},
+    'DJANGO': {'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.4/tarball/', 'local':"Django-1.4.tar.gz"},
     'DJANGO-EXTENSIONS': { 'setup': 'django-extensions', 'url':'https://github.com/django-extensions/django-extensions/tarball/0.6', 'local':"django-extensions-0.6.tar.gz"},
     'DJANGO-REGISTRATION': { 'setup': 'django-registration', 'url':'http://bitbucket.org/ubernostrum/django-registration/get/tip.tar.gz', 'local':"django-registration.tar.gz"},
     'DJANGO-TAGGING': { 'setup': 'django-tagging', 'url':'http://django-tagging.googlecode.com/files/django-tagging-0.3.1.tar.gz', 'local':"django-tagging-0.3.1.tar.gz"},
@@ -32,6 +32,12 @@
     'SORL_THUMBNAIL' : { 'setup': 'sorl-thumbnail', 'url':'http://pypi.python.org/packages/source/s/sorl-thumbnail/sorl-thumbnail-11.12.tar.gz', 'local':"sorl-thumbnail-v10.12.1.tar.gz"},
     'LIBJPEG': {'setup': None, 'url':'jpegsrc.v8d.tar.gz', 'local':'jpegsrc.v8d.tar.gz'},
     'ZLIB': {'setup': None, 'url':'zlib-1.2.6.tar.gz', 'local':'zlib-1.2.6.tar.gz'},
+    'PYCRYPTO': {'setup': 'pycrypto', 'url':'https://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz', 'local':'pycrypto-2.6.tar.gz'},
+    'SSH': {'setup': 'ssh', 'url':'http://pypi.python.org/packages/source/s/ssh/ssh-1.7.13.tar.gz#md5=26800ef2c1ee3f185f48fd05258302f4', 'local':'ssh-1.7.13.tar.gz'},
+    'FABRIC': {'setup': 'fabric', 'url':'https://github.com/fabric/fabric/tarball/1.4.1', 'local':'fabric-1.4.1.tar.gz'},
+    'MERCURIAL': {'setup': 'mercurial', 'url':'http://mercurial.selenic.com/release/mercurial-2.2.1.tar.gz', 'local':'mercurial-2.2.1.tar.gz'},
+    'MEMCHACHED': {'setup': 'python-memcached', 'url':'http://ftp.tummy.com/pub/python-memcached/old-releases/python-memcached-1.48.tar.gz', 'local':'python-memcached-1.48.tar.gz'},
+    'UWSGI': {'setup': 'uwsgi', 'url': 'http://projects.unbit.it/downloads/uwsgi-1.2.3.tar.gz', 'local':'uwsgi-1.2.3.tar.gz'}
 }
 
 if system_str == 'Windows':
Binary file virtualenv/res/src/Django-1.3.1.tar.gz has changed
Binary file virtualenv/res/src/Django-1.4.tar.gz has changed
Binary file virtualenv/res/src/fabric-1.4.1.tar.gz has changed
Binary file virtualenv/res/src/mercurial-2.2.1.tar.gz has changed
Binary file virtualenv/res/src/python-memcached-1.48.tar.gz has changed
Binary file virtualenv/res/src/ssh-1.7.13.tar.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/virtualenv/sync/create_python_env.py	Fri May 25 17:50:54 2012 +0200
@@ -0,0 +1,64 @@
+"""
+Call this like ``python create_python_env.py``; it will
+refresh the project-boot.py script
+
+-prerequisite:
+
+- virtualenv
+
+- python project-boot.py --unzip-setuptools --no-site-packages --clear --type-install=local <path_to_venv>
+
+"""
+
+import os
+import subprocess
+import re
+import sys
+
+
+here = os.path.dirname(os.path.abspath(__file__))
+base_dir = here
+script_name = os.path.join(base_dir, 'project-boot.py')
+
+import virtualenv
+
+# things to install
+# - psycopg2 -> pip
+# - PIL -> pip
+# - pyxml -> pip
+# - 4Suite-xml - easy_install ftp://ftp.4suite.org/pub/4Suite/4Suite-XML-1.0.2.tar.bz2
+# - pylucene  - script
+
+src_base = os.path.abspath(os.path.join(here,"..","res","src")).replace("\\","/")
+lib_path = os.path.abspath(os.path.join(here,"..","res","lib")).replace("\\","/")
+patch_path = os.path.abspath(os.path.join(here,"res","patch")).replace("\\","/")
+
+
+EXTRA_TEXT  = "import sys\n"
+EXTRA_TEXT += "sys.path.append('%s')\n" % (lib_path)
+EXTRA_TEXT += "sys.path.append('%s')\n" % (os.path.abspath(os.path.join(here,"res")).replace("\\","/"))
+EXTRA_TEXT += "from res_create_env import generate_install_methods\n"
+EXTRA_TEXT += "adjust_options, extend_parser, after_install = generate_install_methods(path_locations, '%s', Logger, call_subprocess)\n" % (src_base)
+
+
+def main():
+    python_version = ".".join(map(str,sys.version_info[0:2]))
+    text = virtualenv.create_bootstrap_script(EXTRA_TEXT, python_version=python_version)
+    if os.path.exists(script_name):
+        f = open(script_name)
+        cur_text = f.read()
+        f.close()
+    else:
+        cur_text = ''
+    print 'Updating %s' % script_name
+    if cur_text == 'text':
+        print 'No update'
+    else:
+        print 'Script changed; updating...'
+        f = open(script_name, 'w')
+        f.write(text)
+        f.close()
+
+if __name__ == '__main__':
+    main()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/virtualenv/sync/res/res_create_env.py	Fri May 25 17:50:54 2012 +0200
@@ -0,0 +1,17 @@
+import platform
+
+from lib_create_env import lib_generate_install_methods, install_pylucene, install_psycopg2
+
+system_str = platform.system()
+
+
+INSTALLS = [#(key,method, option_str, dict_extra_env)
+    ('DISTRIBUTE', 'pip', None, None),
+    ('PYCRYPTO', 'pip', None, None),
+    ('SSH', 'pip', None, None),
+    ('FABRIC', 'pip', None, None),
+    ('MERCURIAL', 'pip', None, None),
+]
+
+def generate_install_methods(path_locations, src_base, Logger, call_subprocess):    
+    return lib_generate_install_methods(path_locations, src_base, Logger, call_subprocess, INSTALLS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/virtualenv/web/res/srvr_requirements.txt	Fri May 25 17:50:54 2012 +0200
@@ -0,0 +1,2 @@
+python-memcached
+uWSGI
--- a/web/ldtplatform/__init__.py	Fri May 25 17:47:20 2012 +0200
+++ b/web/ldtplatform/__init__.py	Fri May 25 17:50:54 2012 +0200
@@ -1,4 +1,4 @@
-VERSION = (1, 6, 0, "final", 0)
+VERSION = (1, 7, 0, "final", 0)
 
 VERSION_STR = unicode(".".join(map(lambda i:"%02d" % (i,), VERSION[:2])))
 
--- a/web/ldtplatform/manage.py	Fri May 25 17:47:20 2012 +0200
+++ b/web/ldtplatform/manage.py	Fri May 25 17:50:54 2012 +0200
@@ -1,11 +1,9 @@
 #!/usr/bin/env python
-from django.core.management import execute_manager
-try:
-    import settings # Assumed to be in the same directory.
-except ImportError:
-    import sys
-    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
-    sys.exit(1)
+import os, sys
 
 if __name__ == "__main__":
-    execute_manager(settings)
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ldtplatform.settings")
+
+    from django.core.management import execute_from_command_line
+
+    execute_from_command_line(sys.argv)
\ No newline at end of file