merge
authorAdrien Di Mascio <Adrien.DiMascio@logilab.fr>
Thu, 13 Nov 2008 12:34:56 +0100
changeset 64 6dcb94dbd722
parent 63 805a9f3ac748 (diff)
parent 56 3a8576dd00d8 (current diff)
child 66 b4128cfda701
merge
doc/.static/cubicweb.png
doc/.static/logilab.png
doc/.static/sphinx-default.css
doc/.templates/layout.html
--- a/common/mixins.py	Thu Nov 13 11:38:46 2008 +0100
+++ b/common/mixins.py	Thu Nov 13 12:34:56 2008 +0100
@@ -289,8 +289,10 @@
         done = set()
     entity = view.entity(row, col)
     if entity.eid in done:
-        msg = entity.req._('loop in %s relation (%s)'
-                           % (entity.tree_attribute, entity.eid))
+        msg = entity.req._('loop in %(rel)s relation (%(eid)s)') % {
+            'rel': entity.tree_attribute,
+            'eid': entity.eid
+            }
         return None, msg
     done.add(entity.eid)
     return done, entity
--- a/devtools/devctl.py	Thu Nov 13 11:38:46 2008 +0100
+++ b/devtools/devctl.py	Thu Nov 13 12:34:56 2008 +0100
@@ -123,6 +123,7 @@
     for rschema in sorted(set(relations)):
         rtype = rschema.type
         add_msg(w, rtype)
+        done.add(rtype)
         if not (schema.rschema(rtype).is_final() or rschema.symetric):
             add_msg(w, '%s_object' % rtype)
         if rschema.description and rschema.description not in done:
@@ -211,7 +212,7 @@
         from tempfile import mktemp
         import yams
         from logilab.common.fileutils import ensure_fs_mode
-        from logilab.common.shellutils import find, rm
+        from logilab.common.shellutils import globfind, find, rm
         from cubicweb.common.i18n import extract_from_tal, execute
         tempdir = mktemp()
         mkdir(tempdir)
@@ -228,11 +229,11 @@
         tali18nfile = join(tempdir, 'tali18n.py')
         extract_from_tal(find(join(BASEDIR, 'web'), ('.py', '.pt')), tali18nfile)
         print '******** .pot files generation'
-        for id, files, lang in [('cubicweb', get_module_files(BASEDIR) + find(join(BASEDIR, 'misc', 'migration'), '.py'), None),
-                                ('schemadescr', find(join(BASEDIR, 'schemas'), '.py'), None),
+        for id, files, lang in [('pycubicweb', get_module_files(BASEDIR) + list(globfind(join(BASEDIR, 'misc', 'migration'), '*.py')), None),
+                                ('schemadescr', globfind(join(BASEDIR, 'schemas'), '*.py'), None),
                                 ('yams', get_module_files(yams.__path__[0]), None),
                                 ('tal', [tali18nfile], None),
-                                ('js', find(join(BASEDIR, 'web'), '.js'), 'java'),
+                                ('js', globfind(join(BASEDIR, 'web'), 'cub*.js'), 'java'),
                                 ]:
             cmd = 'xgettext --no-location --omit-header -k_ -o %s %s'
             if lang is not None:
@@ -309,7 +310,7 @@
         tali18nfile = join(tempdir, 'tali18n.py')
         extract_from_tal(find('.', ('.py', '.pt'), blacklist=STD_BLACKLIST+('test',)), tali18nfile)
         print '******** extract Javascript messages'
-        jsfiles =  find('.', '.js')
+        jsfiles =  [jsfile for jsfile in find('.', '.js') if basename(jsfile).startswith('cub')]
         if jsfiles:
             tmppotfile = join(tempdir, 'js.pot')
             execute('xgettext --no-location --omit-header -k_ -L java --from-code=utf-8 -o %s %s'
--- a/i18n/en.po	Thu Nov 13 11:38:46 2008 +0100
+++ b/i18n/en.po	Thu Nov 13 12:34:56 2008 +0100
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: 2.0\n"
 "POT-Creation-Date: 2006-01-12 17:35+CET\n"
-"PO-Revision-Date: 2008-02-29 09:26+0100\n"
+"PO-Revision-Date: 2008-11-13 12:32+0100\n"
 "Last-Translator: Sylvain Thenault <sylvain.thenault@logilab.fr>\n"
 "Language-Team: English <devel@logilab.fr.org>\n"
 "MIME-Version: 1.0\n"
@@ -31,10 +31,18 @@
 msgstr ""
 
 #, python-format
+msgid "%(cstr)s constraint failed for value %(value)r"
+msgstr ""
+
+#, python-format
 msgid "%(firstname)s %(surname)s"
 msgstr ""
 
 #, python-format
+msgid "%(fmt1)s, or without time: %(fmt2)s"
+msgstr ""
+
+#, python-format
 msgid "%(subject)s %(etype)s #%(eid)s (%(login)s)"
 msgstr ""
 
@@ -51,10 +59,6 @@
 msgstr ""
 
 #, python-format
-msgid "%s constraint failed for value %r"
-msgstr ""
-
-#, python-format
 msgid "%s days"
 msgstr ""
 
@@ -86,10 +90,6 @@
 msgid "%s software version of the database"
 msgstr ""
 
-#, python-format
-msgid "%s, or without time: %s"
-msgstr ""
-
 msgid "**"
 msgstr "0..n 0..n"
 
@@ -199,6 +199,12 @@
 msgid "Do you want to delete the following element(s) ?"
 msgstr ""
 
+msgid "ECache"
+msgstr ""
+
+msgid "ECache_plural"
+msgstr ""
+
 msgid "EConstraint"
 msgstr "Constraint"
 
@@ -301,6 +307,9 @@
 msgid "New Card"
 msgstr "New card"
 
+msgid "New ECache"
+msgstr ""
+
 msgid "New EConstraint"
 msgstr "New constraint"
 
@@ -437,6 +446,9 @@
 msgid "This Card"
 msgstr "This card"
 
+msgid "This ECache"
+msgstr ""
+
 msgid "This EConstraint"
 msgstr "This constraint"
 
@@ -520,10 +532,26 @@
 msgid "You are now connected to %s"
 msgstr ""
 
+msgid ""
+"You can either submit a new file using the browse button above, or choose to "
+"remove already uploaded file by checking the \"detach attached file\" check-"
+"box, or edit file content online with the widget below."
+msgstr ""
+
+msgid ""
+"You can either submit a new file using the browse button above, or edit file "
+"content online with the widget below."
+msgstr ""
+
 msgid "You can use any of the following substitutions in your text"
 msgstr ""
 
-msgid "You have no access to this view"
+msgid "You have no access to this view or it's not applyable to current data"
+msgstr ""
+
+msgid ""
+"You're not authorized to access this page. If you think you should, please "
+"contact the site administrator."
 msgstr ""
 
 #, python-format
@@ -544,6 +572,13 @@
 "reminder"
 msgstr ""
 
+msgid ""
+"a simple cache entity characterized by a name and a validity date. The "
+"target application is responsible for updating timestamp when necessary to "
+"invalidate the cache (typically in hooks). Also, checkout the AppRsetObject."
+"get_cache() method."
+msgstr ""
+
 msgid "about this site"
 msgstr ""
 
@@ -631,6 +666,12 @@
 msgid "actions_myprefs_description"
 msgstr ""
 
+msgid "actions_prefs"
+msgstr ""
+
+msgid "actions_prefs_description"
+msgstr ""
+
 msgid "actions_schema"
 msgstr "schema"
 
@@ -745,6 +786,9 @@
 msgid "add a Card"
 msgstr "add a card"
 
+msgid "add a ECache"
+msgstr ""
+
 msgid "add a EConstraint"
 msgstr "add a constraint"
 
@@ -865,6 +909,9 @@
 msgid "and linked"
 msgstr ""
 
+msgid "and/or between different values"
+msgstr ""
+
 msgid "anonymous"
 msgstr ""
 
@@ -878,7 +925,7 @@
 msgstr ""
 
 #, python-format
-msgid "at least one relation %s is required on %s(%s)"
+msgid "at least one relation %(rtype)s is required on %(etype)s (%(eid)s)"
 msgstr ""
 
 msgid "attribute"
@@ -905,6 +952,9 @@
 msgid "bookmark this page"
 msgstr ""
 
+msgid "bookmark this search"
+msgstr ""
+
 msgid "bookmarked_by"
 msgstr "bookmarked by"
 
@@ -1224,6 +1274,10 @@
 msgid "core relation indicating the type of an entity"
 msgstr ""
 
+msgid ""
+"core relation indicating the types (including specialized types) of an entity"
+msgstr ""
+
 msgid "cost"
 msgstr ""
 
@@ -1478,12 +1532,18 @@
 msgid "download"
 msgstr ""
 
+msgid "download icon"
+msgstr ""
+
 msgid "edit bookmarks"
 msgstr ""
 
 msgid "edit the index page"
 msgstr ""
 
+msgid "editable-table"
+msgstr ""
+
 msgid "edition"
 msgstr ""
 
@@ -1517,6 +1577,9 @@
 msgid "entity deleted"
 msgstr ""
 
+msgid "entity type"
+msgstr ""
+
 msgid ""
 "entity type that may be used to construct some advanced security "
 "configuration"
@@ -1557,12 +1620,42 @@
 msgid "external page"
 msgstr ""
 
+msgid "facetbox"
+msgstr ""
+
+msgid "facets_created_by-facet"
+msgstr "\"created by\" facet"
+
+msgid "facets_created_by-facet_description"
+msgstr ""
+
+msgid "facets_etype-facet"
+msgstr "\"entity type\" facet"
+
+msgid "facets_etype-facet_description"
+msgstr ""
+
+msgid "facets_has_text-facet"
+msgstr "\"has text\" facet"
+
+msgid "facets_has_text-facet_description"
+msgstr ""
+
+msgid "facets_in_group-facet"
+msgstr "\"in group\" facet"
+
+msgid "facets_in_group-facet_description"
+msgstr ""
+
+msgid "facets_in_state-facet"
+msgstr "\"in state\" facet"
+
+msgid "facets_in_state-facet_description"
+msgstr ""
+
 msgid "february"
 msgstr ""
 
-msgid "filter"
-msgstr ""
-
 msgid "final"
 msgstr ""
 
@@ -1750,7 +1843,7 @@
 msgstr ""
 
 #, python-format
-msgid "incorrect value (%r) for type \"%s\""
+msgid "incorrect value (%(value)s) for type \"%(type)s\""
 msgstr ""
 
 msgid "index"
@@ -1786,6 +1879,9 @@
 msgid "inlined"
 msgstr ""
 
+msgid "inlined view"
+msgstr ""
+
 msgid "internationalizable"
 msgstr ""
 
@@ -1821,6 +1917,12 @@
 "you are changing this!"
 msgstr ""
 
+msgid "is_instance_of"
+msgstr ""
+
+msgid "is_instance_of_object"
+msgstr ""
+
 msgid "is_object"
 msgstr "has instances"
 
@@ -1896,7 +1998,7 @@
 msgstr ""
 
 #, python-format
-msgid "loop in %s relation (%s)"
+msgid "loop in %(rel)s relation (%(eid)s)"
 msgstr ""
 
 msgid "main informations"
@@ -1960,9 +2062,15 @@
 msgid "multiple edit"
 msgstr ""
 
+msgid "my custom search"
+msgstr ""
+
 msgid "name"
 msgstr ""
 
+msgid "name of the cache"
+msgstr ""
+
 msgid ""
 "name of the main variables which should be used in the selection if "
 "necessary (comma separated)"
@@ -1998,6 +2106,9 @@
 msgid "no associated epermissions"
 msgstr ""
 
+msgid "no possible transition"
+msgstr ""
+
 msgid "no related project"
 msgstr ""
 
@@ -2163,6 +2274,9 @@
 msgid "remove this Card"
 msgstr "remove this card"
 
+msgid "remove this ECache"
+msgstr ""
+
 msgid "remove this EConstraint"
 msgstr "remove this constraint"
 
@@ -2266,6 +2380,9 @@
 msgid "search"
 msgstr ""
 
+msgid "search for association"
+msgstr ""
+
 msgid "searching for"
 msgstr ""
 
@@ -2330,6 +2447,9 @@
 msgid "show %s results"
 msgstr ""
 
+msgid "show advanced fields"
+msgstr ""
+
 msgid "show filter form"
 msgstr ""
 
@@ -2354,6 +2474,12 @@
 msgid "sorry, the server is unable to handle this query"
 msgstr ""
 
+msgid "specializes"
+msgstr ""
+
+msgid "specializes_object"
+msgstr ""
+
 msgid "startup views"
 msgstr ""
 
@@ -2373,7 +2499,7 @@
 msgstr ""
 
 #, python-format
-msgid "status will change from %s to %s"
+msgid "status will change from %(st1)s to %(st2)s"
 msgstr ""
 
 msgid "subject"
@@ -2400,6 +2526,9 @@
 msgid "table"
 msgstr ""
 
+msgid "tablefilter"
+msgstr ""
+
 msgid "task progression"
 msgstr ""
 
@@ -2437,6 +2566,9 @@
 msgid "thursday"
 msgstr ""
 
+msgid "timestamp"
+msgstr ""
+
 msgid "timestamp of the latest source synchronization."
 msgstr ""
 
@@ -2485,12 +2617,18 @@
 msgid "ui"
 msgstr ""
 
+msgid "unaccessible"
+msgstr ""
+
 msgid "unauthorized value"
 msgstr ""
 
 msgid "unique identifier used to connect to the application"
 msgstr ""
 
+msgid "unknown external entity"
+msgstr ""
+
 msgid "unknown property key"
 msgstr ""
 
--- a/i18n/fr.po	Thu Nov 13 11:38:46 2008 +0100
+++ b/i18n/fr.po	Thu Nov 13 12:34:56 2008 +0100
@@ -4,7 +4,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: cubicweb 2.46.0\n"
-"PO-Revision-Date: 2008-03-28 18:14+0100\n"
+"PO-Revision-Date: 2008-11-13 12:28+0100\n"
 "Last-Translator: Logilab Team <contact@logilab.fr>\n"
 "Language-Team: fr <contact@logilab.fr>\n"
 "MIME-Version: 1.0\n"
@@ -36,10 +36,18 @@
 msgstr "  de l'état %(fromstate)s vers l'état %(tostate)s\n"
 
 #, python-format
+msgid "%(cstr)s constraint failed for value %(value)r"
+msgstr "la valeur %(value)r ne satisfait pas la contrainte %(cstr)s"
+
+#, python-format
 msgid "%(firstname)s %(surname)s"
 msgstr "%(firstname)s %(surname)s"
 
 #, python-format
+msgid "%(fmt1)s, or without time: %(fmt2)s"
+msgstr "%(fmt1)s, ou bien sans spécifier l'heure: %(fmt2)s"
+
+#, python-format
 msgid "%(subject)s %(etype)s #%(eid)s (%(login)s)"
 msgstr "%(subject)s %(etype)s #%(eid)s (%(login)s)"
 
@@ -56,10 +64,6 @@
 msgstr "%d années"
 
 #, python-format
-msgid "%s constraint failed for value %r"
-msgstr "contrainte %s n'est pas respectée par valeur %r"
-
-#, python-format
 msgid "%s days"
 msgstr "%d jours"
 
@@ -91,10 +95,6 @@
 msgid "%s software version of the database"
 msgstr "version logicielle de la base pour %s"
 
-#, python-format
-msgid "%s, or without time: %s"
-msgstr "%s, ou bien sans préciser d'heure: %s"
-
 msgid "**"
 msgstr "0..n 0..n"
 
@@ -204,6 +204,12 @@
 msgid "Do you want to delete the following element(s) ?"
 msgstr "Voulez vous supprimer le(s) élément(s) suivant(s)"
 
+msgid "ECache"
+msgstr "Cache applicatif"
+
+msgid "ECache_plural"
+msgstr "Caches applicatifs"
+
 msgid "EConstraint"
 msgstr "Contrainte"
 
@@ -306,6 +312,9 @@
 msgid "New Card"
 msgstr "Nouvelle fiche"
 
+msgid "New ECache"
+msgstr "Nouveau cache applicatif"
+
 msgid "New EConstraint"
 msgstr "Nouvelle contrainte"
 
@@ -442,6 +451,9 @@
 msgid "This Card"
 msgstr "Cette fiche"
 
+msgid "This ECache"
+msgstr "Ce cache applicatif"
+
 msgid "This EConstraint"
 msgstr "Cette contrainte"
 
@@ -525,13 +537,39 @@
 msgid "You are now connected to %s"
 msgstr "Vous êtes connecté à l'application %s"
 
+msgid ""
+"You can either submit a new file using the browse button above, or choose to "
+"remove already uploaded file by checking the \"detach attached file\" check-"
+"box, or edit file content online with the widget below."
+msgstr ""
+"Vous pouvez soit soumettre un nouveau fichier en utilisant le bouton\n"
+"\"parcourir\" ci-dessus, soit suprrimer le fichier déjà présent en\n"
+"cochant la case \"détacher fichier attaché\", soit éditer le contenu\n"
+"du fichier en ligne avec le champ ci-dessous."
+
+msgid ""
+"You can either submit a new file using the browse button above, or edit file "
+"content online with the widget below."
+msgstr ""
+"Vous pouvez soit soumettre un nouveau fichier en utilisant le bouton\n"
+"\"parcourir\" ci-dessu, soit éditer le contenu du fichier en ligne\n"
+"avec le champ ci-dessous."
+
 msgid "You can use any of the following substitutions in your text"
 msgstr ""
 "Vous pouvez utiliser n'importe quelle substitution parmi la liste suivante "
 "dans le contenu de votre courriel."
 
 msgid "You have no access to this view or it's not applyable to current data"
-msgstr "Vous n'avez pas accès à cette vue ou elle ne s'applique pas aux données"
+msgstr ""
+"Vous n'avez pas accès à cette vue ou elle ne s'applique pas aux données"
+
+msgid ""
+"You're not authorized to access this page. If you think you should, please "
+"contact the site administrator."
+msgstr ""
+"Vous n'êtes pas autorisé à accéder à cette page. Si toutefois vous pensez\n"
+"que c'est une erreur, veuillez contacter l'administrateur du site."
 
 #, python-format
 msgid "[%s supervision] changes summary"
@@ -557,6 +595,13 @@
 "une fiche est un texte utilisé comme documentation, référence, rappel de "
 "procédure..."
 
+msgid ""
+"a simple cache entity characterized by a name and a validity date. The "
+"target application is responsible for updating timestamp when necessary to "
+"invalidate the cache (typically in hooks). Also, checkout the AppRsetObject."
+"get_cache() method."
+msgstr ""
+
 msgid "about this site"
 msgstr "à propos de ce site"
 
@@ -644,6 +689,12 @@
 msgid "actions_myprefs_description"
 msgstr ""
 
+msgid "actions_prefs"
+msgstr "préférences"
+
+msgid "actions_prefs_description"
+msgstr ""
+
 msgid "actions_schema"
 msgstr "voir le schéma"
 
@@ -758,6 +809,9 @@
 msgid "add a Card"
 msgstr "ajouter une fiche"
 
+msgid "add a ECache"
+msgstr "ajouter un cache applicatif"
+
 msgid "add a EConstraint"
 msgstr "ajouter une contrainte"
 
@@ -880,6 +934,9 @@
 msgid "and linked"
 msgstr "et lié"
 
+msgid "and/or between different values"
+msgstr "et/ou entre les différentes valeurs"
+
 msgid "anonymous"
 msgstr "anonyme"
 
@@ -893,8 +950,10 @@
 msgstr "avril"
 
 #, python-format
-msgid "at least one relation %s is required on %s(%s)"
-msgstr "au moins une relation %s est nécessaire sur %s(%s)"
+msgid "at least one relation %(rtype)s is required on %(etype)s (%(eid)s)"
+msgstr ""
+"L'entité #%(eid)s de type %(etype)s doit nécessairement être reliée à une\n"
+"autre via la relation %(rtype)s"
 
 msgid "attribute"
 msgstr "attribut"
@@ -920,6 +979,9 @@
 msgid "bookmark this page"
 msgstr "poser un signet ici"
 
+msgid "bookmark this search"
+msgstr "mémoriser cette recherche"
+
 msgid "bookmarked_by"
 msgstr "utilisé par"
 
@@ -1260,6 +1322,10 @@
 msgid "core relation indicating the type of an entity"
 msgstr "relation système indiquant le type de l'entité"
 
+msgid ""
+"core relation indicating the types (including specialized types) of an entity"
+msgstr "relation système indiquant les types (y compris les types parents) d'une entité"
+
 msgid "cost"
 msgstr "coût"
 
@@ -1536,12 +1602,18 @@
 msgid "download"
 msgstr "télécharger"
 
+msgid "download icon"
+msgstr "icône de téléchargement"
+
 msgid "edit bookmarks"
 msgstr "éditer les signets"
 
 msgid "edit the index page"
 msgstr "éditer la page d'accueil"
 
+msgid "editable-table"
+msgstr "table éditable"
+
 msgid "edition"
 msgstr "édition"
 
@@ -1575,6 +1647,9 @@
 msgid "entity deleted"
 msgstr "entité supprimée"
 
+msgid "entity type"
+msgstr "type d'entité"
+
 msgid ""
 "entity type that may be used to construct some advanced security "
 "configuration"
@@ -1601,6 +1676,8 @@
 #, python-format
 msgid "error while querying source %s, some data may be missing"
 msgstr ""
+"une erreur est survenue en interrogeant %s, il est possible que les\n"
+"données affichées soient incomplètes"
 
 msgid "eta_date"
 msgstr "date de fin"
@@ -1617,12 +1694,42 @@
 msgid "external page"
 msgstr "page externe"
 
+msgid "facetbox"
+msgstr "boîte à facettes"
+
+msgid "facets_created_by-facet"
+msgstr "facette \"créé par\""
+
+msgid "facets_created_by-facet_description"
+msgstr ""
+
+msgid "facets_etype-facet"
+msgstr "facette \"est de type\""
+
+msgid "facets_etype-facet_description"
+msgstr ""
+
+msgid "facets_has_text-facet"
+msgstr "facette \"contient le texte\""
+
+msgid "facets_has_text-facet_description"
+msgstr ""
+
+msgid "facets_in_group-facet"
+msgstr "facette \"fait partie du groupe\""
+
+msgid "facets_in_group-facet_description"
+msgstr ""
+
+msgid "facets_in_state-facet"
+msgstr "facette \"dans l'état\""
+
+msgid "facets_in_state-facet_description"
+msgstr ""
+
 msgid "february"
 msgstr "février"
 
-msgid "filter"
-msgstr "filtrer"
-
 msgid "final"
 msgstr "final"
 
@@ -1666,7 +1773,7 @@
 msgstr "indexation du texte"
 
 msgid "generic plot"
-msgstr ""
+msgstr "tracé de courbes standard"
 
 msgid "go back to the index page"
 msgstr "retourner sur la page d'accueil"
@@ -1856,6 +1963,9 @@
 msgid "inlined"
 msgstr "mise en ligne"
 
+msgid "inlined view"
+msgstr "vue embarquée (en ligne)"
+
 msgid "internationalizable"
 msgstr "internationalisable"
 
@@ -1896,6 +2006,12 @@
 "est ce que cette relation est mise en ligne dans la base de données ?vous "
 "devez savoir ce que vous faites si vous changez cela !"
 
+msgid "is_instance_of"
+msgstr "est une instance de"
+
+msgid "is_instance_of_object"
+msgstr "type de"
+
 msgid "is_object"
 msgstr "a pour instance"
 
@@ -1974,8 +2090,8 @@
 msgstr "se déconnecter"
 
 #, python-format
-msgid "loop in %s relation (%s)"
-msgstr "boucle dans la relation %s (%s)"
+msgid "loop in %(rel)s relation (%(eid)s)"
+msgstr "boucle détectée en parcourant la relation %(rel)s de l'entité #%(eid)s"
 
 msgid "main informations"
 msgstr "Informations générales"
@@ -2038,9 +2154,15 @@
 msgid "multiple edit"
 msgstr "édition multiple"
 
+msgid "my custom search"
+msgstr "ma recherche personnalisée"
+
 msgid "name"
 msgstr "nom"
 
+msgid "name of the cache"
+msgstr "nom du cache applicatif"
+
 msgid ""
 "name of the main variables which should be used in the selection if "
 "necessary (comma separated)"
@@ -2078,6 +2200,9 @@
 msgid "no associated epermissions"
 msgstr "aucune permission spécifique n'est définie"
 
+msgid "no possible transition"
+msgstr "aucune transition possible"
+
 msgid "no related project"
 msgstr "pas de projet rattaché"
 
@@ -2244,6 +2369,9 @@
 msgid "remove this Card"
 msgstr "supprimer cette fiche"
 
+msgid "remove this ECache"
+msgstr "supprimer ce cache applicatif"
+
 msgid "remove this EConstraint"
 msgstr "supprimer cette contrainte"
 
@@ -2356,6 +2484,9 @@
 msgid "search"
 msgstr "rechercher"
 
+msgid "search for association"
+msgstr "rechercher pour associer"
+
 msgid "searching for"
 msgstr "Recherche de"
 
@@ -2423,6 +2554,9 @@
 msgid "show %s results"
 msgstr "montrer %s résultats"
 
+msgid "show advanced fields"
+msgstr "montrer les champs avancés"
+
 msgid "show filter form"
 msgstr "afficher le filtre"
 
@@ -2447,6 +2581,12 @@
 msgid "sorry, the server is unable to handle this query"
 msgstr "désolé, le serveur ne peut traiter cette requête"
 
+msgid "specializes"
+msgstr "dérive de"
+
+msgid "specializes_object"
+msgstr "parent de"
+
 msgid "startup views"
 msgstr "vues de départ"
 
@@ -2466,8 +2606,8 @@
 msgstr "changement d'état"
 
 #, python-format
-msgid "status will change from %s to %s"
-msgstr "l'état va passer de %s à %s"
+msgid "status will change from %(st1)s to %(st2)s"
+msgstr "l'entité passera de l'état %(st1)s à l'état %(st2)s"
 
 msgid "subject"
 msgstr "sujet"
@@ -2493,6 +2633,9 @@
 msgid "table"
 msgstr "table"
 
+msgid "tablefilter"
+msgstr "filtre de tableau"
+
 msgid "task progression"
 msgstr "avancement de la tâche"
 
@@ -2531,6 +2674,9 @@
 msgid "thursday"
 msgstr "jeudi"
 
+msgid "timestamp"
+msgstr "date"
+
 msgid "timestamp of the latest source synchronization."
 msgstr "date de la dernière synchronisation avec la source."
 
@@ -2579,12 +2725,18 @@
 msgid "ui"
 msgstr "propriétés génériques de l'interface"
 
+msgid "unaccessible"
+msgstr "inaccessible"
+
 msgid "unauthorized value"
 msgstr "valeur non autorisée"
 
 msgid "unique identifier used to connect to the application"
 msgstr "identifiant unique utilisé pour se connecter à l'application"
 
+msgid "unknown external entity"
+msgstr "entité (externe) introuvable"
+
 msgid "unknown property key"
 msgstr "clé de propriété inconnue"
 
@@ -2747,6 +2899,12 @@
 #~ msgid "%s constraint failed"
 #~ msgstr "La contrainte %s n'est pas satisfaite"
 
+#~ msgid "%s constraint failed for value %r"
+#~ msgstr "contrainte %s n'est pas respectée par valeur %r"
+
+#~ msgid "%s, or without time: %s"
+#~ msgstr "%s, ou bien sans préciser d'heure: %s"
+
 #~ msgid "Loading"
 #~ msgstr "chargement"
 
@@ -2756,6 +2914,9 @@
 #~ msgid "and"
 #~ msgstr "et"
 
+#~ msgid "at least one relation %s is required on %s(%s)"
+#~ msgstr "au moins une relation %s est nécessaire sur %s(%s)"
+
 #~ msgid "cancel edition"
 #~ msgstr "annuler l'édition"
 
@@ -2766,6 +2927,9 @@
 #~ "langue par défaut (regarder le répertoire i18n de l'application pour voir "
 #~ "les langues disponibles)"
 
+#~ msgid "filter"
+#~ msgstr "filtrer"
+
 #~ msgid "footer"
 #~ msgstr "pied de page"
 
@@ -2781,6 +2945,9 @@
 #~ msgid "linked"
 #~ msgstr "lié"
 
+#~ msgid "loop in %s relation (%s)"
+#~ msgstr "boucle dans la relation %s (%s)"
+
 #~ msgid ""
 #~ "maximum number of related entities to display in in the restriction view"
 #~ msgstr ""
@@ -2789,5 +2956,8 @@
 #~ msgid "see also"
 #~ msgstr "voir aussi"
 
+#~ msgid "status will change from %s to %s"
+#~ msgstr "l'état va passer de %s à %s"
+
 #~ msgid "workflow history"
 #~ msgstr "historique du workflow"
--- a/schemas/base.py	Thu Nov 13 11:38:46 2008 +0100
+++ b/schemas/base.py	Thu Nov 13 12:34:56 2008 +0100
@@ -308,7 +308,15 @@
     """generic relation to link one entity to another"""
     symetric = True
 
-class ECache(EntityType):
+class ECache(MetaEntityType):
+    """a simple cache entity characterized by a name and
+    a validity date.
+
+    The target application is responsible for updating timestamp
+    when necessary to invalidate the cache (typically in hooks).
+
+    Also, checkout the AppRsetObject.get_cache() method.
+    """
     permissions = {
         'read':   ('managers', 'users', 'guests'),
         'add':    ('managers',),
--- a/server/hooks.py	Thu Nov 13 11:38:46 2008 +0100
+++ b/server/hooks.py	Thu Nov 13 12:34:56 2008 +0100
@@ -245,9 +245,10 @@
             return
         if self.session.unsafe_execute(*self._rql()).rowcount < 1:
             etype = self.session.describe(self.eid)[0]
-            msg = self.session._('at least one relation %s is required on %s(%s)')
-            raise ValidationError(self.eid, {self.rtype: msg % (self.rtype,
-                                                                etype, self.eid)})
+            msg = self.session._('at least one relation %(rtype)s is required on %(etype)s (%(eid)s)')
+            raise ValidationError(self.eid, {self.rtype: msg % {'rtype': self.rtype,
+                                                                'etype': etype,
+                                                                'eid': self.eid}})
     
     def commit_event(self):
         pass
--- a/web/views/baseforms.py	Thu Nov 13 11:38:46 2008 +0100
+++ b/web/views/baseforms.py	Thu Nov 13 12:34:56 2008 +0100
@@ -101,8 +101,10 @@
         _ = self.req._
         self.w(self.error_message())
         self.w(u'<h4>%s %s</h4>\n' % (_(transition.name), entity.view('oneline')))
-        self.w(u'<p>%s</p>\n' % (_('status will change from %s to %s')
-                               % (_(state.name), _(dest.name))))
+        msg = _('status will change from %(st1)s to %(st2)s') % {
+            'st1': _(state.name),
+            'st2': _(dest.name)}
+        self.w(u'<p>%s</p>\n' % msg)
         self.w(u'<form action="%s" onsubmit="return freezeFormButtons(\'entityForm\');" method="post" id="entityForm">\n'
                % self.build_url('edit'))
         self.w(u'<div id="progress">%s</div>' % _('validating...'))
--- a/web/widgets.py	Thu Nov 13 11:38:46 2008 +0100
+++ b/web/widgets.py	Thu Nov 13 12:34:56 2008 +0100
@@ -783,8 +783,10 @@
     def render_example(self, req):
         formatstr1 = req.property_value('ui.datetime-format')
         formatstr2 = req.property_value('ui.date-format')
-        return req._('%s, or without time: %s') % (now().strftime(formatstr1),
-                                                   now().strftime(formatstr2))
+        return req._('%(fmt1)s, or without time: %(fmt2)s') % {
+            'fmt1': now().strftime(formatstr1),
+            'fmt2': now().strftime(formatstr2),
+            }