[ckan-changes] commit/ckan: 5 new changesets

Bitbucket commits-noreply at bitbucket.org
Fri Sep 30 17:35:38 UTC 2011


5 new changesets in ckan:

http://bitbucket.org/okfn/ckan/changeset/dbe184563ef0/
changeset:   dbe184563ef0
branch:      release-v1.4.3.1
user:        dread
date:        2011-09-30 18:20:58
summary:     [branch] close.
affected #:  0 files (-1 bytes)

http://bitbucket.org/okfn/ckan/changeset/3a593a31b8fe/
changeset:   3a593a31b8fe
user:        dread
date:        2011-09-30 18:44:43
summary:     [merge] from release-v1.4.3.1.
affected #:  43 files (-1 bytes)

--- a/.hgtags	Wed Sep 28 16:29:57 2011 +0100
+++ b/.hgtags	Fri Sep 30 17:44:43 2011 +0100
@@ -36,3 +36,4 @@
 d4929f8f26616724d1340a368cdfd4454b5690b4 ckan-1.4.3
 d4929f8f26616724d1340a368cdfd4454b5690b4 ckan-1.4.3
 860b357a2aec32e8b638f97f65ecb944b7b4973d ckan-1.4.3
+d15d81aa63cfca48c325635149676c36a62de7a7 ckan-1.4.3.1


--- a/CHANGELOG.txt	Wed Sep 28 16:29:57 2011 +0100
+++ b/CHANGELOG.txt	Fri Sep 30 17:44:43 2011 +0100
@@ -1,6 +1,17 @@
 CKAN CHANGELOG
 ++++++++++++++
 
+v1.4.3.1 2011-09-30
+===================
+Minor:
+ * Added files to allow debian packaging of CKAN
+ * Added Catalan translation
+
+Bug fixes:
+ * Incorrect Group creation form parameter caused exception (#1347)
+ * Incorrect AuthGroup creation form parameter caused exception (#1346)
+
+
 v1.4.3 2011-09-13
 =================
 Major:


--- a/MANIFEST.in	Wed Sep 28 16:29:57 2011 +0100
+++ b/MANIFEST.in	Fri Sep 30 17:44:43 2011 +0100
@@ -2,7 +2,7 @@
 recursive-include ckan/public *
 recursive-include ckan/config *.ini
 recursive-include ckan/templates *
-recursive-include ckan/requires *
 recursive-include ckan *.ini
 prune .hg
 include CHANGELOG.txt
+include ckan/migration/migrate.cfg
\ No newline at end of file


--- a/ckan/__init__.py	Wed Sep 28 16:29:57 2011 +0100
+++ b/ckan/__init__.py	Fri Sep 30 17:44:43 2011 +0100
@@ -16,11 +16,4 @@
 __license__ = 'AGPL'
 
 # The packaging system replies on this import, please do not remove it
-try:
-    # Ths automatically modifies sys.path so that the CKAN versions of
-    # key dependencies are used instead of the ones already installed.
-    import ckan_deps
-except ImportError:
-    # This installation of CKAN probably isn't using the ckan_deps
-    pass
-
+import sys; sys.path.insert(0, __path__[0])


--- a/ckan/i18n/__init__.py	Wed Sep 28 16:29:57 2011 +0100
+++ b/ckan/i18n/__init__.py	Fri Sep 30 17:44:43 2011 +0100
@@ -3,7 +3,7 @@
 
 
 # TODO: Figure out a nicer way to get this. From the .ini? 
-_KNOWN_LOCALES = ['en', 'de',
+_KNOWN_LOCALES = ['en', 'ca', 'de',
                   'es', 'fi', 'fr', 
                   'it', 'nl', 'no',
                   'pt_BR', 'ru',


Binary file ckan/i18n/ca/LC_MESSAGES/ckan.mo has changed


--- a/ckan/i18n/ca/LC_MESSAGES/ckan.po	Wed Sep 28 16:29:57 2011 +0100
+++ b/ckan/i18n/ca/LC_MESSAGES/ckan.po	Fri Sep 30 17:44:43 2011 +0100
@@ -2,14 +2,17 @@
 # Copyright (C) 2011 ORGANIZATION
 # This file is distributed under the same license as the ckan project.
 #
+# Translators:
+# amercader <amercadero at gmail.com>, 2011.
+# <amercadero at gmail.com>, 2011.
 # ilabastida <ilabastida at ub.edu>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: CKAN (Comprehensive Knowledge Archive Network)\n"
 "Report-Msgid-Bugs-To: http://www.ckan.org/\n"
 "POT-Creation-Date: 2011-09-15 17:42+0100\n"
-"PO-Revision-Date: 2011-09-15 14:55+0100\n"
-"Last-Translator: dread <internet at davidread.org>\n"
+"PO-Revision-Date: 2011-09-16 08:20+0000\n"
+"Last-Translator: amercader <amercadero at gmail.com>\n"
 "Language-Team: Catalan "
 "(http://www.transifex.net/projects/p/ckan/team/ca/)\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
@@ -30,30 +33,30 @@
 #: ckan/controllers/user.py:71 ckan/controllers/user.py:94
 #: ckan/logic/auth/get.py:17
 msgid "Not authorized to see this page"
-msgstr ""
+msgstr "No esteu autoritzats a editar aquesta pàgina"
 
 #: ckan/controllers/api.py:96 ckan/controllers/api.py:158
 msgid "Access denied"
-msgstr ""
+msgstr "Accés denegat"
 
 #: ckan/controllers/api.py:102 ckan/controllers/api.py:163
 msgid "Not found"
-msgstr ""
+msgstr "No trobat"
 
 #: ckan/controllers/api.py:110
 msgid "Bad request"
-msgstr ""
+msgstr "Mala sol·licitud"
 
 #: ckan/controllers/api.py:137
 #, python-format
 msgid "Action name not known: %s"
-msgstr ""
+msgstr "Acció desconeguda: %s"
 
 #: ckan/controllers/api.py:147 ckan/controllers/api.py:268
 #: ckan/controllers/api.py:319
 #, python-format
 msgid "JSON Error: %s"
-msgstr ""
+msgstr "Error JSON: %s"
 
 #: ckan/controllers/api.py:155 ckan/controllers/api.py:292
 #: ckan/controllers/api.py:341 ckan/controllers/group.py:175
@@ -61,107 +64,109 @@
 #: ckan/controllers/package.py:494 ckan/controllers/user.py:154
 #: ckan/controllers/user.py:240 ckan/controllers/user.py:354
 msgid "Integrity Error"
-msgstr ""
+msgstr "Error d'integritat"
 
 #: ckan/controllers/api.py:197
 #, python-format
 msgid "Cannot list entity of this type: %s"
-msgstr ""
+msgstr "No es pot llistar l'entitat de tipus: %s"
 
 #: ckan/controllers/api.py:231
 #, python-format
 msgid "Cannot read entity of this type: %s"
-msgstr ""
+msgstr "No es pot llegir l'entitat de tipus: %s"
 
 #: ckan/controllers/api.py:275
 #, python-format
 msgid "Cannot create new entity of this type: %s %s"
-msgstr ""
+msgstr "No es pot crear una nova entitat d'aquest tipus: %s %s"
 
 #: ckan/controllers/api.py:325
 #, python-format
 msgid "Cannot update entity of this type: %s"
-msgstr ""
+msgstr "No es pot editer l'entitat de tipus: %s"
 
 #: ckan/controllers/api.py:367
 #, python-format
 msgid "Cannot delete entity of this type: %s %s"
-msgstr ""
+msgstr "No es pot eliminar l'entitat de tipus: %s %s"
 
 #: ckan/controllers/api.py:390
 msgid "No revision specified"
-msgstr ""
+msgstr "No s'ha especificat una revisió"
 
 #: ckan/controllers/api.py:394
 #, python-format
 msgid "There is no revision with id: %s"
-msgstr ""
+msgstr "No hi ha cap revisiió amb id: %s"
 
 #: ckan/controllers/api.py:404
 msgid "Missing search term ('since_id=UUID' or 'since_time=TIMESTAMP')"
-msgstr ""
+msgstr "Falta un terme de cerca ('since_id=UUID' o 'since_time=TIMESTAMP')"
 
 #: ckan/controllers/api.py:412
 #, python-format
 msgid "Could not read parameters: %r"
-msgstr ""
+msgstr "No s'han pogut llegir els paràmetres: %r"
 
 #: ckan/controllers/api.py:449
 #, python-format
 msgid "Bad search option: %s"
-msgstr ""
+msgstr "Opció de cerca incorrecta: %s"
 
 #: ckan/controllers/api.py:452
 #, python-format
 msgid "Unknown register: %s"
-msgstr ""
+msgstr "Registre desconegut: %s"
 
 #: ckan/controllers/api.py:460
 msgid "Malformed qjson value"
-msgstr ""
+msgstr "Valor JSON mal format"
 
 #: ckan/controllers/api.py:469 ckan/lib/base.py:193
 msgid "Request params must be in form of a json encoded dictionary."
 msgstr ""
+"Els paràmetres de la sol·licitud han d'estar en forma d'un diccionari "
+"codificat com a JSON."
 
 #: ckan/controllers/authorization_group.py:44
 #, python-format
 msgid "Not authorized to read %s"
-msgstr ""
+msgstr "No autoritzat a llegir %s"
 
 #: ckan/controllers/authorization_group.py:62 ckan/controllers/group.py:109
 #: ckan/controllers/group_formalchemy.py:36
 msgid "Unauthorized to create a group"
-msgstr ""
+msgstr "No autoritzat a crear un grup"
 
 #: ckan/controllers/authorization_group.py:107 ckan/controllers/group.py:259
 #, python-format
 msgid "User %r not authorized to edit %r"
-msgstr ""
+msgstr "L'usuari %r no està autoritzat a editar %r"
 
 #: ckan/controllers/authorization_group.py:151 ckan/controllers/group.py:79
 #: ckan/controllers/group.py:145 ckan/controllers/group.py:203
 #: ckan/controllers/group.py:257
 msgid "Group not found"
-msgstr "No s'ha trobat el grup"
+msgstr "Grup no trobat"
 
 #: ckan/controllers/authorization_group.py:158 ckan/controllers/group.py:214
 #: ckan/controllers/package.py:547
 #, python-format
 msgid "User %r not authorized to edit %s authorizations"
-msgstr ""
+msgstr "L'usuari %r no està autoritzat a editar les autorizacions de%s"
 
 #: ckan/controllers/group.py:81 ckan/controllers/group.py:147
 #: ckan/controllers/group.py:171 ckan/controllers/group.py:190
 #, python-format
 msgid "Unauthorized to read group %s"
-msgstr ""
+msgstr "No autoritzat a llegir el grup %s"
 
 #: ckan/controllers/group.py:154 ckan/controllers/group_formalchemy.py:93
 #: ckan/controllers/package.py:387 ckan/controllers/package_formalchemy.py:95
 #, python-format
 msgid "User %r not authorized to edit %s"
-msgstr ""
+msgstr "L'usuari %r no està autoritzat a editar %s"
 
 #: ckan/controllers/group.py:173 ckan/controllers/group.py:192
 #: ckan/controllers/package.py:218 ckan/controllers/package.py:253
@@ -170,23 +175,23 @@
 #: ckan/controllers/package.py:465 ckan/controllers/package.py:492
 #: ckan/controllers/package.py:536
 msgid "Package not found"
-msgstr ""
+msgstr "No s'ha trobat el paquet"
 
 #: ckan/controllers/group.py:241 ckan/controllers/package.py:275
 msgid "Select two revisions before doing the comparison."
-msgstr ""
+msgstr "Seleccioneu dues revisions abans de fer la comparació."
 
 #: ckan/controllers/group.py:266
 msgid "CKAN Group Revision History"
-msgstr ""
+msgstr "Historial de revisions del grup de CKAN"
 
 #: ckan/controllers/group.py:268
 msgid "Recent changes to CKAN Group: "
-msgstr ""
+msgstr "Canvis recents al grup de CKAN"
 
 #: ckan/controllers/group.py:286 ckan/controllers/package.py:320
 msgid "Log message: "
-msgstr ""
+msgstr "Missatge de registre: "
 
 #: ckan/controllers/home.py:37
 msgid "This site is currently off-line. Database is not initialised."
@@ -194,21 +199,21 @@
 
 #: ckan/controllers/home.py:84
 msgid "Invalid language specified"
-msgstr ""
+msgstr "S'ha especificat un llenguatge invàlid"
 
 #: ckan/controllers/home.py:87
 msgid "Language has been set to: English"
-msgstr ""
+msgstr "El llenguatge s'ha definit com a: Català"
 
 #: ckan/controllers/home.py:91
 msgid "No language given!"
-msgstr ""
+msgstr "No s'ha especificat un llenguatge!"
 
 #: ckan/controllers/package.py:207 ckan/controllers/package.py:209
 #: ckan/controllers/package.py:211
 #, python-format
 msgid "Invalid revision format: %r"
-msgstr ""
+msgstr "Format de revisió invàlid: %r"
 
 #: ckan/controllers/package.py:220 ckan/controllers/package.py:255
 #: ckan/controllers/package.py:292 ckan/controllers/package.py:377
@@ -216,19 +221,19 @@
 #: ckan/controllers/package.py:463 ckan/controllers/package.py:490
 #, python-format
 msgid "Unauthorized to read package %s"
-msgstr ""
+msgstr "No autoritzat a llegir el paquet %s"
 
 #: ckan/controllers/package.py:301
 msgid "CKAN Package Revision History"
-msgstr ""
+msgstr "Historial de revisions del paquet de CKAN"
 
 #: ckan/controllers/package.py:303
 msgid "Recent changes to CKAN Package: "
-msgstr ""
+msgstr "Canvis recents al paquet de CKAN"
 
 #: ckan/controllers/package.py:344 ckan/controllers/package_formalchemy.py:31
 msgid "Unauthorized to create a package"
-msgstr ""
+msgstr "No autoritzat a crear un paquet"
 
 #: ckan/controllers/package.py:509
 #, python-format
@@ -239,43 +244,43 @@
 
 #: ckan/controllers/revision.py:42
 msgid "CKAN Repository Revision History"
-msgstr ""
+msgstr "Historial de canvis al repositori de CKAN"
 
 #: ckan/controllers/revision.py:44
 msgid "Recent changes to the CKAN repository."
-msgstr ""
+msgstr "Canvis recents al repositori de CKAN."
 
 #: ckan/controllers/revision.py:103
 #, python-format
 msgid "Packages affected: %s.\n"
-msgstr ""
+msgstr "Paquets afectats: %s.\n"
 
 #: ckan/controllers/revision.py:178
 msgid "Revision updated"
-msgstr ""
+msgstr "Revisió actualitzada"
 
 #: ckan/controllers/tag.py:55 ckan/forms/common.py:928
 msgid "Other"
-msgstr ""
+msgstr "Altres"
 
 #: ckan/controllers/tag.py:69
 msgid "Tag not found"
-msgstr ""
+msgstr "Etiqueta no trobada"
 
 #: ckan/controllers/user.py:128
 msgid "Unauthorized to create a user"
-msgstr ""
+msgstr "No autoritzat a crear un usuari"
 
 #: ckan/controllers/user.py:150
 #, python-format
 msgid "Unauthorized to create user %s"
-msgstr ""
+msgstr "No autoritzat a crear l'usuari %s"
 
 #: ckan/controllers/user.py:152 ckan/controllers/user.py:201
 #: ckan/controllers/user.py:238 ckan/controllers/user.py:332
 #: ckan/controllers/user.py:352
 msgid "User not found"
-msgstr ""
+msgstr "Usuari no trobat"
 
 #: ckan/controllers/user.py:156
 msgid "Bad Captcha. Please try again."
@@ -283,124 +288,128 @@
 
 #: ckan/controllers/user.py:180
 msgid "No user specified"
-msgstr ""
+msgstr "No s'ha especificat cap usuari"
 
 #: ckan/controllers/user.py:199 ckan/controllers/user.py:236
 #: ckan/controllers/user.py:350
 #, python-format
 msgid "Unauthorized to edit user %s"
-msgstr ""
+msgstr "No autoritzat a editar l'usuari %s"
 
 #: ckan/controllers/user.py:206
 #, python-format
 msgid "User %s not authorized to edit %s"
-msgstr ""
+msgstr "Usuari %s no autoritzat a editar %s"
 
 #: ckan/controllers/user.py:267
 #, python-format
 msgid "Welcome back, %s"
-msgstr ""
+msgstr "Benvingut de nou, %s"
 
 #: ckan/controllers/user.py:307
 #, python-format
 msgid "\"%s\" matched several users"
-msgstr ""
+msgstr "\"%s\" coincideix amb més d'un usuari"
 
 #: ckan/controllers/user.py:309 ckan/controllers/user.py:311
 #, python-format
 msgid "No such user: %s"
-msgstr ""
+msgstr "Usuari desconegut: %s"
 
 #: ckan/controllers/user.py:316
 msgid "Please check your inbox for a reset code."
 msgstr ""
+"Si us plau, comproveu la vostra safata d'entrada per veure si heu rebut "
+"un codi de reinici"
 
 #: ckan/controllers/user.py:319
 #, python-format
 msgid "Could not send reset link: %s"
-msgstr ""
+msgstr "No s'ha pogut enviar l'enllaç de reinici: %s"
 
 #: ckan/controllers/user.py:336
 msgid "Invalid reset key. Please try again."
-msgstr ""
+msgstr "Clau de reinici invàlida. Si us plau, torneu-ho a intentar"
 
 #: ckan/controllers/user.py:347
 msgid "Your password has been reset."
-msgstr ""
+msgstr "La vostra contrasenya s'ha actualitzat"
 
 #: ckan/controllers/user.py:375
 msgid "Your password must be 4 characters or longer."
-msgstr ""
+msgstr "La vostra contrasenya ha de tenir 4 caràcters o més."
 
 #: ckan/controllers/user.py:377
 msgid "The passwords you entered do not match."
-msgstr ""
+msgstr "Les contrasenyes que heu introduït no coincideiexen."
 
 #: ckan/forms/common.py:25 ckan/logic/validators.py:94
 #, python-format
 msgid "Name must be at least %s characters long"
-msgstr ""
+msgstr "El nom ha de tenir al menys %s caràcters"
 
 #: ckan/forms/common.py:27 ckan/logic/validators.py:96
 msgid ""
 "Name must be purely lowercase alphanumeric (ascii) characters and these "
 "symbols: -_"
 msgstr ""
+"El nom ha d'estar en minúscules, amb caràcters alfanumèrics (ascii) o "
+"aquests símbols: -_"
 
 #: ckan/forms/common.py:40 ckan/logic/validators.py:114
 msgid "Dataset name already exists in database"
-msgstr ""
+msgstr "Aquest nom de paquet ja existeix a la base de dades"
 
 #: ckan/forms/common.py:48 ckan/logic/validators.py:144
 msgid "Group name already exists in database"
-msgstr ""
+msgstr "Aquest nom de grup ja existeix a la base de dades"
 
 #: ckan/forms/common.py:137
 #, python-format
 msgid "Value does not match required format: %s"
-msgstr ""
+msgstr "El valor no coincideix amb el format requerit: %s"
 
 #: ckan/forms/common.py:154 ckan/forms/common.py:776
 #: ckan/templates/package/new_package_form.html:178
 msgid "(None)"
-msgstr ""
+msgstr "(Cap)"
 
 #: ckan/forms/common.py:345
 msgid "Dataset resource(s) incomplete."
-msgstr ""
+msgstr "Recurs(os) del paquet incomplet"
 
 #: ckan/forms/common.py:512 ckan/logic/validators.py:150
 #, python-format
 msgid "Tag \"%s\" length is less than minimum %s"
-msgstr ""
+msgstr "La longitud de l'etiqueta \"%s\" és menor al mínim (%s)"
 
 #: ckan/forms/common.py:514 ckan/logic/validators.py:158
 #, python-format
 msgid "Tag \"%s\" must be alphanumeric characters or symbols: -_."
-msgstr ""
+msgstr "L'etiqueta \"%s\" ha de ser alfanumèrica o amb els símbols: -_"
 
 #: ckan/forms/common.py:516 ckan/logic/validators.py:166
 #, python-format
 msgid "Tag \"%s\" must not be uppercase"
-msgstr ""
+msgstr "L'etiqueta \"%s\" ha d'estar en minúscules"
 
 #: ckan/forms/common.py:533 ckan/logic/validators.py:128
 #, python-format
 msgid "Duplicate key \"%s\""
-msgstr ""
+msgstr "Clau duplicada \"%s\""
 
 #: ckan/forms/common.py:536
 #, python-format
 msgid "Extra key-value pair: key is not set for value \"%s\"."
-msgstr ""
+msgstr "Parella de clau-valor extra: no s'ha definit la clau per al valor \"%s\"."
 
 #: ckan/forms/common.py:786 ckan/templates/package/new_package_form.html:184
 msgid "Cannot add any groups."
-msgstr ""
+msgstr "No es pot afegir cap grup."
 
 #: ckan/forms/common.py:801 ckan/templates/package/new_package_form.html:175
 msgid "Group"
-msgstr ""
+msgstr "Grup"
 
 #: ckan/forms/common.py:831
 #, python-format
@@ -408,19 +417,21 @@
 "Can't derived new group selection from serialized value structured like "
 "this: %s"
 msgstr ""
+"No es pot derivar una nova selecció de grup d'un valor serialitzat així: "
+"%s"
 
 #: ckan/forms/common.py:911
 msgid "other - please specify"
-msgstr ""
+msgstr "altres - si us plau, especifiqueu"
 
 #: ckan/forms/group.py:52 ckan/forms/package.py:38 ckan/forms/package.py:110
 msgid "Name"
-msgstr ""
+msgstr "Nom"
 
 #: ckan/forms/group.py:63 ckan/templates/group/new_group_form.html:16
 #: ckan/templates/package/edit.html:24
 msgid "Details"
-msgstr ""
+msgstr "Detalls"
 
 #: ckan/forms/group.py:64 ckan/forms/package.py:102 ckan/forms/package.py:112
 #: ckan/logic/action/update.py:43 ckan/logic/action/update.py:45
@@ -429,29 +440,31 @@
 #: ckan/templates/group/new_group_form.html:41
 #: ckan/templates/package/edit.html:25
 msgid "Extras"
-msgstr ""
+msgstr "Extres"
 
 #: ckan/forms/group.py:87
 msgid "Package"
-msgstr ""
+msgstr "PAquet"
 
 #: ckan/forms/group.py:88
 msgid "Add packages"
-msgstr ""
+msgstr "Afegir paquet"
 
 #: ckan/forms/package.py:34
 msgid "A short descriptive title for the data set."
-msgstr ""
+msgstr "Un títol curt i descriptiu per al conjunt de dades."
 
 #: ckan/forms/package.py:35
 msgid ""
 "It should not be a description though - save that for the Notes field. Do"
 " not give a trailing full stop."
 msgstr ""
+"No hauria de ser un descripció, però. Useu el camp Notes per això. No "
+"afegiu un punt al final."
 
 #: ckan/forms/package.py:39
 msgid "A unique identifier for the package."
-msgstr ""
+msgstr "Un identificador únic per al paquet."
 
 #: ckan/forms/package.py:40
 msgid ""
@@ -459,42 +472,49 @@
 "URIs. Only use an acronym if it is widely recognised. Renaming is "
 "possible but discouraged."
 msgstr ""
+"Hauria de ser més o menys entenedor per a humans, en l'esperit dels URIs "
+"de la Web Semàntica. Només useu acrònims si són ampliament reconeguts. És"
+" possible reanomenar paquets, però no es recomana"
 
 #: ckan/forms/package.py:41 ckan/templates/package/new_package_form.html:44
 msgid "2+ characters, lowercase, using only 'a-z0-9' and '-_'"
-msgstr ""
+msgstr "Més de 2 caràcters, en minúscules, usant només 'a-z0-9' i '-_'"
 
 #: ckan/forms/package.py:45 ckan/templates/package/new_package_form.html:205
 msgid "A number representing the version (if applicable)"
-msgstr ""
+msgstr "Un número que representa la versió (si s'escau)"
 
 #: ckan/forms/package.py:50 ckan/templates/package/new_package_form.html:49
 msgid "The URL for the web page describing the data (not the data itself)."
-msgstr ""
+msgstr "El URL per a la pàgina web que descriu les dades (no les dades en si)."
 
 #: ckan/forms/package.py:51 ckan/templates/package/new_package_form.html:50
 msgid "e.g. http://www.example.com/growth-figures.html"
-msgstr ""
+msgstr "p.ex. http://www.exemple.com/indicadors-creixement.html"
 
 #: ckan/forms/package.py:55 ckan/templates/package/new_package_form.html:191
 msgid ""
 "The name of the main contact, for enquiries about this particular "
 "dataset, using the e-mail address in the following field."
 msgstr ""
+"El nom del contacte principal, per a consultes sobre aquest conjunt de "
+"dades en particular, usant el correu electrònic del camp següent."
 
 #: ckan/forms/package.py:59 ckan/templates/package/new_package_form.html:198
 msgid ""
 "If there is another important contact person (in addition to the person "
 "in the Author field) then provide details here."
 msgstr ""
+"Si hi ha alguna altra persona de contacte important (a més de la persona "
+"al camp Autor) especifiqueu els seus detalls aquí."
 
 #: ckan/forms/package.py:63
 msgid "Licence"
-msgstr ""
+msgstr "Llicència"
 
 #: ckan/forms/package.py:64 ckan/templates/package/new_package_form.html:76
 msgid "The licence under which the dataset is released."
-msgstr ""
+msgstr "La llicència amb la qual es publiquen les dades."
 
 #: ckan/forms/package.py:68 ckan/forms/package.py:112
 #: ckan/templates/layout_base.html:146
@@ -502,7 +522,7 @@
 #: ckan/templates/package/read.html:50 ckan/templates/tag/index.html:6
 #: ckan/templates/tag/index.html:9
 msgid "Tags"
-msgstr ""
+msgstr "Etiquetes"
 
 #: ckan/forms/package.py:69
 #, python-format
@@ -510,14 +530,17 @@
 "Terms that may link this dataset to similar ones. For more information on"
 " conventions, see <a href=\"%s\">this wiki page</a>."
 msgstr ""
+"Termes que poden enllaçar aquest conjunt de dades a altres similars. Per "
+"a més informació sobre convencions, vegeu <a href=\"%s\">aquesta pàgina "
+"de la wiki</a>."
 
 #: ckan/forms/package.py:70 ckan/templates/package/new_package_form.html:84
 msgid "e.g. pollution rivers water-quality"
-msgstr ""
+msgstr "p.ex. rius qualitat-aigua"
 
 #: ckan/forms/package.py:74
 msgid "The files containing the data or address of the APIs for accessing it."
-msgstr ""
+msgstr "Els arxius que contenen les dades o enllaços a les APIs per accedir-hi."
 
 #: ckan/forms/package.py:75
 msgid ""
@@ -534,20 +557,35 @@
 "the data is supplied. <br /><b>Description</b> Any information you want "
 "to add to describe the resource.<br />"
 msgstr ""
+"<br />Aquests poden ser repetits si s'escau. Per exemple si les dades "
+"s'ofereixenen diferents formats, o separades en diferents àmbits o "
+"períodes de temps, cada arxiu és un 'recurs' diferent, que hauria de ser "
+"descrit de forma diferent. Apareixeran tots junts a la pàgina del conjunt"
+" de dades a CKAN.<br /><br /><b>URL:</b> Aquest és l'enllaç d'Internet a"
+" les dades. Seleccionant aquest enllaç en un navegador, l'usuari es "
+"descarregarà immediatament el conjunt de dades sencer.Tingueu en compte "
+"que les dades no estan allotjades en aquest lloc, sinó per qui les "
+"publica. Alternativament, la URL pot apuntar a un servidor API com un "
+"punt d'accés SPARQL o un servei JSON-P.<br /><b>Format:</b> Això hauria "
+"d'indicar el format de fitxer en que les dades s'ofereixen.<br "
+"/><b>Descripció:</b>Qualsevol informació que vulgueu afegir per a "
+"descriure el recurs.<br />"
 
 #: ckan/forms/package.py:76
 msgid ""
 "Format choices: CSV | RDF | XML | XBRL | SDMX | HTML+RDFa | Other as "
 "appropriate"
 msgstr ""
+"Opcions de format: CSV | RDF | XML | XBRL | SDMX | HTML+RDFa | Altres si "
+"s'escau"
 
 #: ckan/forms/package.py:80 ckan/forms/package.py:111
 msgid "Notes"
-msgstr ""
+msgstr "Notes"
 
 #: ckan/forms/package.py:81
 msgid "The main description of the dataset"
-msgstr ""
+msgstr "La descripció principal del conjunt de dades"
 
 #: ckan/forms/package.py:82
 msgid ""
@@ -556,47 +594,51 @@
 "because the first few words alone may be used in some views of the data "
 "sets."
 msgstr ""
+"Es mostra sovint amb el títol del paquet. Més concretament, hauria de "
+"començar amb una frase curta que descrigui el conjunt de dades de forma "
+"breu, perquè les primeres paraules poden ser usades en algunes vistes "
+"dels conjunts de dades"
 
 #: ckan/forms/package.py:83
 #, python-format
 msgid "You can use %sMarkdown formatting%s here."
-msgstr ""
+msgstr "Podeu usar %sformat Markdown%s aquí."
 
 #: ckan/forms/package.py:94
 msgid "Basic information"
-msgstr ""
+msgstr "Informació bàsica"
 
 #: ckan/forms/package.py:96 ckan/forms/package.py:111
 #: ckan/logic/action/update.py:41 ckan/templates/package/edit.html:22
 #: ckan/templates/package/read_core.html:15
 msgid "Resources"
-msgstr ""
+msgstr "Recursos"
 
 #: ckan/forms/package.py:97 ckan/templates/layout_base.html:78
 #: ckan/templates/package/edit.html:23 ckan/templates/package/read.html:57
 #: ckan/templates/revision/read.html:64
 msgid "Groups"
-msgstr ""
+msgstr "Grups"
 
 #: ckan/forms/package.py:98 ckan/forms/package.py:105
 msgid "Detail"
-msgstr ""
+msgstr "Detall"
 
 #: ckan/forms/package.py:110 ckan/templates/_util.html:147
 #: ckan/templates/_util.html:160 ckan/templates/_util.html:173
 #: ckan/templates/group/new_group_form.html:23
 #: ckan/templates/package/new_package_form.html:31
 msgid "Title"
-msgstr ""
+msgstr "Títol"
 
 #: ckan/forms/package.py:110 ckan/templates/package/new_package_form.html:203
 #: ckan/templates/package/read.html:43
 msgid "Version"
-msgstr ""
+msgstr "Versió"
 
 #: ckan/forms/package.py:110
 msgid "URL"
-msgstr ""
+msgstr "URL"
 
 #: ckan/forms/package.py:111 ckan/templates/_util.html:345
 #: ckan/templates/_util.html:395 ckan/templates/group/history.html:35
@@ -604,58 +646,58 @@
 #: ckan/templates/package/new_package_form.html:189
 #: ckan/templates/package/read.html:35
 msgid "Author"
-msgstr ""
+msgstr "Autor"
 
 #: ckan/forms/package.py:111 ckan/templates/package/new_package_form.html:193
 msgid "Author email"
-msgstr ""
+msgstr "Correu electrònic de l'autor"
 
 #: ckan/forms/package.py:111 ckan/templates/package/new_package_form.html:196
 #: ckan/templates/package/read.html:39
 msgid "Maintainer"
-msgstr ""
+msgstr "Mantenidor"
 
 #: ckan/forms/package.py:112 ckan/templates/package/new_package_form.html:200
 msgid "Maintainer email"
-msgstr ""
+msgstr "Correu electrònic del mantenidor"
 
 #: ckan/forms/package.py:112 ckan/templates/package/new_package_form.html:68
 msgid "License"
-msgstr ""
+msgstr "Llicència"
 
 #: ckan/forms/package.py:112 ckan/templates/group/new_group_form.html:30
 #: ckan/templates/package/new_package_form.html:208
 #: ckan/templates/package/read.html:77
 msgid "State"
-msgstr ""
+msgstr "Estat"
 
 #: ckan/forms/package_dict.py:95
 #, python-format
 msgid "Resource should be a dictionary: %r"
-msgstr ""
+msgstr "El recurs hauria de ser un diccionari: %r"
 
 #: ckan/forms/package_dict.py:112
 #, python-format
 msgid "Key unknown: %s"
-msgstr ""
+msgstr "Clau desconeguda: %s"
 
 #: ckan/forms/package_dict.py:114
 msgid "Key blank"
-msgstr ""
+msgstr "Clau buida"
 
 #: ckan/lib/base.py:169
 #, python-format
 msgid "Could not find the POST data: %r : %s"
-msgstr ""
+msgstr "No s'han trobat les dades POST: %r %s"
 
 #: ckan/lib/base.py:177
 #, python-format
 msgid "Could not extract request body data: %s"
-msgstr ""
+msgstr "No s'han pogut extreure les dades del cos de la sol·licitud: %s"
 
 #: ckan/lib/base.py:182
 msgid "No request body data"
-msgstr ""
+msgstr "No s'han trobat les dades de la sol·licitud"
 
 #: ckan/lib/base.py:191
 #, python-format
@@ -665,16 +707,16 @@
 #: ckan/lib/mailer.py:21
 #, python-format
 msgid "Dear %s,"
-msgstr ""
+msgstr "Benvolgut %s,"
 
 #: ckan/lib/mailer.py:34
 #, python-format
 msgid "%s <%s>"
-msgstr ""
+msgstr "%s <%s>"
 
 #: ckan/lib/mailer.py:58
 msgid "No recipient email address available!"
-msgstr ""
+msgstr "No hi ha cap adreça de correu disponible!"
 
 #: ckan/lib/mailer.py:63
 #, python-format
@@ -685,24 +727,31 @@
 "\n"
 "   %(reset_link)s\n"
 msgstr ""
+"Heu sol·licitat que es reiniciï la vostra contrasenya per al lloc "
+"%(site_title)s.\n"
+"\n"
+"Si us plau, feu clic al següent enllaç per confirmar aquesta sol·licitud:"
+"\n"
+"\n"
+"   %(reset_link)s\n"
 
 #: ckan/lib/mailer.py:95 ckan/templates/user/login.html:27
 #: ckan/templates/user/perform_reset.html:6
 #: ckan/templates/user/perform_reset.html:14
 msgid "Reset your password"
-msgstr ""
+msgstr "Reinicieu la vostra contrasenya"
 
 #: ckan/lib/package_saver.py:44
 msgid "Cannot render package description"
-msgstr ""
+msgstr "No s'ha pogut renderitzar la descripció del paquet"
 
 #: ckan/lib/package_saver.py:49
 msgid "No web page given"
-msgstr ""
+msgstr "No s'ha indicat una pàgina web"
 
 #: ckan/lib/package_saver.py:156 ckan/logic/validators.py:45
 msgid "No links are allowed in the log_message."
-msgstr ""
+msgstr "No es permeten enllaços al missatge de registre"
 
 #: ckan/logic/__init__.py:113
 msgid "No valid API key provided."
@@ -712,10 +761,12 @@
 #, python-format
 msgid "Cannot change value of key from %s to %s. This key is read-only"
 msgstr ""
+"No s'ha pogut canviar el valor de la clau de %s a %s. Aquesta clau és de "
+"només lectura"
 
 #: ckan/logic/validators.py:26
 msgid "Invalid integer"
-msgstr ""
+msgstr "No s'ha trobat el paquet."
 
 #: ckan/logic/validators.py:36
 msgid "Date format incorrect"
@@ -728,7 +779,7 @@
 #: ckan/logic/validators.py:66
 #, python-format
 msgid "Dataset with name %r does not exist."
-msgstr ""
+msgstr "El paquet amb nom %r no existeix."
 
 #: ckan/logic/validators.py:208
 #, python-format
@@ -736,59 +787,65 @@
 "That login name is not valid. It must be at least 3 characters, "
 "restricted to alphanumerics and these symbols: %s"
 msgstr ""
+"Aquest nom de registre no és vàlid. Ha de tenir al menys 3 caràcters, "
+"restringits a alfanumèrics i a aquests símbols: %s"
 
 #: ckan/logic/validators.py:213
 msgid "That login name is not available."
-msgstr ""
+msgstr "Aquest nom de registre no es troba disponible."
 
 #: ckan/logic/validators.py:225
 msgid "Please enter both passwords"
-msgstr ""
+msgstr "Si us plau, introduïu les dues contrasenyes"
 
 #: ckan/logic/validators.py:231
 msgid "Your password must be 4 characters or longer"
-msgstr ""
+msgstr "La vostra contrasenya ha de tenir 4 caràcters o més"
 
 #: ckan/logic/validators.py:239
 msgid "The passwords you entered do not match"
-msgstr ""
+msgstr "Les contrasenyes introduïdes no coincideixen"
 
 #: ckan/logic/validators.py:251
 msgid "Missing value"
-msgstr ""
+msgstr "Manca el valor"
 
 #: ckan/logic/validators.py:255
 msgid ""
 "Edit not allowed as it looks like spam. Please avoid links in your "
 "description."
 msgstr ""
+"Actualització no permesa, ja que s'assembla a spam. Si us plau, eviteu "
+"enllaços en la vostra descripció"
 
 #: ckan/logic/action/create.py:59 ckan/logic/action/create.py:164
 #, python-format
 msgid "REST API: Create object %s"
-msgstr ""
+msgstr "API REST: Creat objecte %s"
 
 #: ckan/logic/action/create.py:139
 #, python-format
 msgid "REST API: Create package relationship: %s %s %s"
-msgstr ""
+msgstr "API REST: Creada relació entre paquets: %s %s %s"
 
 #: ckan/logic/action/create.py:190
 msgid "You must supply a package id or name (parameter \"package\")."
 msgstr ""
+"Heu de proporcionar un identificador o nom de paquet (paràmetre "
+"\"package\")."
 
 #: ckan/logic/action/create.py:192
 msgid "You must supply a rating (parameter \"rating\")."
-msgstr ""
+msgstr "Heu de proporcionar una valoració (paràmetre \"rating\")."
 
 #: ckan/logic/action/create.py:197
 msgid "Rating must be an integer value."
-msgstr ""
+msgstr "La valoració ha de ser un valor enter."
 
 #: ckan/logic/action/create.py:201
 #, python-format
 msgid "Rating must be between %i and %i."
-msgstr ""
+msgstr "La valoració ha d'estar entre %i i %i."
 
 #: ckan/logic/action/create.py:203
 #, python-format
@@ -798,35 +855,38 @@
 #: ckan/logic/action/delete.py:23
 #, python-format
 msgid "REST API: Delete Package: %s"
-msgstr ""
+msgstr "API REST: Esborrat Paquet: %s"
 
 #: ckan/logic/action/delete.py:60 ckan/logic/action/delete.py:82
 #, python-format
 msgid "REST API: Delete %s"
-msgstr ""
+msgstr "API REST: Esborrat %s"
 
 #: ckan/logic/action/update.py:41
 msgid "Package resource(s) incomplete"
-msgstr ""
+msgstr "Recurs(os) del paquet incomplets"
 
 #: ckan/logic/action/update.py:43 ckan/logic/action/update.py:55
 #: ckan/logic/action/update.py:67
 msgid "Missing Value"
-msgstr ""
+msgstr "Falta el valor"
 
 #: ckan/logic/action/update.py:159
+msgstr "No s'ha trobat el grup."
 msgid "Resource was not found."
-msgstr ""
+msgstr "Recurs no trobat"
 
 #: ckan/logic/action/update.py:169
 msgid "No package found for this resource, cannot check auth."
 msgstr ""
+"No s'ha trobat cap paquet per aquest recurs, no es pot comprovar "
+"l'autorització."
 
 #: ckan/logic/action/update.py:184 ckan/logic/action/update.py:223
 #: ckan/logic/action/update.py:329
 #, python-format
 msgid "REST API: Update object %s"
-msgstr ""
+msgstr "API REST: Actualitzat objecte %s"
 
 #: ckan/logic/action/update.py:205 ckan/logic/action/update.py:248
 msgid "Package was not found."
@@ -835,7 +895,7 @@
 #: ckan/logic/action/update.py:270
 #, python-format
 msgid "REST API: Update package relationship: %s %s %s"
-msgstr ""
+msgstr "API REST: Actualitzada la relació entre paquets: %s %s %s"
 
 #: ckan/logic/auth/create.py:12
 #, python-format
@@ -965,64 +1025,65 @@
 #: ckan/model/package_relationship.py:48
 #, python-format
 msgid "depends on %s"
-msgstr ""
+msgstr "depens de %s"
 
 #: ckan/model/package_relationship.py:48
 #, python-format
 msgid "is a dependency of %s"
-msgstr ""
+msgstr "és una dependència de %s"
 
 #: ckan/model/package_relationship.py:49
 #, python-format
 msgid "derives from %s"
-msgstr ""
+msgstr "deriva de %s"
 
 #: ckan/model/package_relationship.py:49
 #, python-format
 msgid "has derivation %s"
-msgstr ""
+msgstr "té la derivació %s"
 
 #: ckan/model/package_relationship.py:50
 #, python-format
 msgid "links to %s"
-msgstr ""
+msgstr "enllaça amb %s"
 
 #: ckan/model/package_relationship.py:50
 #, python-format
 msgid "is linked from %s"
-msgstr ""
+msgstr "és enllaçat des de %s"
 
 #: ckan/model/package_relationship.py:51
 #, python-format
 msgid "is a child of %s"
-msgstr ""
+msgstr "és un fill de %s"
 
 #: ckan/model/package_relationship.py:51
 #, python-format
 msgid "is a parent of %s"
-msgstr ""
+msgstr "és un progenitor de %s"
 
 #: ckan/model/package_relationship.py:55
 #, python-format
 msgid "has sibling %s"
-msgstr ""
+msgstr "té el germà %s"
 
 #: ckan/templates/_util.html:74 ckan/templates/_util.html:120
 msgid "This dataset satisfies the Open Definition."
-msgstr ""
+msgstr "Aquest paquet compleix la Open Definition."
 
 #: ckan/templates/_util.html:75 ckan/templates/_util.html:121
 #: ckan/templates/package/read.html:119
 msgid "[Open Data]"
-msgstr ""
+msgstr "[Dades Obertes]"
 
 #: ckan/templates/_util.html:82 ckan/templates/_util.html:128
+msgstr "[Contingut obert]"
 msgid "Not Openly Licensed"
-msgstr ""
+msgstr "No té una llicència oberta"
 
 #: ckan/templates/_util.html:147 ckan/templates/_util.html:160
 msgid "Number of datasets"
-msgstr ""
+msgstr "Nombre de paquets"
 
 #: ckan/templates/_util.html:147 ckan/templates/_util.html:160
 #: ckan/templates/group/new_group_form.html:27
@@ -1031,61 +1092,63 @@
 #: ckan/templates/package/new_package_form.html:127
 #: ckan/templates/package/read_core.html:18
 msgid "Description"
-msgstr ""
+msgstr "Descripció"
 
 #: ckan/templates/_util.html:173
 msgid "Number of members"
-msgstr ""
+msgstr "Nombre de membres"
 
 #: ckan/templates/_util.html:193
 msgid "View dataset resources"
-msgstr ""
+msgstr "Veure recursos del paquet"
 
 #: ckan/templates/_util.html:193
 msgid "DOWNLOAD"
-msgstr ""
+msgstr "DESCARREGAR"
 
 #: ckan/templates/_util.html:196
 msgid "No downloadable resources."
-msgstr ""
+msgstr "No hi ha recursos per a descarregar"
 
 #: ckan/templates/_util.html:214
 msgid "no ratings yet"
-msgstr ""
+msgstr "encara no hi ha valoracions"
 
 #: ckan/templates/_util.html:215
 msgid ""
 "–\n"
 "    rate it now"
 msgstr ""
+"–\n"
+"    afegeix una valoració"
 
 #: ckan/templates/_util.html:233 ckan/templates/_util.html:303
 msgid "User"
-msgstr ""
+msgstr "Usuari"
 
 #: ckan/templates/_util.html:268 ckan/templates/_util.html:324
 msgid "User Group"
-msgstr ""
+msgstr "Grup d'usuaris"
 
 #: ckan/templates/_util.html:345 ckan/templates/_util.html:395
 #: ckan/templates/group/history.html:35 ckan/templates/package/history.html:37
 #: ckan/templates/revision/read.html:5
 msgid "Revision"
-msgstr ""
+msgstr "Revisió"
 
 #: ckan/templates/_util.html:345 ckan/templates/_util.html:395
 #: ckan/templates/group/history.html:35 ckan/templates/package/history.html:37
 msgid "Timestamp"
-msgstr ""
+msgstr "Marca horària"
 
 #: ckan/templates/_util.html:345 ckan/templates/_util.html:395
 msgid "Entity"
-msgstr ""
+msgstr "Entitat"
 
 #: ckan/templates/_util.html:345 ckan/templates/_util.html:395
 #: ckan/templates/group/history.html:35 ckan/templates/package/history.html:37
 msgid "Log Message"
-msgstr ""
+msgstr "Missatge de registre"
 
 #: ckan/templates/_util.html:369 ckan/templates/_util.html:419
 #: ckan/templates/group/new_group_form.html:49
@@ -1093,74 +1156,78 @@
 #: ckan/templates/package/new_package_form.html:227
 #: ckan/templates/revision/read.html:20
 msgid "Delete"
-msgstr ""
+msgstr "Esborrar"
 
 #: ckan/templates/_util.html:372 ckan/templates/_util.html:422
 #: ckan/templates/revision/read.html:23
 msgid "Undelete"
-msgstr ""
+msgstr "Restaurar"
 
 #: ckan/templates/error_document_template.html:5
 msgid "Error"
-msgstr ""
+msgstr "Error"
 
 #: ckan/templates/layout_base.html:55
 msgid "My account"
-msgstr ""
+msgstr "El meu compte"
 
 #: ckan/templates/layout_base.html:56 ckan/templates/user/logout.html:8
 msgid "Logout"
-msgstr ""
+msgstr "Tancar sessió"
 
 #: ckan/templates/layout_base.html:59 ckan/templates/user/login.html:51
 msgid "Login"
-msgstr ""
+msgstr "Iniciar sessió"
 
 #: ckan/templates/layout_base.html:60 ckan/templates/user/login.html:26
 msgid "Register"
-msgstr ""
+msgstr "Registrar-se"
 
 #: ckan/templates/layout_base.html:76 ckan/templates/package/search.html:24
 msgid "Add a dataset"
-msgstr ""
+msgstr "Saltar al contingut"
+msgstr "Inici"
 
 #: ckan/templates/layout_base.html:77
 #: ckan/templates/package/search_form.html:17
 msgid "Search"
-msgstr ""
+msgstr "Cerca"
 
 #: ckan/templates/layout_base.html:80 ckan/templates/layout_base.html:123
 #: ckan/templates/layout_base.html:126 ckan/templates/home/about.html:6
+msgstr "Afegir un paquet"
 msgid "About"
-msgstr ""
+msgstr "Quant a"
 
 #: ckan/templates/layout_base.html:103
 msgid "Master content template placeholder … please replace me."
-msgstr ""
+msgstr "Text de mostra de la plantilla principal … si us plau, reemplaceu-me"
 
 #: ckan/templates/layout_base.html:128
 msgid "Twitter @ckanproject"
-msgstr ""
+msgstr "Paquets"
+msgstr "Registrar un nou Paquet"
+msgstr "Historial de revisions"
 
 #: ckan/templates/layout_base.html:130 ckan/templates/package/search.html:46
 msgid "API"
-msgstr ""
+msgstr "API"
 
 #: ckan/templates/layout_base.html:131 ckan/templates/package/search.html:47
 msgid "API Docs"
-msgstr ""
+msgstr "Documentació de la API"
 
 #: ckan/templates/layout_base.html:133
 msgid "Contact Us"
-msgstr ""
+msgstr "Bolcat total en %s"
 
 #: ckan/templates/layout_base.html:136 ckan/templates/user/login.html:28
 msgid "Privacy Policy"
-msgstr ""
+msgstr "Grups i Etiquetes"
 
 #: ckan/templates/layout_base.html:142
 msgid "Sections"
-msgstr ""
+msgstr "Crear un nou Grup"
 
 #: ckan/templates/layout_base.html:151 ckan/templates/group/history.html:12
 #: ckan/templates/package/history.html:23
@@ -1172,74 +1239,76 @@
 #: ckan/templates/authorization_group/index.html:7
 #: ckan/templates/authorization_group/layout.html:23
 msgid "Authorization Groups"
-msgstr ""
+msgstr "Grups d'autorització"
 
 #: ckan/templates/layout_base.html:161
 msgid "Site Admin"
-msgstr ""
+msgstr "Crear un nou grup d'autorització"
+msgstr "Pàgina principal del projecte"
 
 #: ckan/templates/layout_base.html:169
 msgid "Languages"
-msgstr ""
+msgstr "Contacteu-nos"
 
 #: ckan/templates/layout_base.html:189
 msgid "Meta"
-msgstr ""
+msgstr "Política de privacitat"
 
 #: ckan/templates/layout_base.html:193
 msgid "Open Knowledge Foundation"
-msgstr ""
+msgstr "Idioma"
 
 #: ckan/templates/layout_base.html:193
 msgid "Licensed under the"
-msgstr ""
+msgstr "Crèdits"
 
 #: ckan/templates/layout_base.html:194
 #: ckan/templates/package/new_package_form.html:260
 msgid "Open Database License"
 msgstr ""
+"[1:]\n"
+"                Un\n"
+"                projecte de la [2:Open Knowledge Foundation]"
 
 #: ckan/templates/layout_base.html:195
 msgid "This Content and Data is Open"
-msgstr ""
+msgstr "Open Knowledge Foundation"
 
 #: ckan/templates/layout_base.html:197
 msgid "Powered by"
-msgstr ""
+msgstr "Aquest contigut i dades són oberts"
 
 #: ckan/templates/layout_base.html:198
 msgid "CKAN"
-msgstr ""
+msgstr "CKAN"
 
 #: ckan/templates/layout_base.html:198
 msgid "v"
-msgstr ""
+msgstr "Funciona amb CKAN"
 
 #: ckan/templates/layout_base.html:225
 msgid ""
 "$(document).ready(function() {\n"
-"        var ckan_user = $.cookie(\"ckan_display_name\");\n"
+msgstr "v%(version)s"
 "        if (ckan_user) {\n"
 "            $(\".ckan-logged-out\").hide();\n"
 "            $(\".ckan-logged-in\").show();\n"
 "        }\n"
 "        $('input[placeholder], textarea[placeholder]').placeholder();\n"
 "    });"
-msgstr ""
 
 #: ckan/templates/authorization_group/authz.html:5
 msgid "- Authorization - AuthorizationGroups"
-msgstr ""
+msgstr "- Autorització - Grups d'autorització"
 
 #: ckan/templates/authorization_group/authz.html:6
 #: ckan/templates/group/authz.html:6 ckan/templates/package/authz.html:6
-msgid "Authorization:"
-msgstr ""
+msgstr "Autorització per als Grups d'autorització:"
 
 #: ckan/templates/authorization_group/authz.html:9
 #: ckan/templates/group/authz.html:9 ckan/templates/package/authz.html:9
 msgid "Update Existing Roles"
-msgstr ""
+msgstr "Actualitzar rols existents"
 
 #: ckan/templates/authorization_group/authz.html:13
 #: ckan/templates/authorization_group/authz.html:31
@@ -1251,66 +1320,65 @@
 #: ckan/templates/user/edit_user_form.html:39
 #: ckan/templates/user/perform_reset.html:23
 msgid "Save"
-msgstr ""
+msgstr "Desar"
 
 #: ckan/templates/authorization_group/authz.html:18
 #: ckan/templates/group/authz.html:18 ckan/templates/package/authz.html:18
 msgid "Add Roles for Any User"
-msgstr ""
+msgstr "Afegir rols per a qualsevol usuari"
 
 #: ckan/templates/authorization_group/authz.html:22
 #: ckan/templates/authorization_group/authz.html:40
 #: ckan/templates/group/authz.html:22 ckan/templates/group/authz.html:40
 #: ckan/templates/package/authz.html:22 ckan/templates/package/authz.html:40
 msgid "Add"
-msgstr ""
+msgstr "Afegir"
 
 #: ckan/templates/authorization_group/authz.html:27
 msgid "Existing Roles for Authorization Groups"
-msgstr ""
+msgstr "Rols existents per als Grups d'autorització"
 
 #: ckan/templates/authorization_group/authz.html:36
 #: ckan/templates/group/authz.html:36 ckan/templates/package/authz.html:36
 msgid "Add Roles for Any Authorization Group"
-msgstr ""
+msgstr "Afegir rols per a qualsevol Grup d'autorització"
 
 #: ckan/templates/authorization_group/edit.html:5
 msgid "- Edit - Authorization Groups"
-msgstr ""
+msgstr "- Editar - Grups d'autorització"
 
 #: ckan/templates/authorization_group/edit.html:6
 #: ckan/templates/group/edit.html:6 ckan/templates/package/edit.html:7
-msgid "Edit:"
-msgstr ""
+msgstr "Editar Grup d'autorització"
 
 #: ckan/templates/authorization_group/edit_form.html:10
 #: ckan/templates/user/list.html:6 ckan/templates/user/list.html:7
 msgid "Users"
-msgstr ""
+msgstr "Usuaris"
 
 #: ckan/templates/authorization_group/edit_form.html:18
 msgid "There are no users currently in this group."
-msgstr ""
+msgstr "Actualment no hi ha usuaris en aquest grup."
 
 #: ckan/templates/authorization_group/index.html:10
 #, python-format
 msgid "There are [1:%(item_count)s] authorization groups."
-msgstr ""
+msgstr "Hi ha [1:%(item_count)s] grups d'autorització."
 
 #: ckan/templates/authorization_group/layout.html:11
 #: ckan/templates/group/layout.html:26 ckan/templates/package/layout.html:11
 msgid "View"
-msgstr ""
+msgstr "Veure"
 
 #: ckan/templates/authorization_group/layout.html:13
 #: ckan/templates/group/layout.html:28 ckan/templates/package/layout.html:13
 msgid "Edit"
-msgstr ""
+msgstr "Editar"
 
 #: ckan/templates/authorization_group/layout.html:16
 #: ckan/templates/group/layout.html:32 ckan/templates/package/layout.html:17
 msgid "Authorization"
-msgstr ""
+msgstr "Autorització"
 
 #: ckan/templates/authorization_group/layout.html:24
 msgid ""
@@ -1321,96 +1389,102 @@
 "          [1:authorization group] can be set-up and users can be added to"
 " it."
 msgstr ""
+"En comptes d'especificar els privilegis d'usuaris específics sobre un "
+"paquet o grup,\n"
+"          també podeu especificar un conjunt d'usuaris que compartiran "
+"els mateixos drets. Per fer-ho, an    \n"
+"          es pot crear un [1:grup d'autorització] i afegir-hi usuaris."
 
 #: ckan/templates/authorization_group/layout.html:28
 msgid "To create a new authorization group, please first"
-msgstr ""
+msgstr "Per a crear un grup d'autorització, si us plau"
 
 #: ckan/templates/authorization_group/layout.html:29
 #: ckan/templates/group/layout.html:15
 msgid "login"
-msgstr ""
+msgstr "inicieu la sessió"
 
 #: ckan/templates/authorization_group/layout.html:32
 msgid "Create a new authorization group"
-msgstr ""
+msgstr "Crear un nou grup d'autorització"
 
 #: ckan/templates/authorization_group/new.html:5
 msgid "New - Authorization Groups"
-msgstr ""
+msgstr "Nou - Grups d'autorització"
 
 #: ckan/templates/authorization_group/new.html:6
 msgid "New Authorization Group"
-msgstr ""
+msgstr "Nou Grups d'autorització"
 
 #: ckan/templates/authorization_group/read.html:6
 msgid "- Authorization Groups"
-msgstr ""
+msgstr " - Grups d'autorització"
 
 #: ckan/templates/authorization_group/read.html:10
 msgid "Members"
-msgstr ""
+msgstr "Administradors:"
+msgstr "Usuaris:"
 
 #: ckan/templates/authorization_group/read.html:11
 #, python-format
 msgid "There are %(item_count)s users in this authorization group."
-msgstr ""
+msgstr "Hi ha %(item_count)s usuaris en aquest grup d'autorització."
 
 #: ckan/templates/group/authz.html:5
 msgid "- Authorization - Groups"
-msgstr ""
+msgstr "- Autorització - Grups"
 
 #: ckan/templates/group/authz.html:27 ckan/templates/package/authz.html:27
 msgid "Update Existing Roles for Authorization Groups"
-msgstr ""
+msgstr "Autorització per al grup:"
 
 #: ckan/templates/group/edit.html:5
 msgid "- Edit - Groups"
-msgstr ""
+msgstr "- Editar - Grups"
 
 #: ckan/templates/group/edit_form.html:10
 #: ckan/templates/group/new_group_form.html:66
-#: ckan/templates/revision/read.html:45
+msgstr "Editar Grup:"
 msgid "Datasets"
-msgstr ""
 
 #: ckan/templates/group/edit_form.html:17
 #: ckan/templates/group/new_group_form.html:75
 msgid "There are no datasets currently in this group."
-msgstr ""
+msgstr "Actualment no hi ha paquets dins d'aquest grup."
 
 #: ckan/templates/group/history.html:5
 msgid "- Groups - History"
-msgstr ""
+msgstr "- Grups - Historial"
 
 #: ckan/templates/group/history.html:18 ckan/templates/package/history.html:16
+msgstr "Revisions"
 msgid "Subscribe »"
-msgstr ""
+msgstr "Subscriure's »"
 
 #: ckan/templates/group/history.html:27 ckan/templates/package/history.html:29
 #: ckan/templates/package/new.html:24
 msgid "Error:"
-msgstr ""
+msgstr "Error:"
 
 #: ckan/templates/group/history.html:52 ckan/templates/package/history.html:55
 msgid "Compare »"
-msgstr ""
+msgstr "Comparar »"
 
 #: ckan/templates/group/history.html:57
 msgid "Group History"
-msgstr ""
+msgstr "Historial del grup"
 
 #: ckan/templates/group/index.html:6 ckan/templates/group/index.html:7
 msgid "Groups of Datasets"
-msgstr ""
+msgstr "Grups de Paquets de dades"
 
 #: ckan/templates/group/index.html:10
 msgid "#minornavigation { visibility: hidden; }"
-msgstr ""
+msgstr "Hi ha [1:%(item_count)s] grups."
 
 #: ckan/templates/group/layout.html:11
 msgid "Groups section"
-msgstr ""
+msgstr "Secció dels grups"
 
 #: ckan/templates/group/layout.html:12
 msgid ""
@@ -1419,18 +1493,22 @@
 "[1:group] can be set-up to specify which users have permission to add or "
 "remove datasets from it."
 msgstr ""
+"Tot i que les etiquetes són molt útils per agrupar paquets, hi ha "
+"ocasions en que cal restringir l'edició dins d'una col·lecció als "
+"usuaris. Es pot crear un [1:grup] per especificar quins usuaris tenen "
+"permís per afegir-hi o eliminar-ne paquets. "
 
 #: ckan/templates/group/layout.html:14
 msgid "To create a new group, please first"
-msgstr ""
+msgstr "Per a crear un grup, si us plau"
 
 #: ckan/templates/group/layout.html:18
 msgid "Create a new group"
-msgstr ""
+msgstr "Crear un nou grup"
 
 #: ckan/templates/group/layout.html:30 ckan/templates/package/layout.html:15
 msgid "History"
-msgstr ""
+msgstr "Historial"
 
 #: ckan/templates/group/layout.html:35 ckan/templates/package/layout.html:20
 #: ckan/templates/revision/list.html:13
@@ -1439,11 +1517,11 @@
 
 #: ckan/templates/group/new.html:5
 msgid "New - Groups"
-msgstr ""
+msgstr "Nou - Grups"
 
 #: ckan/templates/group/new.html:6
 msgid "New Group"
-msgstr ""
+msgstr "Nou grup"
 
 #: ckan/templates/group/new_group_form.html:8
 #: ckan/templates/package/form.html:7
@@ -1451,7 +1529,7 @@
 #: ckan/templates/user/edit_user_form.html:8
 #: ckan/templates/user/new_user_form.html:8
 msgid "Errors in form"
-msgstr ""
+msgstr "Errors en el formulari"
 
 #: ckan/templates/group/new_group_form.html:9
 #: ckan/templates/package/form.html:8
@@ -1459,45 +1537,45 @@
 #: ckan/templates/user/edit_user_form.html:9
 #: ckan/templates/user/new_user_form.html:9
 msgid "The form contains invalid entries:"
-msgstr ""
+msgstr "El formulari conté camps incorrectes:"
 
 #: ckan/templates/group/new_group_form.html:18
 msgid "Name *"
-msgstr ""
+msgstr "Nom *"
 
 #: ckan/templates/group/new_group_form.html:20
 msgid "Unique identifier"
-msgstr ""
+msgstr "Identificador únic"
 
 #: ckan/templates/group/new_group_form.html:20
 msgid "for group."
-msgstr ""
+msgstr "per al grup."
 
 #: ckan/templates/group/new_group_form.html:20
 msgid "2+ chars, lowercase, using only 'a-z0-9' and '-_'"
-msgstr ""
+msgstr "Més de 2 caràcters, en minúscules, usant només 'a-z0-9' i '-_'"
 
 #: ckan/templates/group/new_group_form.html:33
 #: ckan/templates/package/new_package_form.html:211
 msgid "active"
-msgstr ""
+msgstr "actiu"
 
 #: ckan/templates/group/new_group_form.html:34
 #: ckan/templates/package/new_package_form.html:212
 msgid "deleted"
-msgstr ""
+msgstr "esborrat"
 
 #: ckan/templates/group/new_group_form.html:54
 #: ckan/templates/package/form_extra_fields.html:12
 #: ckan/templates/package/new_package_form.html:232
 msgid "New key"
-msgstr ""
+msgstr "Nova clau"
 
 #: ckan/templates/group/new_group_form.html:56
 #: ckan/templates/package/form_extra_fields.html:26
 #: ckan/templates/package/new_package_form.html:234
 msgid "with value"
-msgstr ""
+msgstr "amb valor"
 
 #: ckan/templates/group/new_group_form.html:79
 msgid "Add datasets"
@@ -1509,15 +1587,15 @@
 
 #: ckan/templates/group/read.html:6
 msgid "- Groups"
-msgstr ""
+msgstr "- Grups"
 
 #: ckan/templates/group/read.html:10
 msgid "No Title"
-msgstr ""
+msgstr "Sense títol"
 
 #: ckan/templates/group/read.html:24
 msgid "Administrators"
-msgstr ""
+msgstr "Paquets:"
 
 #: ckan/templates/group/read.html:35
 msgid "Datasets:"
@@ -1526,11 +1604,11 @@
 #: ckan/templates/group/read.html:36
 #, python-format
 msgid "There are %(item_count)s datasets in this group."
-msgstr ""
+msgstr "Hi ha %(item_count)s paquets en aquest grup."
 
 #: ckan/templates/home/about.html:9
 msgid "About CKAN"
-msgstr ""
+msgstr "Quant a CKAN"
 
 #: ckan/templates/home/about.html:11
 msgid ""
@@ -1538,6 +1616,9 @@
 "[2:open knowledge] datasets and projects\n"
 "    (and a few closed ones)."
 msgstr ""
+"CKAN és la Comprehensive Knowledge Archive Network, un [1:registre] de "
+"paquets i projectes de [2:coneixement obert]\n"
+"    (i alguns de tancat)."
 
 #: ckan/templates/home/about.html:15
 msgid ""
@@ -1545,14 +1626,16 @@
 "      content and data], especially in ways that are machine\n"
 "      automatable."
 msgstr ""
+"CKAN fa molt fàcil [1:trobar, compartir i reusar contingut\n"
+"      i dades obertes], especialment de forma automatitzable."
 
 #: ckan/templates/home/about.html:20
 msgid "As a system CKAN functions as a synthesis of several different services:"
-msgstr ""
+msgstr "Com a sistema, CKAN funciona com una síntesi de molts altres serveis:"
 
 #: ckan/templates/home/about.html:22
 msgid "CKAN Features Overview"
-msgstr ""
+msgstr "Resum de les capacitats de CKAN"
 
 #: ckan/templates/home/about.html:24
 msgid ""
@@ -1561,6 +1644,11 @@
 "but for open data and\n"
 "\t\tcontent resources. However it adds to a simple registry in key ways."
 msgstr ""
+"Com mostra el diagrama, CKAN combina les capacitats d'un "
+"llistat/registre,\n"
+"\t\tun índex de paquets i una wiki. Com a registre és similar a "
+"[1:freshmeat], però per a dades obertes i\n"
+"\t\trecursos. Però és molt més que un simple registre."
 
 #: ckan/templates/home/about.html:29
 msgid ""
@@ -1576,6 +1664,18 @@
 "\t\tagain for [4:open data and content]\n"
 "\t\tnot code."
 msgstr ""
+"En primer lloc, gràcies al [1:model de domini versionat] subjacent, CKAN "
+"disposa d'una\n"
+"\t\tinterfície de tipus wiki que permet a qualsevol persona afegir i "
+"modificar el material contingut. En segon lloc,\n"
+"\t\ti al contrari que una wiki, CKAN pot emmagatzemar informació "
+"'estructurada', cosa que li permet\n"
+"\t\toferir funcionalitats de tipus 'index' com per exemple registre, "
+"descoberta i instal·lació automàtiques\n"
+"\t\tde material. En aquest sentit, es comporta com [2:CPAN] o [3:PyPI] en"
+" el món del software -- tot i que,\n"
+"\t\tcom ja hem dit, per a [4:dades i continguts oberts]\n"
+"\t\ti no codi."
 
 #: ckan/templates/home/about.html:40
 msgid ""
@@ -1583,10 +1683,13 @@
 "    be found in [1:these\n"
 "      slides]."
 msgstr ""
+"Més informació sobre CKAN, i el context de la seva creació es\n"
+"    pot trobar en [1:aquesta\n"
+"      presentació]."
 
 #: ckan/templates/home/index.html:6
 msgid "Welcome"
-msgstr ""
+msgstr "Benvingut a"
 
 #: ckan/templates/home/index.html:7 ckan/templates/package/edit.html:9
 #: ckan/templates/package/new.html:9
@@ -1692,22 +1795,28 @@
 "          margin-bottom: 1.5em;\n"
 "        }"
 msgstr ""
+"%(title)s és un\n"
+"      [1:registre obert]\n"
+"      de dades i paquets de continguts. Aprofitant les capacitats de "
+"CKAN, aquest\n"
+"      lloc fa fàcil trobar, compartir i reusar contingut i dades,\n"
+"      especialment de forma automatitzable."
 
 #: ckan/templates/home/index.html:113
 msgid "Welcome to"
-msgstr ""
+msgstr "[1:%(package_count)s paquets de dades registrats] disponibles."
 
 #: ckan/templates/home/index.html:117
 msgid "Find data"
-msgstr ""
+msgstr "Etiquetes més usades"
 
 #: ckan/templates/home/index.html:122
 msgid "contains"
-msgstr ""
+msgstr "Paquets canviats recentment"
 
 #: ckan/templates/home/index.html:122
 msgid "datasets"
-msgstr ""
+msgstr "Veure registre de revisions »"
 
 #: ckan/templates/home/index.html:122
 msgid ""
@@ -1742,35 +1851,44 @@
 "Find out more about working with open data by exploring \n"
 "        these resources:"
 msgstr ""
+"Tot el material d'aquest lloc és [1:obert] i pot ser lliurement usat, "
+"reusat\n"
+"    i redistribuït. De manera formal, les dades/base de dades tenen una "
+"llicència [2:Open Data Commons Open\n"
+"      Database License v1.0], amb tot el contigut susceptible de tenir "
+"copyright en aquesta\n"
+"    base de dades, així com qualsevol contingut addicional d'aquest lloc,"
+" ofert amb una llicència [3:Creative Commons\n"
+"      Attribution Share-Alike v3.0 license]."
 
 #: ckan/templates/home/index.html:148
 msgid "GetTheData.org"
-msgstr ""
+msgstr "- Autorització - Paquets de dades"
 
 #: ckan/templates/home/index.html:149
 msgid "DataPatterns.org"
-msgstr ""
+msgstr "Autorització èr al paquet de dades:"
 
 #: ckan/templates/home/index.html:150
 msgid "Open Data Manual"
-msgstr ""
+msgstr "- Paquets de dades - Historial"
 
 #: ckan/templates/home/index.html:155
 msgid "Who else is here?"
-msgstr ""
+msgstr "- Editar - Paquets de dades"
 
 #: ckan/templates/home/index.html:163
 msgid "has"
-msgstr ""
+msgstr "hide-sidebar"
 
 #: ckan/templates/home/index.html:163
 msgid "datasets."
-msgstr ""
+msgstr "Editar paquet de dades:"
 
 #: ckan/templates/package/authz.html:5
 msgid "- Authorization - Datasets"
 msgstr ""
-
+msgstr "Previsualització"
 #: ckan/templates/package/comments.html:5 ckan/templates/package/history.html:6
 msgid "- Datasets - History"
 msgstr ""
@@ -1781,12 +1899,11 @@
 
 #: ckan/templates/package/edit.html:21
 msgid "Basic Information"
-msgstr ""
 
 #: ckan/templates/package/edit_form.html:13
 #: ckan/templates/package/new_package_form.html:243
 msgid "Edit summary (briefly describe the changes you have made)"
-msgstr ""
+msgstr "Resum de l'edició (descriviu breument els canvis realitzats)"
 
 #: ckan/templates/package/edit_form.html:17
 #: ckan/templates/package/edit_form.html:20
@@ -1794,62 +1911,64 @@
 #: ckan/templates/package/new_package_form.html:250
 #: ckan/templates/revision/read.html:36
 msgid "Author:"
-msgstr ""
+msgstr "Autor:"
 
 #: ckan/templates/package/edit_form.html:21
 #: ckan/templates/package/new_package_form.html:251
 msgid "Since you have not signed in this will just be your IP address."
-msgstr ""
+msgstr "Com que no heu iniciat sessió, s'usarà la vostra adreça IP."
 
 #: ckan/templates/package/edit_form.html:23
 #: ckan/templates/package/new_package_form.html:253
 msgid "Click here to sign in"
-msgstr ""
+msgstr "Feu clic aquí per iniciar sessió"
 
 #: ckan/templates/package/edit_form.html:23
 #: ckan/templates/package/new_package_form.html:253
 msgid "before saving (opens in new window)."
-msgstr ""
+msgstr "abans de desar (s'obre en una nova finestra)."
 
 #: ckan/templates/package/edit_form.html:33
 #: ckan/templates/package/new_package_form.html:259
 msgid "Important:"
-msgstr ""
+msgstr "Important:"
 
 #: ckan/templates/package/edit_form.html:33
 msgid ""
 "By submitting content, you agree to release your contributions\n"
 "        under the open license specified on the"
 msgstr ""
+"Enviant aquest contingut, accepteu de publicar les vostres contribucions\n"
+"        sota la llicència oberta especificada en la"
 
 #: ckan/templates/package/edit_form.html:34
 msgid "license page"
-msgstr ""
+msgstr "pàgina de la llicència"
 
 #: ckan/templates/package/edit_form.html:35
 #: ckan/templates/package/new_package_form.html:260
 msgid ". Please"
-msgstr ""
+msgstr ". Si us plau"
 
 #: ckan/templates/package/edit_form.html:35
 #: ckan/templates/package/new_package_form.html:260
 msgid "refrain"
-msgstr ""
+msgstr "eviteu"
 
 #: ckan/templates/package/edit_form.html:35
 #: ckan/templates/package/new_package_form.html:260
 msgid "from editing this page if you are"
-msgstr ""
+msgstr "editar aquesta pàgina si"
 
 #: ckan/templates/package/edit_form.html:35
 #: ckan/templates/package/new_package_form.html:260
 msgid "not"
-msgstr ""
+msgstr "no"
 
 #: ckan/templates/package/edit_form.html:35
 #: ckan/templates/package/new_package_form.html:260
 msgid "happy to do this."
-msgstr ""
+msgstr "hi esteu d'acord."
 
 #: ckan/templates/package/history.html:7
 msgid "History:"
@@ -1857,31 +1976,31 @@
 
 #: ckan/templates/package/history.html:12
 msgid "Updates"
-msgstr ""
+msgstr "Actualitzacions"
 
 #: ckan/templates/package/history.html:60 ckan/templates/package/read.html:158
 msgid "Dataset History"
-msgstr ""
+msgstr "- Historial"
 
 #: ckan/templates/package/new.html:6
 msgid "Add - Datasets"
-msgstr ""
+msgstr "Id de la revisió"
 
 #: ckan/templates/package/new.html:7
 msgid "Add a Dataset"
-msgstr ""
+msgstr "Paquet amb marca horària"
 
 #: ckan/templates/package/new_package_form.html:16
 msgid "Resource"
-msgstr ""
+msgstr "Historial del paquet"
 
 #: ckan/templates/package/new_package_form.html:41
 msgid "Slug *"
-msgstr ""
+msgstr "Nou - Paquets de dades"
 
 #: ckan/templates/package/new_package_form.html:43
 msgid "A unique identifier used in urls. Renaming is possible but discouraged."
-msgstr ""
+msgstr "Registrar un nou Paquet de dades"
 
 #: ckan/templates/package/new_package_form.html:47
 msgid "Home Page"
@@ -1898,25 +2017,27 @@
 
 #: ckan/templates/package/new_package_form.html:61
 msgid "You can use"
-msgstr ""
+msgstr "Podeu usar"
 
 #: ckan/templates/package/new_package_form.html:61
 msgid "Markdown formatting"
-msgstr ""
+msgstr "el format Markdown"
 
 #: ckan/templates/package/new_package_form.html:61
 msgid "here."
-msgstr ""
+msgstr "en aquest camp."
 
 #: ckan/templates/package/new_package_form.html:83
 msgid ""
 "Terms that may link this dataset to similar ones. For more information on"
 " conventions, see"
 msgstr ""
+"Terme que poden enllaçar aquest conjunt de dades a altres similars. Per a"
+" més informació sobre convencions, vegeu"
 
 #: ckan/templates/package/new_package_form.html:83
 msgid "this wiki page"
-msgstr ""
+msgstr "aquesta pàgina de la wiki"
 
 #: ckan/templates/package/new_package_form.html:90
 msgid "Resources: the files and APIs associated with this dataset"
@@ -1924,83 +2045,96 @@
 
 #: ckan/templates/package/new_package_form.html:95
 msgid "URL*"
-msgstr ""
+msgstr "URL*"
 
 #: ckan/templates/package/new_package_form.html:96
 #: ckan/templates/package/new_package_form.html:123
 #: ckan/templates/package/read_core.html:19
 msgid "Format"
-msgstr ""
+msgstr "Format"
 
 #: ckan/templates/package/new_package_form.html:119
 msgid "Url"
-msgstr ""
+msgstr "Hash"
 
 #: ckan/templates/package/new_package_form.html:131
 msgid "Hash"
 msgstr ""
+"Podeu afegir-ne tants com sigui necessari. Per exemple, si les dades "
+"s'ofereixen en múltiples formats o separades en diferents àrees o "
+"períodes de temps, cada arxiu és un 'recurs' diferent, que hauria de ser "
+"descrit diferentment. Tots ells apareixeran junts a la pàgina del conjunt"
+" de dades de CKAN."
 
 #: ckan/templates/package/new_package_form.html:135
 msgid "Id"
-msgstr ""
+msgstr "URL:"
 
 #: ckan/templates/package/new_package_form.html:151
 msgid "Add a resource:"
 msgstr ""
+"Aquest és un enllaç directe a les dades a través d'Internet - "
+"seleccionant aquest enllaç en un navegador web, l'usuari es descarregarà "
+"de forma immediata el conjunt de dades sencer.Tingueu en compte que les "
+"dades no estan allotjades en aquest lloc, sinó per qui les publica. "
+"Alternativament, la URL pot apuntar a un servidor API com un punt d'accés"
+" SPARQL o un servei JSON-P."
 
 #: ckan/templates/package/new_package_form.html:152
 msgid "Upload a file"
-msgstr ""
+msgstr "Format:"
 
 #: ckan/templates/package/new_package_form.html:153
 msgid "Link to a file"
-msgstr ""
+msgstr "Això hauria d'indicar el format de fitxer en que les dades s'ofereixen."
 
 #: ckan/templates/package/new_package_form.html:154
 msgid "Link to an API"
-msgstr ""
+msgstr "Qualsevol informació que vulgueu afegir per a descriure el recurs."
 
 #: ckan/templates/package/new_package_form.html:206
 msgid "e.g. 1.2.0"
-msgstr ""
+msgstr "p.ex. 1.2.0"
 
 #: ckan/templates/package/new_package_form.html:259
 msgid ""
 "By submitting content, you agree to release your contributions\n"
 "    under the"
 msgstr ""
+"Enviant aquest contingut, accepteu de publicar les vostres contribucions\n"
+"        sota la llicència oberta especificada en la"
 
 #: ckan/templates/package/read.html:14
 msgid "- Datasets"
-msgstr ""
+msgstr "- Paquets de dades"
 
 #: ckan/templates/package/read.html:22
 msgid "First time at"
-msgstr ""
+msgstr "És el primer cop que visiteu"
 
 #: ckan/templates/package/read.html:24
 msgid "is a catalogue for data."
-msgstr ""
+msgstr "és un catàleg de dades."
 
 #: ckan/templates/package/read.html:24
 msgid "Click here to find out more ..."
-msgstr ""
+msgstr "Feu clic aquí per saber-ne més"
 
 #: ckan/templates/package/read.html:31 ckan/templates/package/read.html:80
 msgid "Source"
-msgstr ""
+msgstr "Els Grups són col·leccions de paquets de mantinguts per usuaris de"
 
 #: ckan/templates/package/read.html:47
 msgid "Country"
-msgstr ""
+msgstr ". Aquest paquet encara no s'ha afegit a cap grup."
 
 #: ckan/templates/package/read.html:66
 msgid "Groups are collections of dataset maintained by users of"
-msgstr ""
+msgstr "Paquets relacionats"
 
 #: ckan/templates/package/read.html:67
 msgid ". This dataset has not been added to any groups yet."
-msgstr ""
+msgstr "Aquest paquet és Obert"
 
 #: ckan/templates/package/read.html:80
 msgid ""
@@ -2022,87 +2156,108 @@
 
 #: ckan/templates/package/read.html:106
 msgid "License:"
-msgstr ""
+msgstr "Llicència:"
 
 #: ckan/templates/package/read.html:116
 msgid "This dataset satisfies the Open Knowledge Definition."
-msgstr ""
+msgstr "Aquest paquet satisfà la Open Knowledge Definition."
 
 #: ckan/templates/package/read.html:124
 msgid "This dataset is Not Open"
-msgstr ""
+msgstr "Aquest paquet No és Obert"
 
 #: ckan/templates/package/read.html:126
 msgid ""
 "Either because it is not openly licensed or is missing\n"
 "      downloadable resources."
 msgstr ""
+"Perquè no té una llicència oberta o perquè li manquen\n"
+"      recursos descarregables."
 
 #: ckan/templates/package/read.html:129
 msgid "Start an enquiry on IsItOpenData »"
-msgstr ""
+msgstr "Començar una consulta a IsItOpenData »"
 
 #: ckan/templates/package/read.html:138
 msgid "This is an old revision of this dataset, as edited"
-msgstr ""
+msgstr "Aquesta és una revisió antiga d'aquest paquet, editada"
 
 #: ckan/templates/package/read.html:138 ckan/templates/package/read.html:139
 msgid "at"
-msgstr ""
+msgstr "el"
 
 #: ckan/templates/package/read.html:138
 msgid ". It may differ significantly from the"
-msgstr ""
+msgstr ". Pot presentar diferències significatives amb la"
 
 #: ckan/templates/package/read.html:138
 msgid "current revision"
-msgstr ""
+msgstr "revisió actual"
 
 #: ckan/templates/package/read.html:139
 msgid "This is the current revision of this dataset, as edited"
-msgstr ""
+msgstr "Aquesta és la revisió actual d'aquest paquet, editada"
 
 #: ckan/templates/package/read.html:148
 msgid "RDF/XML"
-msgstr ""
+msgstr "RDF/XML"
 
 #: ckan/templates/package/read.html:149
 msgid "RDF/Turtle"
-msgstr ""
+msgstr "RDF/Turtle"
 
 #: ckan/templates/package/read_core.html:31
+msgstr "Font:"
+msgstr "Descàrregues i Recursos"
 msgid "Download"
-msgstr ""
+msgstr "Descarregar"
 
 #: ckan/templates/package/read_core.html:31
 msgid "(no description)"
-msgstr ""
+msgstr "(sense descripció)"
 
 #: ckan/templates/package/read_core.html:39
 #: ckan/templates/package/read_core.html:73
 msgid "(none)"
-msgstr ""
+"Aquesta és una llista de tots els formats i conjunts de dades coneguts "
+"per a"
+msgstr ". Si en coneixeu un altre (CSV, punt d'accés SPARQL, etc.)"
+msgstr "Cap per a aquest paquet"
+msgstr "Quant a aquest paquet"
+msgstr "Falta alguna cosa?"
+msgstr "API / datapkg"
+"La informació d'aquesta pàgina (les metadades del paquet) també es\n"
+"                troba disponible programàticament a través de la "
+msgstr "API de CKAN"
+msgstr "JSON"
+msgstr "RDF"
+msgstr "Turtle"
+msgstr "N-Triples"
+"La informació d'aquesta pàgina i les descàrregues /recursos també es "
+"troben disponibles usant la"
+msgstr "utilitat de línia de commandes datapkg"
+msgstr "Informació sobre aquest paquet:"
+msgstr "$ datapkg info ckan://"
 
 #: ckan/templates/package/read_core.html:58
 msgid "Additional Information"
-msgstr ""
+msgstr "Descàrrega:"
 
 #: ckan/templates/package/read_core.html:62
 #: ckan/templates/revision/diff.html:31
-msgid "Field"
-msgstr ""
+msgstr "$ datapkg download ckan://"
 
 #: ckan/templates/package/read_core.html:63
 msgid "Value"
-msgstr ""
+msgstr "Estat:"
 
 #: ckan/templates/package/resources.html:2
 msgid "Someresources"
-msgstr ""
+msgstr "Someresources"
 
 #: ckan/templates/package/search.html:9 ckan/templates/package/search.html:10
 msgid "Search -"
-msgstr ""
+msgstr "Cerca -"
 
 #: ckan/templates/package/search.html:13
 msgid ""
@@ -2114,249 +2269,257 @@
 
 #: ckan/templates/package/search.html:25
 msgid "Do you know of a dataset that should be added to"
-msgstr ""
+msgstr "Coneixeu algun conjunt de dades que hauria de ser afegit a aquest"
 
 #: ckan/templates/package/search.html:29
 msgid "Register it now"
-msgstr ""
+msgstr "Registreu-lo ara"
 
 #: ckan/templates/package/search.html:38
 msgid "Other access"
-msgstr ""
+msgstr "Altres accessos"
 
 #: ckan/templates/package/search.html:44
 msgid "You can also access this registry using the"
-msgstr ""
+msgstr "També podeu accedir a aquest registre usant la"
 
 #: ckan/templates/package/search.html:46
 msgid "(see"
-msgstr ""
+msgstr "(vegeu"
 
 #: ckan/templates/package/search.html:47
 msgid "or download a"
-msgstr ""
+msgstr "o descarregueu un"
 
 #: ckan/templates/package/search.html:48
 msgid "full"
-msgstr ""
+msgstr "volcat"
 
 #: ckan/templates/package/search.html:48
 msgid "dump"
-msgstr ""
+msgstr "complet"
 
 #: ckan/templates/package/search.html:60
 msgid ""
 "[1:There was an error while searching.] \n"
 "            Please try another search term."
 msgstr ""
+"[1:S'ha produït un error durant la cerca.] \n"
+"            Si us plau, proveu un altre terme."
 
 #: ckan/templates/package/search.html:64
 #, python-format
 msgid "[1:%(item_count)s] datasets found"
-msgstr ""
+msgstr "[1:%(item_count)s] paquets trobats"
 
 #: ckan/templates/package/search.html:67
 msgid "Would you like to [1:create a new dataset?]"
-msgstr ""
+msgstr "Voleu [1:crear un paquet nou?]"
 
 #: ckan/templates/package/search_form.html:15
 msgid "Filter by"
-msgstr ""
+msgstr "Filtrar per"
 
 #: ckan/templates/package/search_form.html:15
 msgid "datasets with open licenses"
-msgstr ""
+msgstr "paquets amb llicències obertes"
 
 #: ckan/templates/package/search_form.html:16
 msgid "datasets with downloads"
-msgstr ""
+msgstr "paquets amb descàrregues"
 
 #: ckan/templates/revision/diff.html:5
 msgid "Differences - Revisions"
-msgstr ""
+msgstr "Diferències - Revisions"
 
 #: ckan/templates/revision/diff.html:8
 msgid "Revision Differences -"
-msgstr ""
+msgstr "Diferències entre revisions -"
 
 #: ckan/templates/revision/diff.html:20
 msgid "From:"
-msgstr ""
+msgstr "Des de:"
 
 #: ckan/templates/revision/diff.html:24
 msgid "To:"
-msgstr ""
+msgstr "Fins a:"
 
 #: ckan/templates/revision/diff.html:31
+msgstr "Camp"
 msgid "Difference"
-msgstr ""
+msgstr "Diferència"
 
 #: ckan/templates/revision/diff.html:39
 msgid "No differences"
-msgstr ""
+msgstr "Sense diferències"
 
 #: ckan/templates/revision/list.html:5 ckan/templates/revision/list.html:6
 msgid "Revision History"
-msgstr ""
+"Aquesta pàgina enumera tots els canvis efectuats al paquet, amb els més "
+"recents\n"
+"    al principi."
+msgstr "Purgar - Revisions"
+msgstr "Purgar una revisió"
 
 #: ckan/templates/revision/list.html:11
 msgid "Home"
-msgstr ""
+msgstr "S'ha produït un error:"
 
 #: ckan/templates/revision/list.html:20
 msgid ""
-"Track the most recent changes to the system, with most recent\n"
+msgstr "Purga satisfactòria"
 "    changes first."
-msgstr ""
 
 #: ckan/templates/revision/read.html:6
 msgid "Revision:"
-msgstr ""
+msgstr "revisió"
 
 #: ckan/templates/revision/read.html:10
 msgid "Revision Actions"
-msgstr ""
+msgstr "Accions sobre la revisió"
 
 #: ckan/templates/revision/read.html:39
+msgstr "Revisió"
 msgid "Timestamp:"
-msgstr ""
+msgstr "Marca horària:"
 
 #: ckan/templates/revision/read.html:41
 msgid "Log Message:"
-msgstr ""
+msgstr "Missatge de registre:"
 
 #: ckan/templates/revision/read.html:44
 msgid "Changes"
-msgstr ""
+msgstr "Canvis"
 
 #: ckan/templates/revision/read.html:54
 msgid "Datasets' Tags"
-msgstr ""
+msgstr "Etiquetes dels paquets"
 
 #: ckan/templates/revision/read.html:57
 msgid "Dataset -"
-msgstr ""
+msgstr "Paquet -"
 
 #: ckan/templates/revision/read.html:58
 msgid ""
 ",\n"
 "      Tag -"
 msgstr ""
+",\n"
+"      Etiqueta -"
 
 #: ckan/templates/tag/index.html:20 ckan/templates/tag/index.html:23
 msgid "There are"
-msgstr ""
+msgstr "Hi ha"
 
 #: ckan/templates/tag/index.html:21
 msgid "results for ‘"
-msgstr ""
+msgstr "resultats per ‘"
 
 #: ckan/templates/tag/index.html:24
 msgid "results for tags."
-msgstr ""
+msgstr "resultats per etiquetes."
 
 #: ckan/templates/tag/index.html:34
 msgid "Clear search"
-msgstr ""
+msgstr "Reiniciar cerca"
 
 #: ckan/templates/tag/index.html:34
 msgid "and see all tags."
-msgstr ""
+msgstr "i veure totes les etiquetes"
 
 #: ckan/templates/tag/read.html:6
 msgid "- Tags"
-msgstr ""
+msgstr "- Etiquetes"
 
 #: ckan/templates/tag/read.html:7
 msgid "Tag:"
-msgstr ""
+msgstr "Etiqueta:"
 
 #: ckan/templates/tag/read.html:10
 #, python-format
 msgid "There are %(count)s datasets tagged with [1:%(tagname)s]:"
-msgstr ""
+msgstr "Hi ha %(package_count)s paquets etiquetats amb [1:%(tagname)s]:"
 
 #: ckan/templates/user/edit.html:6
 msgid "- Edit - User"
-msgstr ""
+msgstr "- Editar - Usuari"
 
 #: ckan/templates/user/edit.html:7
 msgid "Edit User:"
-msgstr ""
+msgstr "Editar Usuari:"
 
 #: ckan/templates/user/edit.html:12
 msgid "(skip to preview)"
-msgstr ""
+msgstr "(saltar a la previsualització)"
 
 #: ckan/templates/user/edit.html:19 ckan/templates/user/edit_user_form.html:15
 msgid "Base details"
-msgstr ""
+msgstr "Nom complet:"
+msgstr "Correu electrònic:"
 
 #: ckan/templates/user/edit.html:20 ckan/templates/user/edit.html:49
 #: ckan/templates/user/edit_user_form.html:17
-msgid "Full name:"
-msgstr ""
+msgstr "Detalls bàsics"
 
 #: ckan/templates/user/edit.html:23 ckan/templates/user/edit_user_form.html:20
 msgid "E-Mail:"
-msgstr ""
+msgstr "Correu electrònic:"
 
 #: ckan/templates/user/edit.html:27 ckan/templates/user/edit_user_form.html:25
 msgid "Change your password"
-msgstr ""
+msgstr "Canviar la vostra contrasenya"
 
 #: ckan/templates/user/edit.html:28 ckan/templates/user/edit_user_form.html:27
 #: ckan/templates/user/login.html:45 ckan/templates/user/new_user_form.html:30
 #: ckan/templates/user/perform_reset.html:15
 msgid "Password:"
-msgstr ""
+msgstr "Contrasenya:"
 
 #: ckan/templates/user/edit.html:31 ckan/templates/user/edit_user_form.html:29
 #: ckan/templates/user/new_user_form.html:34
 #: ckan/templates/user/perform_reset.html:18
 msgid "Password (repeat):"
-msgstr ""
+msgstr "Contrasenya (repetiu-la):"
 
 #: ckan/templates/user/edit.html:35 ckan/templates/user/edit_user_form.html:33
 msgid "About user:"
-msgstr ""
+msgstr "Quant a l'usuari:"
 
 #: ckan/templates/user/edit.html:37 ckan/templates/user/edit_user_form.html:35
 msgid "You can use [1:Markdown formatting] here."
-msgstr ""
+msgstr "Podeu usar [1: format Markdown]."
 
 #: ckan/templates/user/list.html:8
 msgid "user-list"
-msgstr ""
+msgstr "user-list"
 
 #: ckan/templates/user/list.html:16
 #, python-format
-msgid "[1:%(item_count)s] users found."
-msgstr ""
+msgstr "Ordenar per edicions"
 
 #: ckan/templates/user/list.html:27
 msgid "Sort by edits"
-msgstr ""
+msgstr "Ordenar per nom"
 
 #: ckan/templates/user/list.html:30
 msgid "Sort by name"
-msgstr ""
+msgstr "[1:%(item_count)s] usuaris trobats."
 
 #: ckan/templates/user/list.html:43
 msgid "Member for"
-msgstr ""
+msgstr "Membre des de"
 
 #: ckan/templates/user/login.html:21
 msgid "Not a member?"
-msgstr ""
+msgstr "No sou membres?"
 
 #: ckan/templates/user/login.html:22
 msgid "Join CKAN to contribute datasets under your own name."
-msgstr ""
+msgstr "Uniu-vos a CKAN per contribuir paquets amb el vostre propi nom."
 
 #: ckan/templates/user/login.html:33
 msgid "Login - User"
-msgstr ""
+msgstr "Iniciar sessió - Usuari"
 
 #: ckan/templates/user/login.html:34
 msgid "Login to"
@@ -2364,27 +2527,31 @@
 
 #: ckan/templates/user/login.html:42 ckan/templates/user/new_user_form.html:18
 msgid "Login:"
-msgstr ""
+msgstr "Nom d'inici de sessió:"
 
 #: ckan/templates/user/login.html:52
 msgid "Forgot your password?"
-msgstr ""
+msgstr "Heu oblidat la contrasenya?"
 
 #: ckan/templates/user/login.html:60
 msgid "Login using Open ID"
-msgstr ""
+msgstr "Iniciar sessió usant OpenID"
 
 #: ckan/templates/user/login.html:62
 msgid "Please click your account provider:"
-msgstr ""
+msgstr "Si us plau, feu clic en el proveidor del vostre compte:"
 
 #: ckan/templates/user/login.html:66
 msgid "OpenID Identifier:"
 msgstr ""
+"OpenID és un servei que permet iniciar sessió en molts llocs diferents "
+"usant una identitat única.\n"
+"    Trobeu [1:més informació sobre OpenID] i [2:com obtenir un compte que"
+" ofereixi OpenID]."
 
 #: ckan/templates/user/login.html:70
 msgid "Don't have an OpenID?"
-msgstr ""
+msgstr "No teniu una OpenID?"
 
 #: ckan/templates/user/login.html:71
 msgid ""
@@ -2395,28 +2562,39 @@
 "with a\n"
 "          free OpenID provider such as [3:https://www.myopenid.com/]."
 msgstr ""
+"OpenID és un servei que permet iniciar sessió en molts llocs diferents\n"
+"        usant una identitat única. Trobeu [1:més\n"
+"        informació sobre OpenID] i [2:com obtenir un\n"
+"        compte que ofereixi OpenID]. Probablement, la forma més senzilla "
+"és registrar-se\n"
+"        amb un proveidor gratuït d'OpenID com "
+"[3:https://www.myopenid.com/]."
 
 #: ckan/templates/user/logout.html:5
 msgid "Logout - User"
-msgstr ""
+msgstr "Tancar sessió - Usuari"
 
 #: ckan/templates/user/logout.html:9
 msgid "You have logged out successfully."
-msgstr ""
+msgstr "Heu tancat la sessió satisfactòriament."
 
 #: ckan/templates/user/new.html:7
+msgstr "Registre - Usuari"
 msgid "Have an OpenID?"
-msgstr ""
+msgstr "Teniu una OpenID?"
 
 #: ckan/templates/user/new.html:8
 msgid ""
 "If you have an account with Google, Yahoo or one of many other \n"
 "        OpenID providers, you can log in without signing up."
 msgstr ""
+"Si teniu un compte amb Google, Yahoo o un dels diversos \n"
+"        proveidors OpenID, podeu iniciar sessió sense haver de registrar-"
+"vos."
 
 #: ckan/templates/user/new.html:13
 msgid "Log in now"
-msgstr ""
+msgstr "Iniciar sessió ara"
 
 #: ckan/templates/user/new.html:18
 msgid "Register - User"
@@ -2424,79 +2602,79 @@
 
 #: ckan/templates/user/new.html:19
 msgid "Join the community"
-msgstr ""
+msgstr "Uniu-vos a la comunitat"
 
 #: ckan/templates/user/new_user_form.html:16
 msgid "Register with CKAN"
-msgstr ""
+msgstr "Registrar-se amb CKAN"
 
 #: ckan/templates/user/new_user_form.html:20
 msgid "3+ chars, using only 'a-z0-9' and '-_'"
-msgstr ""
+msgstr "Més de 3 caràcters, usant només 'a-z0-9' i '-_'"
 
 #: ckan/templates/user/new_user_form.html:23
 msgid "Full name (optional):"
-msgstr ""
+msgstr "Nom complet (opcional):"
 
 #: ckan/templates/user/new_user_form.html:27
 msgid "E-Mail (optional):"
-msgstr ""
+msgstr "Correu electrònic (opcional):"
 
 #: ckan/templates/user/read.html:5
 msgid "- User"
-msgstr ""
+msgstr "- Usuari"
 
 #: ckan/templates/user/read.html:7
 msgid "user-view"
-msgstr ""
+msgstr "user-view"
 
 #: ckan/templates/user/read.html:11
 msgid "Edit your profile"
-msgstr ""
+msgstr "El meu compte"
 
 #: ckan/templates/user/read.html:12
 msgid "Log out"
-msgstr ""
+msgstr "Heu iniciat sessió."
 
 #: ckan/templates/user/read.html:18
 msgid "Activity"
-msgstr ""
+msgstr "La vostra clau API és:"
 
 #: ckan/templates/user/read.html:20
 msgid "Number of edits:"
-msgstr ""
+msgstr "Editar el vostre perfil"
 
 #: ckan/templates/user/read.html:21
 msgid "Number of datasets administered:"
-msgstr ""
+msgstr "Tancar sessió"
 
 #: ckan/templates/user/read.html:28
 msgid "My Account"
-msgstr ""
+msgstr "Activitat"
 
 #: ckan/templates/user/read.html:30
 msgid "You are logged in."
-msgstr ""
+msgstr "Nombre d'edicions:"
 
 #: ckan/templates/user/read.html:32
 msgid "Your API key is:"
-msgstr ""
+msgstr "Nombre de paquets administrats:"
 
 #: ckan/templates/user/read.html:41
 msgid "Recent changes"
-msgstr ""
+msgstr "Canvis recents"
 
 #: ckan/templates/user/request_reset.html:6
 #: ckan/templates/user/request_reset.html:18
 #: ckan/templates/user/request_reset.html:24
 msgid "Reset password"
-msgstr ""
+msgstr "Reiniciar contrasenya"
 
 #: ckan/templates/user/request_reset.html:9
 msgid "Request a password reset"
-msgstr ""
+msgstr "Sol·licitar un reinici de la contrasenya"
 
 #: ckan/templates/user/request_reset.html:19
 msgid "User name:"
-msgstr ""
-
+msgstr "Nom d'usuari:"
+


Binary file ckan/i18n/cs_CZ/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/de/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/el/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/es/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/fi/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/hu/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/it/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/nl/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/no/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/pt_BR/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/ru/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/sl/LC_MESSAGES/ckan.mo has changed


Binary file ckan/i18n/sq/LC_MESSAGES/ckan.mo has changed


--- a/ckan/wsgi.py	Wed Sep 28 16:29:57 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-
-# The packaging system requires this script at ckan/wsgi.py, please do not
-# move it.
-
-usage = """
-WSGI Script for CKAN
-====================
-
-Set Apache to run this WSGI Script via a symlink that is adjacent to your CKAN
-config file in the file system.
-
-Example:
-  Find this script's installed path::
-      $ python -c 'import ckan; print ckan.__path__'
-      ['/usr/lib/pymodules/python2.6/ckan/']
-  
-  Create symlink::
-      $ ln -s /usr/lib/pymodules/python2.6/ckan/wsgi.py /etc/ckan/dgu.py
-
-  Apache config line::
-      WSGIScriptAlias / /etc/ckan/dgu.py
-
-  dgu.py will load the Pylons config: dgu.ini (looking in the same directory.)
-"""
-
-import os
-import sys
-from apachemiddleware import MaintenanceResponse
-
-symlink_filepath = __file__
-if os.path.basename(symlink_filepath) == 'wsgi.py':
-    print usage
-    sys.exit(1)
-config_filepath = symlink_filepath.replace('.py', '.ini')
-assert os.path.exists(config_filepath), 'Cannot find file %r (from symlink %r)' % (config_filepath, __file__)
-
-# enable logging
-from paste.script.util.logging_config import fileConfig
-fileConfig(config_filepath)
-
-from paste.deploy import loadapp
-application = loadapp('config:%s' % config_filepath)
-application = MaintenanceResponse(application)
-


--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ckan_deb/DEBIAN/control.template	Fri Sep 30 17:44:43 2011 +0100
@@ -0,0 +1,11 @@
+# This get's set by the build script
+# Version: XXX
+Package: ckan
+Architecture: all
+Maintainer: James Gardner <james.gardner at okfn.org>
+Section: main/web
+Priority: extra
+Depends: python-ckan, postgresql-8.4, apache2, libapache2-mod-wsgi, python-apachemiddleware, python-virtualenv, python-pip
+Homepage: http://ckan.org
+Description: ckan
+ Common files useful for managing CKAN installations


--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ckan_deb/usr/bin/ckan-create-instance	Fri Sep 30 17:44:43 2011 +0100
@@ -0,0 +1,131 @@
+#!/bin/bash
+. /usr/lib/ckan/common.sh
+
+INSTANCE=$1
+
+# Check we are root
+if [[ $EUID -ne 0 ]]; then
+   echo "This script must be run as root"
+   exit 1
+fi
+
+# Create an install settings file if it doesn't exist
+if ! [ -f /etc/ckan/${INSTANCE}/install_settings.sh ] ; then
+    mkdir -p /etc/ckan/${INSTANCE}/
+    cat <<EOF > /etc/ckan/${INSTANCE}/install_settings.sh
+#!/bin/bash
+EOF
+    chmod +x /etc/ckan/${INSTANCE}/install_settings.sh
+fi
+
+# Parse the settings
+. /etc/ckan/${INSTANCE}/install_settings.sh
+
+# See which settings are set, and create any we need that aren't
+if [ "X${CKAN_DB_PASSWORD}" = "X" ] ; then
+    # Create a password
+    CKAN_DB_PASSWORD=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c10`
+    cat <<EOF >> /etc/ckan/${INSTANCE}/install_settings.sh
+CKAN_DB_PASSWORD=${CKAN_DB_PASSWORD}
+EOF
+fi
+
+error() { 
+    echo -e "${@}" 1>&2
+    exit 1
+}
+
+echo "Installing or upgrading CKAN ${INSTANCE} ..."
+
+echo "Making sure PostgreSQL is running ..."
+/etc/init.d/postgresql-8.4 start
+
+echo "Ensuring users and groups are set up correctly ..."
+ckan_ensure_users_and_groups ${INSTANCE}
+
+echo "Ensuring directories exist for ${INSTANCE} CKAN INSTANCE ..."
+ckan_make_ckan_directories ${INSTANCE}
+
+# Disable any existing crontabs during the upgrade, we don't want
+# scripts running when things are still changing
+echo "Disabling the crontab for the ckan${INSTANCE} user ..."
+PACKAGED_CRONJOB="/tmp/${INSTANCE}-cronjob"
+cat <<EOF > ${PACKAGED_CRONJOB}
+# m  h dom mon dow  command
+EOF
+crontab -u ckan${INSTANCE} ${PACKAGED_CRONJOB}
+
+# Try to put CKAN into maintenance mode, if it is installed
+if [ -f /etc/apache2/sites-available/${INSTANCE}.maint ] ; then
+    # We have a maintence mode available
+    echo "Putting CKAN into maintenance mode ..."
+    ckan_maintenance_on ${INSTANCE}
+fi
+
+echo "Setting log file permissions so that both Apache and cron jobs can log to the same place ..."
+ckan_set_log_file_permissions ${INSTANCE}
+
+echo "Ensuring who.ini file exists ..."
+ckan_create_who_ini ${INSTANCE}
+
+echo "Ensuring wsgi.py file exists ..."
+ckan_create_wsgi_handler ${INSTANCE}
+
+# Replace any existing user with a new one with this password
+echo "Setting the password of the ${INSTANCE} user in PostgreSQL"
+ckan_add_or_replace_database_user ${INSTANCE} ${CKAN_DB_PASSWORD}
+
+# Create the config file
+echo "Creating/overwriting the config for CKAN ... "
+# We use the actual password in PostgreSQL in case any non-sense has gone on
+ckan_create_config_file ${INSTANCE} ${CKAN_DB_PASSWORD}
+# Now that the file exists, make some customisations
+sed \
+    -e "s,^\(ckan.dump_dir\)[ =].*,\1 = /var/lib/ckan/${INSTANCE}/static/dump," \
+    -i /etc/ckan/${INSTANCE}/${INSTANCE}.ini
+
+echo "Ensuring the ${INSTANCE} database exists ..."
+ckan_ensure_db_exists ${INSTANCE}
+
+#echo "Ensuring the latest plugins are configured ..."
+#sed -e "s/^\(ckan.plugins\)[ =].*/\1 = ${INSTANCE}/" \
+#    -i /etc/ckan/${INSTANCE}/${INSTANCE}.ini
+
+# Overwrite the existing Apache config
+if [ -f /etc/apache2/sites-enabled/000-default ] ; then
+    echo "Disabling the default Apache site ..."
+    a2dissite 000-default
+fi
+
+echo "Overwriting the existing Apache config ..."
+ckan_overwrite_apache_config ${INSTANCE} ${INSTANCE}.ckan.localhost 
+
+# Make sure mod_rewrite is enabled
+if ! [ -f /etc/apache2/mods-enabled/rewrite.load ] ; then
+    echo "Enabling Apache mod_rewite ..."
+    a2enmod rewrite
+fi
+
+# Standard paster db upgrade
+echo "Performing any database upgrades ..."
+paster --plugin=ckan db upgrade --config=/etc/ckan/${INSTANCE}/${INSTANCE}.ini
+
+# Make sure our INSTANCE is enabled
+echo "Bringing the ${INSTANCE} INSTANCE out of maintenance mode ..."
+ckan_maintenance_off ${INSTANCE}
+
+# Restart Apache so it is aware of any changes
+echo "Restarting apache ..."
+/etc/init.d/apache2 restart 
+
+# Install the new crontab
+echo "Enabling crontab for the ckan${INSTANCE} user ..."
+PACKAGED_CRONJOB="/tmp/${INSTANCE}-cronjob"
+cat <<EOF > ${PACKAGED_CRONJOB}
+# WARNING:  Do not edit these cron tabs, they will be overwritten any time 
+#           the ckan INSTANCE package is upgraded
+# QUESTION: Should email reports be sent to root?
+EOF
+crontab -u ckan${INSTANCE} ${PACKAGED_CRONJOB}
+
+exit 0


--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ckan_deb/usr/bin/ckan-instance-maintenance	Fri Sep 30 17:44:43 2011 +0100
@@ -0,0 +1,48 @@
+#!/bin/bash
+. /usr/lib/ckan/common.sh
+
+set -e
+
+# Un-comment for debugging
+
+# Check we are root
+if [[ $EUID -ne 0 ]]; then
+   echo "This script must be run as root"
+   exit 1
+fi
+
+error() { 
+    echo -e "${@}" 1>&2
+    exit 1
+}
+
+usage() {
+    error "ERROR: call this script with instance name and \"on\" or \"off\", e.g.\n       $0  dgu   on"
+}
+
+[ "X$1" = "X" ] || [ "X$2" = "X" ] && usage
+instance=$1
+command=$2
+
+for conf in /etc/apache2/sites-available/${instance}{,.maint} ; do
+    [ -f ${conf} ] || error "ERROR: ${conf} not found"
+done
+
+case $command in
+    on)
+        echo "Putting CKAN site \"${instance}\" into maintenance mode ..."
+        maintenance_on $instance
+        echo "done."
+        ;;
+    
+    off)
+        echo "Disabling maintenance mode for CKAN site \"${instance}\" ..."
+        maintenance_off $instance
+        echo "done."
+        ;;
+    *)
+        usage
+        ;;
+esac
+
+exit 0


--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ckan_deb/usr/lib/ckan/common.sh	Fri Sep 30 17:44:43 2011 +0100
@@ -0,0 +1,269 @@
+#!/bin/bash
+
+ckan_log () {
+    echo "ckan: " $1
+}
+
+#_echo="echo"
+ckan_maintenance_on () {
+    local INSTANCE
+    INSTANCE=$1
+    $_echo a2dissite ${INSTANCE}
+    $_echo a2ensite  ${INSTANCE}.maint
+    $_echo service apache2 reload
+}
+
+ckan_maintenance_off () {
+    local INSTANCE
+    INSTANCE=$1
+    $_echo a2dissite ${INSTANCE}.maint
+    $_echo a2ensite  ${INSTANCE}
+    $_echo service apache2 reload
+}
+
+ckan_set_log_file_permissions () {
+    local INSTANCE
+    INSTANCE=$1
+    sudo chown www-data:ckan${INSTANCE} /var/log/ckan/${INSTANCE}
+    sudo chmod g+w /var/log/ckan/${INSTANCE}
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}.log
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}1.log
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}2.log
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}3.log
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}4.log
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}5.log
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}6.log
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}7.log
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}8.log
+    sudo touch /var/log/ckan/${INSTANCE}/${INSTANCE}9.log
+    sudo chmod g+w /var/log/ckan/${INSTANCE}/${INSTANCE}*.log
+    sudo chown www-data:ckan${INSTANCE} /var/log/ckan/${INSTANCE}/${INSTANCE}*.log
+}
+
+ckan_ensure_users_and_groups () {
+    local INSTANCE
+    INSTANCE=$1
+    COMMAND_OUTPUT=`cat /etc/group | grep "ckan${INSTANCE}:"`
+    if ! [[ "$COMMAND_OUTPUT" =~ "ckan${INSTANCE}:" ]] ; then
+        echo "Crating the 'ckan${INSTANCE}' group ..." 
+        sudo groupadd --system "ckan${INSTANCE}"
+    fi
+    COMMAND_OUTPUT=`cat /etc/passwd | grep "ckan${INSTANCE}:"`
+    if ! [[ "$COMMAND_OUTPUT" =~ "ckan${INSTANCE}:" ]] ; then
+        echo "Crating the 'ckan${INSTANCE}' user ..." 
+        sudo useradd  --system  --gid "ckan${INSTANCE}" --home /var/lib/ckan/${INSTANCE} -M  --shell /usr/sbin/nologin ckan${INSTANCE}
+    fi
+}
+
+ckan_make_ckan_directories () {
+    local INSTANCE
+    if [ "X$1" = "X" ] ; then
+        echo "ERROR: call the function make_ckan_directories with an INSTANCE name, e.g." 
+        echo "       dgu"
+        exit 1
+    else
+        INSTANCE=$1
+        mkdir -p -m 0755 /etc/ckan/${INSTANCE}
+        mkdir -p -m 0750 /var/lib/ckan/${INSTANCE}{,/static}
+        mkdir -p -m 0770 /var/{backup,log}/ckan/${INSTANCE} /var/lib/ckan/${INSTANCE}/{data,sstore,static/dump}
+        sudo chown ckan${INSTANCE}:ckan${INSTANCE} /etc/ckan/${INSTANCE}
+        sudo chown www-data:ckan${INSTANCE} /var/{backup,log}/ckan/${INSTANCE} /var/lib/ckan/${INSTANCE} /var/lib/ckan/${INSTANCE}/{data,sstore,static/dump}
+        sudo chmod g+w /var/log/ckan/${INSTANCE} /var/lib/ckan/${INSTANCE}/{data,sstore,static/dump}
+    fi
+}
+
+ckan_create_who_ini () {
+    local INSTANCE
+    if [ "X$1" = "X" ] ; then
+        echo "ERROR: call the function create_who_ini function with an INSTANCE name, e.g." 
+        echo "       dgu"
+        exit 1
+    else
+        INSTANCE=$1
+        if ! [ -f /etc/ckan/$0/who.ini ] ; then
+            cp -n /usr/share/pyshared/ckan/config/who.ini /etc/ckan/${INSTANCE}/who.ini
+            sed -e "s,%(here)s,/var/lib/ckan/${INSTANCE}," \
+                -i /etc/ckan/${INSTANCE}/who.ini
+        fi
+    fi
+}
+
+ckan_create_config_file () {
+    local INSTANCE password
+    if [ "X$1" = "X" ] || [ "X$2" = "X" ] ; then
+        echo "ERROR: call the function create_config_file function with an INSTANCE name, and a password for postgresql e.g."
+        echo " dgu 1U923hjkh8"
+        exit 1
+    else
+        INSTANCE=$1
+        password=$2
+        # Create an install settings file if it doesn't exist
+        if [ -f /etc/ckan/${INSTANCE}/${INSTANCE}.ini ] ; then
+            mv /etc/ckan/${INSTANCE}/${INSTANCE}.ini "/etc/ckan/${INSTANCE}/${INSTANCE}.ini.`date +%F_%T`.bak"
+        fi
+        paster make-config ckan /etc/ckan/${INSTANCE}/${INSTANCE}.ini
+        sed -e "s,^\(email_to\)[ =].*,\1 = root," \
+            -e "s,^\(error_email_from\)[ =].*,\1 = ckan-${INSTANCE}@`hostname`," \
+            -e "s,^\(cache_dir\)[ =].*,\1 = /var/lib/ckan/${INSTANCE}/data," \
+            -e "s,^\(who\.config_file\)[ =].*,\1 = /etc/ckan/${INSTANCE}/who.ini," \
+            -e "s,^\(sqlalchemy.url\)[ =].*,\1 = postgresql://${INSTANCE}:${password}@localhost/${INSTANCE}," \
+            -e "s,ckan\.site_logo,\#ckan.site_logo," \
+            -e "s,ckan\.log,/var/log/ckan/${INSTANCE}/${INSTANCE}.log," \
+            -i /etc/ckan/${INSTANCE}/${INSTANCE}.ini
+    fi
+}
+
+ckan_add_or_replace_database_user () {
+    local INSTANCE password
+    if [ "X$1" = "X" ] || [ "X$2" = "X" ] ; then
+        echo "ERROR: call the function ckan_add_or_replace_database_user function with an INSTANCE name, and a password for postgresql e.g." 
+        echo "       dgu 1U923hjkh8"
+        echo "       You can generate a password like this: "
+        echo "           < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c10"
+        exit 1
+    else
+        INSTANCE=$1
+        password=$2
+        COMMAND_OUTPUT=`sudo -u postgres psql -c "SELECT 'True' FROM pg_user WHERE usename='${INSTANCE}'"`
+        if ! [[ "$COMMAND_OUTPUT" =~ True ]] ; then
+            echo "Creating the ${INSTANCE} user ..."
+            sudo -u postgres psql -c "CREATE USER \"${INSTANCE}\" WITH PASSWORD '${password}'"
+        else
+            echo "Setting the ${INSTANCE} user password ..."
+            sudo -u postgres psql -c "ALTER USER \"${INSTANCE}\" WITH PASSWORD '${password}'"
+        fi
+    fi
+}
+
+ckan_ensure_db_exists () {
+    local INSTANCE
+    if [ "X$1" = "X" ] ; then
+        echo "ERROR: call the function ensure_db_exists function with an INSTANCE name, e.g." 
+        echo "       dgu"
+        exit 1
+    else
+        INSTANCE=$1
+        COMMAND_OUTPUT=`sudo -u postgres psql -l`
+        if ! [[ "$COMMAND_OUTPUT" =~ ${INSTANCE} ]] ; then
+            echo "Creating the database ..."
+            sudo -u postgres createdb -O ${INSTANCE} ${INSTANCE}
+        fi
+    fi
+}
+
+ckan_create_wsgi_handler () {
+    local INSTANCE
+    if [ "X$1" = "X" ] ; then
+        echo "ERROR: call the function create_wsgi_handler function with an INSTANCE name, e.g." 
+        echo "       dgu"
+        exit 1
+    else
+        INSTANCE=$1
+        if [ ! -f "/var/lib/ckan/${INSTANCE}/wsgi.py" ]
+        then
+            sudo virtualenv --setuptools /var/lib/ckan/${INSTANCE}/pyenv
+            cat <<- EOF > /var/lib/ckan/${INSTANCE}/wsgi.py
+	import os
+	instance_dir = '/var/lib/ckan/${INSTANCE}'
+	config_dir = '/etc/ckan/${INSTANCE}'
+	config_file = '${INSTANCE}.ini'
+	pyenv_bin_dir = os.path.join(instance_dir, 'pyenv', 'bin')
+	activate_this = os.path.join(pyenv_bin_dir, 'activate_this.py')
+	execfile(activate_this, dict(__file__=activate_this))
+	# this is werid but without importing ckanext first import of paste.deploy will fail
+	#import ckanext
+	config_filepath = os.path.join(config_dir, config_file)
+	if not os.path.exists(config_filepath):
+	    raise Exception('No such file %r'%config_filepath)
+	from paste.deploy import loadapp
+	from paste.script.util.logging_config import fileConfig
+	fileConfig(config_filepath)
+	application = loadapp('config:%s' % config_filepath)
+	from apachemiddleware import MaintenanceResponse
+	application = MaintenanceResponse(application)
+	EOF
+        sudo chmod +x /var/lib/ckan/${INSTANCE}/wsgi.py
+        fi
+   fi
+}
+
+ckan_overwrite_apache_config () {
+    local INSTANCE ServerName
+    if [ "X$1" = "X" ] ; then
+        echo "ERROR: call the function overwrite_apache_config function with an INSTANCE name, the server name and a server aliase e.g." 
+        echo "       dgu catalogue.data.gov.uk dgu-live.okfn.org"
+        exit 1
+    else
+        INSTANCE=$1
+        ServerName=$2
+        #rm /etc/apache2/sites-available/${INSTANCE}.common
+        cat <<EOF > /etc/apache2/sites-available/${INSTANCE}.common
+
+    # WARNING: Do not manually edit this file, it is desgined to be 
+    #          overwritten at any time by the postinst script of 
+    #          dependent packages
+
+    # These are common settings used for both the normal and maintence modes
+
+    DocumentRoot /var/lib/ckan/${INSTANCE}/static
+    ServerName ${ServerName}
+
+    <Directory />
+        # XXX Should this be deny? We get a "Client denied by server configuration" without it
+        allow from all
+    </Directory>
+
+    <Directory /etc/ckan/${INSTANCE}/>
+        allow from all
+    </Directory>
+
+    <Directory /var/lib/ckan/${INSTANCE}/static>
+        allow from all
+    </Directory>
+
+    Alias /dump /var/lib/ckan/${INSTANCE}/static/dump
+
+    # Disable the mod_python handler for static files
+    <Location /dump>
+        SetHandler None
+        Options +Indexes
+    </Location>
+
+    # this is our app
+    WSGIScriptAlias / /var/lib/ckan/${INSTANCE}/wsgi.py
+
+    # pass authorization info on (needed for rest api)
+    WSGIPassAuthorization On
+
+    ErrorLog /var/log/apache2/${INSTANCE}.error.log
+    CustomLog /var/log/apache2/${INSTANCE}.custom.log combined
+EOF
+        #rm /etc/apache2/sites-available/${INSTANCE}
+        cat <<EOF > /etc/apache2/sites-available/${INSTANCE} 
+<VirtualHost *:80>
+    # WARNING: Do not manually edit this file, it is desgined to be 
+    #          overwritten at any time by the postinst script of 
+    #          dependent packages
+    Include /etc/apache2/sites-available/${INSTANCE}.common
+</VirtualHost>
+EOF
+        #rm /etc/apache2/sites-available/${INSTANCE}.maint
+        cat <<EOF > /etc/apache2/sites-available/${INSTANCE}.maint
+<VirtualHost *:80>
+    # WARNING: Do not manually edit this file, it is desgined to be 
+    #          overwritten at any time by the postinst script of 
+    #          dependent packages
+    Include /etc/apache2/sites-available/${INSTANCE}.common
+
+    # Maintenance mode
+    RewriteEngine On
+    RewriteRule ^(.*)/new /return_503 [PT,L]
+    RewriteRule ^(.*)/create /return_503 [PT,L]      
+    RewriteRule ^(.*)/authz /return_503 [PT,L]
+    RewriteRule ^(.*)/edit /return_503 [PT,L]
+    RewriteCond %{REQUEST_METHOD} !^GET$ [NC]
+    RewriteRule (.*) /return_503 [PT,L]
+</VirtualHost>
+EOF
+    fi
+}


--- a/doc/test.rst	Wed Sep 28 16:29:57 2011 +0100
+++ b/doc/test.rst	Fri Sep 30 17:44:43 2011 +0100
@@ -116,3 +116,14 @@
 
    This error usually results from running a test which involves search functionality, which requires using a PostgreSQL database, but another (such as SQLite) is configured. The particular test is either missing a `@search_related` decorator or there is a mixup with the test configuration files leading to the wrong database being used.
 
+* `ImportError: No module named worker`
+
+   The python entry point for the worker has not been generated. This occurs during the 'pip install' of the CKAN source, and needs to be done again if switching from older code that didn't have it. To recitify it::
+
+        python setup.py egg_info
+
+* `ImportError: cannot import name get_backend`
+
+   This can be caused by an out of date pyc file. Delete all your pyc files and start again::
+
+        find . -name "*.pyc" | xargs rm
\ No newline at end of file


--- a/requires/lucid_conflict.txt	Wed Sep 28 16:29:57 2011 +0100
+++ b/requires/lucid_conflict.txt	Fri Sep 30 17:44:43 2011 +0100
@@ -4,7 +4,7 @@
 # a single location which CKAN imports from in preference to the Lucid 
 # equivalent.
 
-Genshi>=0.6,<0.6.99
+Genshi==0.6
 sqlalchemy-migrate==0.6
 sqlalchemy==0.6.6
 webhelpers==1.2


--- a/requires/lucid_present.txt	Wed Sep 28 16:29:57 2011 +0100
+++ b/requires/lucid_present.txt	Fri Sep 30 17:44:43 2011 +0100
@@ -18,7 +18,7 @@
 tempita==0.4
 zope.interface==3.5.3
 # These are both combined into the python-repoze.who-plugins package
-repoze.who.plugins.openid
+repoze.who.plugins.openid==0.5.4
 # Actually from python-repoze.who-plugins but the openid plugin in the same
 # package is too old
 repoze.who-friendlyform==1.0.8


http://bitbucket.org/okfn/ckan/changeset/bd26964710af/
changeset:   bd26964710af
user:        dread
date:        2011-09-30 18:57:25
summary:     [i18n] Synced strings with Transifex and compiled i18n.
affected #:  39 files (-1 bytes)
Diff too large to display.
http://bitbucket.org/okfn/ckan/changeset/7b0794c5be3f/
changeset:   7b0794c5be3f
user:        dread
date:        2011-09-30 18:58:24
summary:     [merge]
affected #:  14 files (-1 bytes)

--- a/ckan/config/routing.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/config/routing.py	Fri Sep 30 17:58:24 2011 +0100
@@ -47,9 +47,9 @@
             ]
     register_list_str = '|'.join(register_list)
 
-    map.connect('/api/{ver:1|2}', controller='api', action='get_api')
+    map.connect('/api/{ver:1|2|3}', controller='api', action='get_api')
 
-    map.connect('/api/{ver:1|2}/search/{register}', controller='api', action='search')
+    map.connect('/api/{ver:1|2|3}/search/{register}', controller='api', action='search')
     map.connect('/api/{ver:1|2}/tag_counts', controller='api', action='tag_counts')
 
     map.connect('/api/{ver:1|2}/rest', controller='api', action='index')
@@ -92,6 +92,8 @@
         controller='api', action='delete',
         requirements=dict(register=register_list_str),
         conditions=dict(method=['DELETE']))
+    map.connect('/api/{ver:3}/action/{logic_function}', controller='api', action='action',
+                conditions=dict(method=['GET', 'POST']))
     map.connect('/api/{ver:1|2}/qos/throughput/',
         controller='api', action='throughput',
         requirements=dict(register=register_list_str),
@@ -107,8 +109,8 @@
     
     map.connect('/api/rest', controller='api', action='index')
 
-    map.connect('/api/action/{logic_function}', controller='api', action='action')
-
+    map.connect('/api/action/{logic_function}', controller='api', action='action',
+                conditions=dict(method=['GET', 'POST']))
     map.connect('/api/rest/{register}', controller='api', action='list',
         requirements=dict(register=register_list_str),
         conditions=dict(method=['GET'])


--- a/ckan/controllers/api.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/controllers/api.py	Fri Sep 30 17:58:24 2011 +0100
@@ -7,7 +7,7 @@
 from ckan.lib.helpers import json, date_str_to_datetime
 import ckan.model as model
 import ckan.rating
-from ckan.lib.search import query_for, QueryOptions, SearchIndexError, SearchError, DEFAULT_OPTIONS
+from ckan.lib.search import query_for, QueryOptions, SearchIndexError, SearchError, DEFAULT_OPTIONS, convert_legacy_parameters_to_solr
 from ckan.plugins import PluginImplementations, IGroupController
 from ckan.lib.munge import munge_title_to_name
 from ckan.lib.navl.dictization_functions import DataError
@@ -278,7 +278,8 @@
             response_data = action(context, data_dict)
             location = None
             if "id" in data_dict:
-                location = str('%s/%s' % (request.path, data_dict.get("id")))
+                location = str('%s/%s' % (request.path.replace('package', 'dataset'),
+                                          data_dict.get("id")))
             return self._finish_ok(response_data,
                                    resource_location=location)
         except NotAuthorized:
@@ -387,6 +388,7 @@
     def search(self, ver=None, register=None):
         
         log.debug('search %s params: %r' % (register, request.params))
+        ver = ver or '1' # i.e. default to v1
         if register == 'revision':
             since_time = None
             if request.params.has_key('since_id'):
@@ -412,7 +414,7 @@
             return self._finish_ok([rev.id for rev in revs])
         elif register in ['dataset', 'package', 'resource']:
             try:
-                params = dict(self._get_search_params(request.params))
+                params = MultiDict(self._get_search_params(request.params))
             except ValueError, e:
                 return self._finish_bad_request(
                     gettext('Could not read parameters: %r' % e))
@@ -451,7 +453,11 @@
                         query=params.get('q'), fields=query_fields, options=options
                     )
                 else:
-                    # for package searches we can pass parameters straight to Solr
+                    # For package searches in API v3 and higher, we can pass
+                    # parameters straight to Solr.
+                    if ver in u'12':
+                        # Otherwise, put all unrecognised ones into the q parameter
+                        params = convert_legacy_parameters_to_solr(params)
                     query = query_for(model.Package)
                     results = query.run(params)
                 return self._finish_ok(results)


--- a/ckan/lib/search/__init__.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/lib/search/__init__.py	Fri Sep 30 17:58:24 2011 +0100
@@ -7,7 +7,7 @@
 from ckan.lib.dictization.model_dictize import package_to_api1
 from common import SearchIndexError, SearchError, make_connection, is_available, DEFAULT_SOLR_URL
 from index import PackageSearchIndex, NoopSearchIndex
-from query import TagSearchQuery, ResourceSearchQuery, PackageSearchQuery, QueryOptions
+from query import TagSearchQuery, ResourceSearchQuery, PackageSearchQuery, QueryOptions, convert_legacy_parameters_to_solr
 
 log = logging.getLogger(__name__)
 


--- a/ckan/lib/search/common.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/lib/search/common.py	Fri Sep 30 17:58:24 2011 +0100
@@ -4,6 +4,7 @@
 
 class SearchIndexError(Exception): pass
 class SearchError(Exception): pass
+class SearchQueryError(SearchError): pass
 
 DEFAULT_SOLR_URL = 'http://127.0.0.1:8983/solr'
 


--- a/ckan/lib/search/query.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/lib/search/query.py	Fri Sep 30 17:58:24 2011 +0100
@@ -1,9 +1,10 @@
-import json
 from pylons import config
 from paste.deploy.converters import asbool
+from paste.util.multidict import MultiDict
 from ckan import model
 from ckan.logic import get_action
-from common import make_connection, SearchError
+from ckan.lib.helpers import json
+from common import make_connection, SearchError, SearchQueryError
 import logging
 log = logging.getLogger(__name__)
 
@@ -11,7 +12,6 @@
 
 VALID_SOLR_PARAMETERS = set([
     'q', 'fl', 'fq', 'rows', 'sort', 'start', 'wt', 'qf',
-    'filter_by_downloadable', 'filter_by_openness',
     'facet', 'facet.mincount', 'facet.limit', 'facet.field'
 ])
 
@@ -19,14 +19,63 @@
 # and their relative weighting
 QUERY_FIELDS = "name^4 title^4 tags^2 groups^2 text"
 
+def convert_legacy_parameters_to_solr(legacy_params):
+    '''API v1 and v2 allowed search params that the SOLR syntax does not
+    support, so use this function to convert those to SOLR syntax.
+    See tests for examples.
+
+    raises SearchQueryError on invalid params.
+    '''
+    options = QueryOptions(**legacy_params)
+    options.validate()
+    solr_params = legacy_params.copy()
+    solr_q_list = []
+    if solr_params.get('q'):
+        solr_q_list.append(solr_params['q'].replace('+', ' '))
+    non_solr_params = set(legacy_params.keys()) - VALID_SOLR_PARAMETERS
+    for search_key in non_solr_params:
+        value_obj = legacy_params[search_key]
+        value = str(value_obj).replace('+', ' ')
+        if search_key == 'all_fields':
+            if value:
+                solr_params['fl'] = '*'
+        elif search_key == 'offset':
+            solr_params['start'] = value
+        elif search_key == 'limit':
+            solr_params['rows'] = value
+        elif search_key == 'order_by':
+            solr_params['sort'] = '%s asc' % value
+        elif search_key == 'tags':
+            if isinstance(value_obj, list):
+                tag_list = value_obj
+            elif isinstance(value_obj, basestring):
+                tag_list = [value_obj]
+            else:
+                raise SearchQueryError('Was expecting either a string or JSON list for the tags parameter: %r' % value)
+            solr_q_list.extend(['tags:%s' % tag for tag in tag_list])
+        else:
+            if ' ' in value:
+                value = '"%s"' % value
+            solr_q_list.append('%s:%s' % (search_key, value))
+        del solr_params[search_key]
+    solr_params['q'] = ' '.join(solr_q_list)
+    if non_solr_params:
+        log.info('Converted legacy search params from %r to %r',
+                 legacy_params, solr_params)
+    return solr_params
+    
+
 class QueryOptions(dict):
     """
     Options specify aspects of the search query which are only tangentially related 
     to the query terms (such as limits, etc.).
+    NB This is used only by legacy package search and current resource & tag search.
+       Modern SOLR package search leaves this to SOLR syntax.
     """
     
-    BOOLEAN_OPTIONS = ['filter_by_downloadable', 'filter_by_openness', 'all_fields']
+    BOOLEAN_OPTIONS = ['all_fields']
     INTEGER_OPTIONS = ['offset', 'limit']
+    UNSUPPORTED_OPTIONS = ['filter_by_downloadable', 'filter_by_openness']
 
     def __init__(self, **kwargs):
         from ckan.lib.search import DEFAULT_OPTIONS
@@ -44,12 +93,14 @@
                 try:
                     value = asbool(value)
                 except ValueError:
-                    raise SearchError('Value for search option %r must be True or False (1 or 0) but received %r' % (key, value))
+                    raise SearchQueryError('Value for search option %r must be True or False (1 or 0) but received %r' % (key, value))
             elif key in self.INTEGER_OPTIONS:
                 try:
                     value = int(value)
                 except ValueError:
-                    raise SearchError('Value for search option %r must be an integer but received %r' % (key, value))
+                    raise SearchQueryError('Value for search option %r must be an integer but received %r' % (key, value))
+            elif key in self.UNSUPPORTED_OPTIONS:
+                    raise SearchQueryError('Search option %r is not supported' % key)                
             self[key] = value    
     
     def __getattr__(self, name):
@@ -173,12 +224,11 @@
         return [r.get('id') for r in data.results]
 
     def run(self, query):
-        assert isinstance(query, dict)
-        
+        assert isinstance(query, (dict, MultiDict))
         # check that query keys are valid
         if not set(query.keys()) <= VALID_SOLR_PARAMETERS:
             invalid_params = [s for s in set(query.keys()) - VALID_SOLR_PARAMETERS]
-            raise SearchError("Invalid search parameters: %s" % invalid_params)
+            raise SearchQueryError("Invalid search parameters: %s" % invalid_params)
 
         # default query is to return all documents
         q = query.get('q')
@@ -214,14 +264,6 @@
         # return results as json encoded string
         query['wt'] = query.get('wt', 'json')
 
-        # check if filtering by downloadable or open license
-        if int(query.get('filter_by_downloadable', 0)):
-            query['fq'] += u" +res_url:[* TO *] " # not null resource URL 
-        if int(query.get('filter_by_openness', 0)):
-            licenses = ["license_id:%s" % id for id in self.open_licenses]
-            licenses = " OR ".join(licenses)
-            query['fq'] += " +(%s) " % licenses
-
         # query field weighting: disabled for now as solr 3.* is required for 
         # the 'edismax' query parser, our current Ubuntu version only has
         # packages for 1.4


--- a/ckan/templates/layout_base.html	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/templates/layout_base.html	Fri Sep 30 17:58:24 2011 +0100
@@ -101,7 +101,7 @@
         <content><p>Master content template placeholder … please replace me.</p></content>
-      </div>
+      </div><!-- /content --><div id="sidebar" class="span-7 last"><ul class="widget-list"><py:if test="defined('primary_sidebar_extras')">


--- a/ckan/tests/functional/api/base.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/tests/functional/api/base.py	Fri Sep 30 17:58:24 2011 +0100
@@ -31,6 +31,7 @@
     extra_environ = {}
 
     api_version = None
+
     ref_package_by = ''
     ref_group_by = ''
 
@@ -68,14 +69,56 @@
             base += '/' + self.api_version
         return '%s%s' % (base, path)
 
-    def package_offset(self, package_name=None):
-        if package_name is None:
-            # Package Register
-            return self.offset('/rest/dataset')
-        else:
-            # Package Entity
-            package_ref = self.package_ref_from_name(package_name)
-            return self.offset('/rest/dataset/%s' % package_ref)
+    def assert_msg_represents_anna(self, msg):
+        assert 'annakarenina' in msg, msg
+        data = self.loads(msg)
+        self.assert_equal(data['name'], 'annakarenina')
+        self.assert_equal(data['license_id'], 'other-open')
+        assert '"license_id": "other-open"' in msg, str(msg)
+        assert 'russian' in msg, msg
+        assert 'tolstoy' in msg, msg
+        assert '"extras": {' in msg, msg
+        assert '"genre": "romantic novel"' in msg, msg
+        assert '"original media": "book"' in msg, msg
+        assert 'annakarenina.com/download' in msg, msg
+        assert '"plain text"' in msg, msg
+        assert '"Index of the novel"' in msg, msg
+        assert '"id": "%s"' % self.anna.id in msg, msg
+        expected = '"groups": ['
+        assert expected in msg, (expected, msg)
+        expected = self.group_ref_from_name('roger')
+        assert expected in msg, (expected, msg)
+        expected = self.group_ref_from_name('david')
+        assert expected in msg, (expected, msg)
+
+        # Todo: What is the deal with ckan_url? And should this use IDs rather than names?
+        assert 'ckan_url' in msg
+        assert '"ckan_url": "http://test.ckan.net/dataset/annakarenina"' in msg, msg
+
+    def assert_msg_represents_roger(self, msg):
+        assert 'roger' in msg, msg
+        data = self.loads(msg)
+        keys = set(data.keys())
+        expected_keys = set(['id', 'name', 'title', 'description', 'created',
+                            'state', 'revision_id', 'packages'])
+        missing_keys = expected_keys - keys
+        assert not missing_keys, missing_keys
+        assert_equal(data['name'], 'roger')
+        assert_equal(data['title'], 'Roger\'s books')
+        assert_equal(data['description'], 'Roger likes these books.')
+        assert_equal(data['state'], 'active')
+        assert_equal(data['packages'], [self._ref_package(self.anna)])
+
+    def assert_msg_represents_russian(self, msg):
+        data = self.loads(msg)
+        pkgs = set(data)
+        expected_pkgs = set([self.package_ref_from_name('annakarenina'),
+                             self.package_ref_from_name('warandpeace')])
+        differences = expected_pkgs ^ pkgs
+        assert not differences, '%r != %r' % (pkgs, expected_pkgs)
+
+    def data_from_res(self, res):
+        return self.loads(res.body)
 
     def package_ref_from_name(self, package_name):
         package = self.get_package_by_name(unicode(package_name))
@@ -95,6 +138,41 @@
         assert self.ref_package_by in ['id', 'name']
         return getattr(package, self.ref_package_by)
 
+    def get_expected_api_version(self):
+        return self.api_version
+
+    def dumps(self, data):
+        return json.dumps(data)
+
+    def loads(self, chars):
+        try:
+            return json.loads(chars)
+        except ValueError, inst:
+            raise Exception, "Couldn't loads string '%s': %s" % (chars, inst)
+
+    def assert_json_response(self, res, expected_in_body=None):
+        content_type = res.header_dict['Content-Type']
+        assert 'application/json' in content_type, content_type
+        res_json = self.loads(res.body)
+        if expected_in_body:
+            assert expected_in_body in res_json or \
+                   expected_in_body in str(res_json), \
+                   'Expected to find %r in JSON response %r' % \
+                   (expected_in_body, res_json)
+
+class Api1and2TestCase(object):
+    ''' Utils for v1 and v2 API.
+          * RESTful URL utils
+    '''
+    def package_offset(self, package_name=None):
+        if package_name is None:
+            # Package Register
+            return self.offset('/rest/dataset')
+        else:
+            # Package Entity
+            package_ref = self.package_ref_from_name(package_name)
+            return self.offset('/rest/dataset/%s' % package_ref)
+
     def group_offset(self, group_name=None):
         if group_name is None:
             # Group Register
@@ -197,81 +275,7 @@
     def _list_group_refs(cls, groups):
         return [getattr(p, cls.ref_group_by) for p in groups]
 
-    def assert_msg_represents_anna(self, msg):
-        assert 'annakarenina' in msg, msg
-        data = self.loads(msg)
-        self.assert_equal(data['name'], 'annakarenina')
-        self.assert_equal(data['license_id'], 'other-open')
-        assert '"license_id": "other-open"' in msg, str(msg)
-        assert 'russian' in msg, msg
-        assert 'tolstoy' in msg, msg
-        assert '"extras": {' in msg, msg
-        assert '"genre": "romantic novel"' in msg, msg
-        assert '"original media": "book"' in msg, msg
-        assert 'annakarenina.com/download' in msg, msg
-        assert '"plain text"' in msg, msg
-        assert '"Index of the novel"' in msg, msg
-        assert '"id": "%s"' % self.anna.id in msg, msg
-        expected = '"groups": ['
-        assert expected in msg, (expected, msg)
-        expected = self.group_ref_from_name('roger')
-        assert expected in msg, (expected, msg)
-        expected = self.group_ref_from_name('david')
-        assert expected in msg, (expected, msg)
-
-        # Todo: What is the deal with ckan_url? And should this use IDs rather than names?
-        assert 'ckan_url' in msg
-        assert '"ckan_url": "http://test.ckan.net/dataset/annakarenina"' in msg, msg
-
-    def assert_msg_represents_roger(self, msg):
-        assert 'roger' in msg, msg
-        data = self.loads(msg)
-        keys = set(data.keys())
-        expected_keys = set(['id', 'name', 'title', 'description', 'created',
-                            'state', 'revision_id', 'packages'])
-        missing_keys = expected_keys - keys
-        assert not missing_keys, missing_keys
-        assert_equal(data['name'], 'roger')
-        assert_equal(data['title'], 'Roger\'s books')
-        assert_equal(data['description'], 'Roger likes these books.')
-        assert_equal(data['state'], 'active')
-        assert_equal(data['packages'], [self._ref_package(self.anna)])
-
-    def assert_msg_represents_russian(self, msg):
-        data = self.loads(msg)
-        pkgs = set(data)
-        expected_pkgs = set([self.package_ref_from_name('annakarenina'),
-                             self.package_ref_from_name('warandpeace')])
-        differences = expected_pkgs ^ pkgs
-        assert not differences, '%r != %r' % (pkgs, expected_pkgs)
-
-    def data_from_res(self, res):
-        return self.loads(res.body)
-
-    def get_expected_api_version(self):
-        return self.api_version
-
-    def dumps(self, data):
-        return json.dumps(data)
-
-    def loads(self, chars):
-        try:
-            return json.loads(chars)
-        except ValueError, inst:
-            raise Exception, "Couldn't loads string '%s': %s" % (chars, inst)
-
-    def assert_json_response(self, res, expected_in_body=None):
-        content_type = res.header_dict['Content-Type']
-        assert 'application/json' in content_type, content_type
-        res_json = self.loads(res.body)
-        if expected_in_body:
-            assert expected_in_body in res_json or \
-                   expected_in_body in str(res_json), \
-                   'Expected to find %r in JSON response %r' % \
-                   (expected_in_body, res_json)
-
-# Todo: Rename to Version1TestCase.
-class Api1TestCase(ApiTestCase):
+class Api1TestCase(Api1and2TestCase):
 
     api_version = '1'
     ref_package_by = 'name'
@@ -283,7 +287,7 @@
         assert '"download_url": "http://www.annakarenina.com/download/x=1&y=2"' in msg, msg
 
 
-class Api2TestCase(ApiTestCase):
+class Api2TestCase(Api1and2TestCase):
 
     api_version = '2'
     ref_package_by = 'id'
@@ -295,6 +299,17 @@
         assert 'download_url' not in msg, msg
 
 
+class Api3TestCase(ApiTestCase):
+
+    api_version = '3'
+    ref_package_by = 'name'
+    ref_group_by = 'name'
+    ref_tag_by = 'name'
+
+    def assert_msg_represents_anna(self, msg):
+        super(Api2TestCase, self).assert_msg_represents_anna(msg)
+        assert 'download_url' not in msg, msg
+
 class ApiUnversionedTestCase(Api1TestCase):
 
     api_version = ''


--- a/ckan/tests/functional/api/test_misc.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/tests/functional/api/test_misc.py	Fri Sep 30 17:58:24 2011 +0100
@@ -42,5 +42,5 @@
 class TestQosApi1(Api1TestCase, QosApiTestCase): pass
 class TestMiscApi2(Api2TestCase, MiscApiTestCase): pass
 class TestQosApi2(Api2TestCase, QosApiTestCase): pass
-class TestMiscApiUnversioned(MiscApiTestCase, ApiUnversionedTestCase): pass
+class TestMiscApiUnversioned(ApiUnversionedTestCase, MiscApiTestCase): pass
 class TestQosApiUnversioned(ApiUnversionedTestCase, QosApiTestCase): pass


--- a/ckan/tests/functional/api/test_package_search.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/tests/functional/api/test_package_search.py	Fri Sep 30 17:58:24 2011 +0100
@@ -1,4 +1,5 @@
 from nose.tools import assert_raises
+from nose.plugins.skip import SkipTest
 
 from ckan import plugins
 import ckan.lib.search as search
@@ -38,10 +39,6 @@
                          for expected_package_name in expected_package_names]
         assert_equal(set(res_dict['results']), set(expected_pkgs))
 
-    def package_ref_from_name(self, package_name):
-        package = self.get_package_by_name(package_name)
-        return self.ref_package(package)
-
     def test_00_read_search_params(self):
         def check(request_params, expected_params):
             params = ApiController._get_search_params(request_params)
@@ -49,8 +46,6 @@
         # uri parameters
         check(UnicodeMultiDict({'q': '', 'ref': 'boris'}),
               {"q": "", "ref": "boris"})
-        check(UnicodeMultiDict({}),
-              {})
         # uri json
         check(UnicodeMultiDict({'qjson': '{"q": "", "ref": "boris"}'}),
               {"q": "", "ref": "boris"})
@@ -75,7 +70,6 @@
         offset = self.base_url + '?q=%s' % self.package_fixture_data['name']
         res = self.app.get(offset, status=200)
         res_dict = self.data_from_res(res)
-        print res_dict
         self.assert_results(res_dict, ['testpkg'])
         assert res_dict['count'] == 1, res_dict['count']
 
@@ -131,6 +125,225 @@
         self.assert_results(res_dict, [u'annakarenina'])
         assert res_dict['count'] == 1, res_dict['count']
 
+    def test_08_uri_qjson_malformed(self):
+        offset = self.base_url + '?qjson="q":""' # user forgot the curly braces
+        res = self.app.get(offset, status=400)
+        self.assert_json_response(res, 'Bad request - Could not read parameters')
+        
+    def test_09_just_tags(self):
+        offset = self.base_url + '?q=tags:russian'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 2, res_dict
+
+    def test_10_multiple_tags(self):
+        offset = self.base_url + '?q=tags:tolstoy tags:russian'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 1, res_dict
+
+    def test_12_all_packages_qjson(self):
+        query = {'q': ''}
+        json_query = self.dumps(query)
+        offset = self.base_url + '?qjson=%s' % json_query
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert_equal(res_dict['count'], 3)
+
+    def test_12_all_packages_q(self):
+        offset = self.base_url + '?q=""'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert_equal(res_dict['count'], 3)
+
+    def test_12_all_packages_no_q(self):
+        offset = self.base_url
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert_equal(res_dict['count'], 3)
+
+    def test_12_filter_by_openness(self):
+        offset = self.base_url + '?filter_by_openness=1'
+        res = self.app.get(offset, status=400) # feature dropped in #1360
+        assert "'filter_by_openness'" in res.body, res.body
+
+    def test_12_filter_by_downloadable(self):
+        offset = self.base_url + '?filter_by_downloadable=1'
+        res = self.app.get(offset, status=400) # feature dropped in #1360
+        assert "'filter_by_downloadable'" in res.body, res.body
+
+
+class LegacyOptionsTestCase(ApiTestCase, ControllerTestCase):
+    '''Here are tests with URIs in the syntax they were in
+    for API v1 and v2.'''
+    @classmethod
+    def setup_class(self):
+        setup_test_search_index()
+        CreateTestData.create()
+        self.package_fixture_data = {
+            'name' : u'testpkg',
+            'title': 'Some Title',
+            'url': u'http://blahblahblah.mydomain',
+            'resources': [{u'url':u'http://blahblahblah.mydomain',
+                           u'format':u'', u'description':''}],
+            'tags': ['russion', 'novel'],
+            'license_id': u'gpl-3.0',
+            'extras': {'national_statistic':'yes',
+                       'geographic_coverage':'England, Wales'},
+        }
+        CreateTestData.create_arbitrary(self.package_fixture_data)
+        self.base_url = self.offset('/search/dataset')
+
+    @classmethod
+    def teardown_class(cls):
+        model.repo.rebuild_db()
+        search.clear()
+
+    def test_07_uri_qjson_tags(self):
+        query = {'q': '', 'tags':['tolstoy']}
+        json_query = self.dumps(query)
+        offset = self.base_url + '?qjson=%s' % json_query
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        self.assert_results(res_dict, [u'annakarenina'])
+        assert res_dict['count'] == 1, res_dict
+
+    def test_07_uri_qjson_tags_multiple(self):
+        query = {'q': '', 'tags':['tolstoy', 'russian']}
+        json_query = self.dumps(query)
+        offset = self.base_url + '?qjson=%s' % json_query
+        print offset
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        self.assert_results(res_dict, [u'annakarenina'])
+        assert res_dict['count'] == 1, res_dict
+
+    def test_07_uri_qjson_tags_reverse(self):
+        query = {'q': '', 'tags':['russian']}
+        json_query = self.dumps(query)
+        offset = self.base_url + '?qjson=%s' % json_query
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        self.assert_results(res_dict, [u'annakarenina', u'warandpeace'])
+        assert res_dict['count'] == 2, res_dict
+
+    def test_07_uri_qjson_extras(self):
+        # TODO: solr is not currently set up to allow partial matches 
+        #       and extras are not saved as multivalued so this
+        #       test will fail. Make extras multivalued or remove?
+        raise SkipTest()
+    
+        query = {"geographic_coverage":"England"}
+        json_query = self.dumps(query)
+        offset = self.base_url + '?qjson=%s' % json_query
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        self.assert_results(res_dict, ['testpkg'])
+        assert res_dict['count'] == 1, res_dict
+
+    def test_07_uri_qjson_extras_2(self):
+        query = {"national_statistic":"yes"}
+        json_query = self.dumps(query)
+        offset = self.base_url + '?qjson=%s' % json_query
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        self.assert_results(res_dict, ['testpkg'])
+        assert res_dict['count'] == 1, res_dict
+
+    def test_08_all_fields(self):
+        rating = model.Rating(user_ip_address=u'123.1.2.3',
+                              package=self.anna,
+                              rating=3.0)
+        model.Session.add(rating)
+        model.repo.commit_and_remove()
+        
+        query = {'q': 'russian', 'all_fields': 1}
+        json_query = self.dumps(query)
+        offset = self.base_url + '?qjson=%s' % json_query
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 2, res_dict
+        for rec in res_dict['results']:
+            if rec['name'] == 'annakarenina':
+                anna_rec = rec
+                break
+        assert anna_rec['name'] == 'annakarenina', res_dict['results']
+        assert anna_rec['title'] == 'A Novel By Tolstoy', anna_rec['title']
+        assert anna_rec['license_id'] == u'other-open', anna_rec['license_id']
+        assert len(anna_rec['tags']) == 2, anna_rec['tags']
+        for expected_tag in ['russian', 'tolstoy']:
+            assert expected_tag in anna_rec['tags']
+
+        # try alternative syntax
+        offset = self.base_url + '?q=russian&all_fields=1'
+        res2 = self.app.get(offset, status=200)
+        assert_equal(res2.body, res.body)
+
+    def test_08_all_fields_syntax_error(self):
+        offset = self.base_url + '?all_fields=should_be_boolean' # invalid all_fields value
+        res = self.app.get(offset, status=400)
+        assert('boolean' in res.body)
+        assert('all_fields' in res.body)
+        self.assert_json_response(res, 'boolean')
+
+    def test_09_just_tags(self):
+        offset = self.base_url + '?tags=tolstoy'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 1, res_dict
+
+    def test_10_multiple_tags_with_plus(self):
+        offset = self.base_url + '?tags=tolstoy+russian&all_fields=1'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 1, res_dict
+
+    def test_10_multiple_tags_with_ampersand(self):
+        offset = self.base_url + '?tags=tolstoy&tags=russian&all_fields=1'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 1, res_dict
+
+    def test_10_many_tags_with_ampersand(self):
+        offset = self.base_url + '?tags=tolstoy&tags=russian&tags=tolstoy'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 1, res_dict
+
+    def test_11_pagination_limit(self):
+        offset = self.base_url + '?all_fields=1&q=tags:russian&limit=1&order_by=name'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 2, res_dict
+        assert len(res_dict['results']) == 1, res_dict
+        assert res_dict['results'][0]['name'] == 'annakarenina', res_dict['results'][0]['name']
+
+    def test_11_pagination_offset_limit(self):
+        offset = self.base_url + '?all_fields=1&q=tags:russian&offset=1&limit=1&order_by=name'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 2, res_dict
+        assert len(res_dict['results']) == 1, res_dict
+        assert res_dict['results'][0]['name'] == 'warandpeace', res_dict['results'][0]['name']
+
+    def test_11_pagination_syntax_error(self):
+        offset = self.base_url + '?all_fields=1&q="tags:russian"&start=should_be_integer&rows=1&order_by=name' # invalid offset value
+        res = self.app.get(offset, status=400)
+        print res.body
+        assert('should_be_integer' in res.body)
+
+    def test_13_just_groups(self):
+        offset = self.base_url + '?groups=roger'
+        res = self.app.get(offset, status=200)
+        res_dict = self.data_from_res(res)
+        assert res_dict['count'] == 1, res_dict
+
+class TestPackageSearchApi1(Api1TestCase, PackageSearchApiTestCase,
+                            LegacyOptionsTestCase): pass
+class TestPackageSearchApi2(Api2TestCase, PackageSearchApiTestCase,
+                            LegacyOptionsTestCase): pass
+class TestPackageSearchApi3(Api3TestCase, PackageSearchApiTestCase):
+    '''Here are tests with URIs in specifically SOLR syntax.'''
     def test_07_uri_qjson_tags(self):
         query = {'q': 'tags:tolstoy'}
         json_query = self.dumps(query)
@@ -159,21 +372,6 @@
         self.assert_results(res_dict, [u'annakarenina', u'warandpeace'])
         assert res_dict['count'] == 2, res_dict
 
-    def test_07_uri_qjson_extras(self):
-        # TODO: solr is not currently set up to allow partial matches 
-        #       and extras are not saved as multivalued so this
-        #       test will fail. Make extras multivalued or remove?
-        from ckan.tests import SkipTest
-        raise SkipTest
-
-        query = {"geographic_coverage":"England"}
-        json_query = self.dumps(query)
-        offset = self.base_url + '?qjson=%s' % json_query
-        res = self.app.get(offset, status=200)
-        res_dict = self.data_from_res(res)
-        self.assert_results(res_dict, ['testpkg'])
-        assert res_dict['count'] == 1, res_dict
-
     def test_07_uri_qjson_extras_2(self):
         query = {'q': "national_statistic:yes"}
         json_query = self.dumps(query)
@@ -183,18 +381,7 @@
         self.assert_results(res_dict, ['testpkg'])
         assert res_dict['count'] == 1, res_dict
 
-    def test_08_uri_qjson_malformed(self):
-        offset = self.base_url + '?qjson="q":""' # user forgot the curly braces
-        res = self.app.get(offset, status=400)
-        self.assert_json_response(res, 'Bad request - Could not read parameters')
-        
     def test_08_all_fields(self):
-        rating = model.Rating(user_ip_address=u'123.1.2.3',
-                              package=self.anna,
-                              rating=3.0)
-        model.Session.add(rating)
-        model.repo.commit_and_remove()
-        
         query = {'q': 'russian', 'fl': '*'}
         json_query = self.dumps(query)
         offset = self.base_url + '?qjson=%s' % json_query
@@ -212,62 +399,17 @@
         for expected_tag in ['russian', 'tolstoy']:
             assert expected_tag in anna_rec['tags']
 
-        # TODO: these values are not being passed to Solr
-        # assert anna_rec['ratings_average'] == 3.0, anna_rec['ratings_average']
-        # assert anna_rec['ratings_count'] == 1, anna_rec['ratings_count']
-
         # try alternative syntax
         offset = self.base_url + '?q=russian&fl=*'
         res2 = self.app.get(offset, status=200)
         assert_equal(res2.body, res.body)
 
-    def test_08_all_fields_syntax_error(self):
-        offset = self.base_url + '?all_fields=should_be_boolean' # invalid all_fields value
-        res = self.app.get(offset, status=400)
-        assert('all_fields' in res.body)
-
     def test_09_just_tags(self):
         offset = self.base_url + '?q=tags:russian&fl=*'
         res = self.app.get(offset, status=200)
         res_dict = self.data_from_res(res)
         assert res_dict['count'] == 2, res_dict
 
-    def test_10_multiple_tags(self):
-        offset = self.base_url + '?q=tags:tolstoy tags:russian&fl=*'
-        res = self.app.get(offset, status=200)
-        res_dict = self.data_from_res(res)
-        assert res_dict['count'] == 1, res_dict
-
-    def test_10_multiple_tags_with_plus(self):
-        # TODO: this syntax doesn't work with Solr search, update documentation
-        from nose import SkipTest
-        raise SkipTest
-
-        offset = self.base_url + '?tags=tolstoy+russian&all_fields=1'
-        res = self.app.get(offset, status=200)
-        res_dict = self.data_from_res(res)
-        assert res_dict['count'] == 1, res_dict
-
-    def test_10_multiple_tags_with_ampersand(self):
-        # TODO: this syntax doesn't work with Solr search, update documentation
-        from nose import SkipTest
-        raise SkipTest
-
-        offset = self.base_url + '?tags=tolstoy&tags=russian&all_fields=1'
-        res = self.app.get(offset, status=200)
-        res_dict = self.data_from_res(res)
-        assert res_dict['count'] == 1, res_dict
-
-    def test_10_many_tags_with_ampersand(self):
-        # TODO: this syntax doesn't work with Solr search, update documentation
-        from nose import SkipTest
-        raise SkipTest
-
-        offset = self.base_url + '?tags=tolstoy&tags=russian&tags=tolstoy'
-        res = self.app.get(offset, status=200)
-        res_dict = self.data_from_res(res)
-        assert res_dict['count'] == 1, res_dict
-
     def test_11_pagination_limit(self):
         offset = self.base_url + '?fl=*&q=tags:russian&rows=1&sort=name asc'
         res = self.app.get(offset, status=200)
@@ -285,30 +427,15 @@
         assert res_dict['results'][0]['name'] == 'warandpeace', res_dict['results'][0]['name']
 
     def test_11_pagination_syntax_error(self):
-        offset = self.base_url + '?fl=*&q="tags:russian"&start=should_be_integer&rows=1&sort=name' # invalid offset value
+        offset = self.base_url + '?fl=*&q=tags:russian&start=should_be_integer&rows=1&sort=name asc' # invalid offset value
         res = self.app.get(offset, status=400)
         print res.body
         assert('should_be_integer' in res.body)
 
-    def test_12_all_packages_qjson(self):
-        query = {'q': ''}
-        json_query = self.dumps(query)
-        offset = self.base_url + '?qjson=%s' % json_query
-        res = self.app.get(offset, status=200)
-        res_dict = self.data_from_res(res)
-        assert_equal(res_dict['count'], 3)
-
-    def test_12_all_packages_q(self):
-        offset = self.base_url + '?q=""'
-        res = self.app.get(offset, status=200)
-        res_dict = self.data_from_res(res)
-        assert_equal(res_dict['count'], 3)
-
-    def test_12_all_packages_no_q(self):
-        offset = self.base_url
-        res = self.app.get(offset, status=200)
-        res_dict = self.data_from_res(res)
-        assert_equal(res_dict['count'], 3)
+    def test_12_v1_or_v2_syntax(self):
+        offset = self.base_url + '?all_fields=1'
+        res = self.app.get(offset, status=400)
+        assert("Invalid search parameters: ['all_fields']" in res.body), res.body
 
     def test_13_just_groups(self):
         offset = self.base_url + '?q=groups:roger'
@@ -316,9 +443,10 @@
         res_dict = self.data_from_res(res)
         assert res_dict['count'] == 1, res_dict
 
-class TestPackageSearchApi1(Api1TestCase, PackageSearchApiTestCase): pass
-class TestPackageSearchApi2(Api2TestCase, PackageSearchApiTestCase): pass
-class TestPackageSearchApiUnversioned(PackageSearchApiTestCase, ApiUnversionedTestCase): pass
 
+class TestPackageSearchApiUnversioned(PackageSearchApiTestCase,
+                                      ApiUnversionedTestCase,
+                                      LegacyOptionsTestCase): pass
 
 
+


--- a/ckan/tests/functional/api/test_resource_search.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/tests/functional/api/test_resource_search.py	Fri Sep 30 17:58:24 2011 +0100
@@ -79,7 +79,7 @@
         assert 'package_id' in result.body, result.body
 
 
-class TestResourceSearchApi1(ResourceSearchApiTestCase, Api1TestCase): pass
+class TestResourceSearchApi1(Api1TestCase, ResourceSearchApiTestCase): pass
 class TestResourceSearchApi2(Api2TestCase, ResourceSearchApiTestCase): pass
 class TestResourceSearchApiUnversioned(ApiUnversionedTestCase, ResourceSearchApiTestCase):
     pass


--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ckan/tests/functional/test_search.py	Fri Sep 30 17:58:24 2011 +0100
@@ -0,0 +1,68 @@
+# These only test that the controller is passing on queries correctly
+# to the search library. The search library is tested in:
+# ckan/tests/lib/test_solr_package_search.py
+
+import re
+from nose.tools import assert_equal
+
+from ckan.tests import (TestController, CreateTestData,
+                        setup_test_search_index, html_check)
+from ckan import model
+import ckan.lib.search as search
+
+class TestSearch(TestController, html_check.HtmlCheckMethods):
+    # 'penguin' is in all test search packages
+    q_all = u'penguin'
+
+    @classmethod
+    def setup_class(cls):
+        model.Session.remove()
+        setup_test_search_index()
+        CreateTestData.create_search_test_data()
+        cls.count_re = re.compile('<strong>(\d)</strong> datasets found')
+
+    @classmethod
+    def teardown_class(cls):
+        model.repo.rebuild_db()
+        search.clear()
+
+    def _pkg_names(self, result):
+        return ' '.join(result['results'])
+
+    def _check_results(self, res, expected_count, expected_package_names=[]):
+        '''Takes a search result web page and determines whether the
+        search results displayed match the expected count and names
+        of packages.'''
+        # get count
+        content = self.named_div('content', res)
+        count_match = self.count_re.search(content)
+        assert count_match
+        assert_equal(len(count_match.groups()), 1)
+        count = int(count_match.groups()[0])
+        assert_equal(count, expected_count)
+
+        # check package names
+        if isinstance(expected_package_names, basestring):
+            expected_package_names = [expected_package_names]
+        for expected_name in expected_package_names:
+            expected_html = '<a href="/dataset/%s">' % expected_name
+            assert expected_html in res.body, \
+                   'Could not find package name %r in the results page'
+
+    def test_1_all_records(self):
+        res = self.app.get('/dataset?q')
+        result = self._check_results(res, 6, 'gils')
+
+    def test_1_name(self):
+        # exact name
+        res = self.app.get('/dataset?q=gils')
+        result = self._check_results(res, 1, 'gils')
+
+    def test_2_title(self):
+        # exact title, one word
+        res = self.app.get('/dataset?q=Opengov.se')
+        result = self._check_results(res, 1, 'se-opengov')
+
+        # multiple words
+        res = self.app.get('/dataset?q=Government%20Expenditure')
+        result = self._check_results(res, 1, 'uk-government-expenditure')


--- a/ckan/tests/lib/test_solr_package_search.py	Fri Sep 30 17:57:25 2011 +0100
+++ b/ckan/tests/lib/test_solr_package_search.py	Fri Sep 30 17:58:24 2011 +0100
@@ -1,8 +1,29 @@
+from nose.tools import assert_equal, assert_raises
+
 from ckan.tests import TestController, CreateTestData, setup_test_search_index
 from ckan import model
 import ckan.lib.search as search
 
 
+class TestQuery:
+    def test_1_convert_legacy_params_to_solr(self):
+        convert = search.convert_legacy_parameters_to_solr
+        assert_equal(convert({'title': 'bob'}), {'q': 'title:bob'})
+        assert_equal(convert({'title': 'bob', 'fl': 'name'}),
+                     {'q': 'title:bob', 'fl': 'name'})
+        assert_equal(convert({'title': 'bob perkins'}), {'q': 'title:"bob perkins"'})
+        assert_equal(convert({'q': 'high+wages'}), {'q': 'high wages'})
+        assert_equal(convert({'q': 'high+wages summary'}), {'q': 'high wages summary'})
+        assert_equal(convert({'title': 'high+wages'}), {'q': 'title:"high wages"'})
+        assert_equal(convert({'title': 'bob', 'all_fields': 1}), {'q': 'title:bob', 'fl': '*'})
+        assert_raises(search.SearchError, convert, {'title': 'bob', 'all_fields': 'non-boolean'})
+        assert_equal(convert({'q': 'bob', 'order_by': 'name'}), {'q': 'bob', 'sort':'name asc'})
+        assert_equal(convert({'q': 'bob', 'offset': '0', 'limit': '10'}), {'q': 'bob', 'start':'0', 'rows':'10'})
+        assert_equal(convert({'tags': ['russian', 'tolstoy']}), {'q': 'tags:russian tags:tolstoy'})
+        assert_equal(convert({'tags': ['tolstoy']}), {'q': 'tags:tolstoy'})
+        assert_equal(convert({'tags': 'tolstoy'}), {'q': 'tags:tolstoy'})
+        assert_raises(search.SearchError, convert, {'tags': {'tolstoy':1}})
+
 class TestSearch(TestController):
     # 'penguin' is in all test search packages
     q_all = u'penguin'
@@ -253,11 +274,9 @@
         model.repo.rebuild_db()
         search.clear()
 
-    def _check_search_results(self, terms, expected_count, expected_packages=[], only_open=False, only_downloadable=False):
+    def _check_search_results(self, terms, expected_count, expected_packages=[]):
         query = {
             'q': unicode(terms),
-            'filter_by_openness': only_open,
-            'filter_by_downloadable': only_downloadable
         }
         result = search.query_for(model.Package).run(query)
         pkgs = result['results']
@@ -277,9 +296,6 @@
         self._check_search_results('groups:david', 2)
         self._check_search_results('groups:roger', 1)
         self._check_search_results('groups:lenny', 0)
-        self._check_search_results('annakarenina', 1, ['annakarenina'], True, False)
-        self._check_search_results('annakarenina', 1, ['annakarenina'], False, True)
-        self._check_search_results('annakarenina', 1, ['annakarenina'], True, True)
         
 
 class TestGeographicCoverage(TestController):


--- a/doc/action_api.rst	Fri Sep 30 17:57:25 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,241 +0,0 @@
-.. index:: API
-
-===========================
-Reference: CKAN Action API
-===========================
-
-.. toctree::
-   :hidden:
-   :maxdepth: 1
-
-.. warning:: The Action API is still experimental and subject to change of URI locations, formats, parameters and results.
-
-Overview
---------
-
-The Action API is a powerful RPC-style way of accessing CKAN data. Its intention is to have access to all the core logic in ckan. It calls exactly the same functions that are used internally which all the other CKAN interfaces (Web interface / Model API) go through. Therefore it provides the full gamut of read and write operations, with all possible parameters.
-
-A client supplies parameters to the Action API via a JSON dictionary of a POST request, and returns results, help information and any error diagnostics in a JSON dictionary too. This is a departure from the CKAN API versions 1 and 2, which being RESTful required all the request parameters to be part of the URL.
-
-Requests
---------
-
-URL
-===
-
-The basic URL for the Action API is::
-
- /api/action/{logic_action}
-
-Examples::
- 
- /api/action/package_list
- /api/action/package_show
- /api/action/user_create
-
-Actions
-=======
-
-get.py:
-
-====================================== ===========================
-Logic Action                           Parameter keys
-====================================== ===========================
-site_read                              (none)                      
-package_list                           (none)
-current_package_list_with_resources    limit
-revision_list                          (none)
-package_revision_list                  id
-group_list                             all_fields
-group_list_authz                       (none)
-group_list_available                   (none)
-group_revision_list                    id
-licence_list                           (none)
-tag_list                               q, all_fields, limit, offset, return_objects
-user_list                              q, order_by
-package_relationships_list             id, id2, rel
-package_show                           id
-revision_show                          id
-group_show                             id
-tag_show                               id
-user_show                              id
-package_show_rest                      id
-group_show_rest                        id
-tag_show_rest                          id
-package_autocomplete                   q
-tag_autocomplete                       q, limit
-format_autocomplete                    q, limit
-user_autocomplete                      q, limit
-package_search                         q, fields, facet_by, limit, offset, filter_by_openness, filter_by_downloadable
-====================================== ===========================
-
-new.py: 
-
-====================================== ===========================
-Logic Action                           Parameter keys
-====================================== ===========================
-package_create                         (package keys)
-package_create_validate                (package keys)
-resource_create                        (resource keys)
-package_relationship_create            id, id2, rel, comment
-group_create                           (group keys)
-rating_create                          package, rating
-user_create                            (user keys)
-package_create_rest                    (package keys)
-group_create_rest                      (group keys)
-====================================== ===========================
-
-update.py:
-
-====================================== ===========================
-Logic Action                           Parameter keys
-====================================== ===========================
-make_latest_pending_package_active     id
-resource_update                        (resource keys)
-package_update                         (package keys)
-package_update_validate                (package keys)
-package_relationship_update            id, id2, rel, comment
-group_update                           (group keys)
-user_update                            (user keys), reset_key
-package_update_rest                    (package keys)
-group_update_rest                      (group keys)
-====================================== ===========================
-
-delete.py:
-
-====================================== ===========================
-Logic Action                           Parameter keys
-====================================== ===========================
-package_delete                         id
-package_relationship_delete            id, id2, rel
-group_delete                           id
-====================================== ===========================
-
-In case of doubt, refer to the code of the logic actions, which is found in the CKAN source in the ckan/logic/action directory.
-
-Object dictionaries
-===================
-
-Package:
-
-======================== ====================================== =============
-key                      example value                          notes
-======================== ====================================== =============
-id                       "fd788e57-dce4-481c-832d-497235bf9f78" (Read-only) unique identifier
-name                     "uk-spending"                          Unique identifier. Should be human readable
-title                    "UK Spending"                          Human readable title of the dataset
-url                      "http://gov.uk/spend-downloads.html"   Home page for the data
-version                  "1.0"                                  Version associated with the data. String format.
-author                   "UK Treasury"                          Name of person responsible for the data
-author_email             "contact at treasury.gov.uk"              Email address for the person in the 'author' field
-maintainer               null                                   Name of another person responsible for the data
-maintainer_email         null                                   Email address for the person in the 'maintainer' field
-notes                    "### About\\r\\n\\r\\nUpdated 1997."   Other human readable info about the dataset. Markdown format.
-license_id               "cc-by"                                ID of the license this dataset is released under. You can then look up the license ID to get the title.
-extras                   []                                      
-tags                     ["government-spending"]                List of tags associated with this dataset.
-groups                   ["spending", "country-uk"]             List of groups this dataset is a member of.
-relationships_as_subject []                                     List of relationships (edit this only using relationship specific command). The 'type' of the relationship is described in terms of this package being the subject and the related package being the object.
-state                    active                                 May be ``deleted`` or other custom states like ``pending``.
-revision_id              "f645243a-7334-44e2-b87c-64231700a9a6" (Read-only) ID of the last revision for the core package object was (doesn't include tags, groups, extra fields, relationships).
-revision_timestamp       "2010-12-21T15:26:17.345502"           (Read-only) Time and date when the last revision for the core package object was (doesn't include tags, groups, extra fields, relationships). ISO format. UTC timezone assumed.
-======================== ====================================== =============
-
-Package Extra:
-
-======================== ====================================== =============
-key                      example value                          notes
-======================== ====================================== =============
-id                       "c10fb749-ad46-4ba2-839a-41e8e2560687" (Read-only)
-key                      "number_of_links"
-value                    "10000"
-package_id               "349259a8-cbff-4610-8089-2c80b34e27c5" (Read-only) Edit package extras with package_update
-state                    "active"                               (Read-only) Edit package extras with package_update
-revision_timestamp       "2010-09-01T08:56:53.696551"           (Read-only)
-revision_id              "233d0c19-fcdc-44b9-9afe-25e2aa9d0a5f" (Read-only)
-======================== ====================================== =============
-
-
-Resource:
-
-======================== ====================================== =============
-key                      example value                          notes
-======================== ====================================== =============
-id                       "888d00e9-6ee5-49ca-9abb-6f216e646345" (Read-only)
-url                      "http://gov.uk/spend-july-2009.csv"    Download URL of the data
-description              ""
-format                   "XLS"                                  Format of the data
-hash                     null                                   Hash of the data e.g. SHA1
-state                    "active"
-position                 0                                      (Read-only) This is set by the order of resources are given in the list when creating/updating the package.
-resource_group_id        "49ddadb0-dd80-9eff-26e9-81c5a466cf6e" (Read-only)
-revision_id              "188ac88b-1573-48bf-9ea6-d3c503db5816" (Read-only)
-revision_timestamp       "2011-07-08T14:48:38.967741"           (Read-only)
-======================== ====================================== =============
-
-Tag:
-
-======================== ====================================== =============
-key                      example value                          notes
-======================== ====================================== =============
-id                       "b10871ea-b4ae-4e2e-bec9-a8d8ff357754" (Read-only)
-name                     "country-uk"                           (Read-only) Add/remove tags from a package or group using update_package or update_group
-state                    "active"                               (Read-only) Add/remove tags from a package or group using update_package or update_group
-revision_timestamp       "2009-08-08T12:46:40.920443"           (Read-only)
-======================== ====================================== =============
-
-Parameters
-==========
-
-Requests must be a POST, including parameters in a JSON dictionary. If there are no parameters required, then an empty dictionary is still required (or you get a 400 error).
-
-Examples::
-
- curl http://test.ckan.net/api/action/package_list -d '{}'
- curl http://test.ckan.net/api/action/package_show -d '{"id": "fd788e57-dce4-481c-832d-497235bf9f78"}'
-
-Authorization Header
-====================
-
-Authorization is carried out the same way as the existing API, supplying the user's API key in the "Authorization" header. 
-
-Depending on the settings of the instance, you may not need to identify yourself for simple read operations. (This is the case for thedatahub.org and is assumed for the examples below.)
-
-JSONP
-=====
-
-TBC
-
-Responses
-=========
-
-The response is wholly contained in the form of a JSON dictionary. Here is the basic format of a successful request::
-
- {"help": "Creates a package", "success": true, "result": ...}
-
-And here is one that incurred an error::
-
- {"help": "Creates a package", "success": false, "error": {"message": "Access denied", "__type": "Authorization Error"}}
-
-Where:
-
-* ``help`` is the 'doc string' (or ``null``)
-* ``success`` is ``true`` or ``false`` depending on whether the request was successful. The response is always status 200, so it is important to check this value.
-* ``result`` is the main payload that results from a successful request. This might be a list of the domain object names or a dictionary with the particular domain object.
-* ``error`` is supplied if the request was not successful and provides a message and __type. See the section on errors.
-
-Errors
-======
-
-The message types include:
-  * Authorization Error - an API key is required for this operation, and the corresponding user needs the correct credentials
-  * Validation Error - the object supplied does not meet with the standards described in the schema.
-  * (TBC) JSON Error - the request could not be parsed / decoded as JSON format, according to the Content-Type (default is ``application/x-www-form-urlencoded;utf-8``).
-
-Examples
-========
-
-::
-
- $ curl http://ckan.net/api/action/package_show -d '{"id": "fd788e57-dce4-481c-832d-497235bf9f78"}'
- {"help": null, "success": true, "result": {"maintainer": null, "name": "uk-quango-data", "relationships_as_subject": [], "author": null, "url": "http://www.guardian.co.uk/news/datablog/2009/jul/07/public-finance-regulators", "relationships_as_object": [], "notes": "### About\r\n\r\nDid you know there are nearly 1,200 unelected bodies with power over our lives? This is the full list, complete with number of staff and how much they cost. As a spreadsheet\r\n\r\n### Openness\r\n\r\nNo licensing information found.", "title": "Every Quango in Britain", "maintainer_email": null, "revision_timestamp": "2010-12-21T15:26:17.345502", "author_email": null, "state": "active", "version": null, "groups": [], "license_id": "notspecified", "revision_id": "f645243a-7334-44e2-b87c-64231700a9a6", "tags": [{"revision_timestamp": "2009-08-08T12:46:40.920443", "state": "active", "id": "b10871ea-b4ae-4e2e-bec9-a8d8ff357754", "name": "country-uk"}, {"revision_timestamp": "2009-08-08T12:46:40.920443", "state": "active", "id": "ed783bc3-c0a1-49f6-b861-fd9adbc1006b", "name": "quango"}], "id": "fd788e57-dce4-481c-832d-497235bf9f78", "resources": [{"resource_group_id": "49ddadb0-dd80-9eff-26e9-81c5a466cf6e", "hash": null, "description": "", "format": "", "url": "http://spreadsheets.google.com/ccc?key=tm4Dxoo0QtDrEOEC1FAJuUg", "revision_timestamp": "2011-07-08T14:48:38.967741", "state": "active", "position": 0, "revision_id": "188ac88b-1573-48bf-9ea6-d3c503db5816", "id": "888d00e9-6ee5-49ca-9abb-6f216e646345"}], "extras": []}}
\ No newline at end of file


--- a/doc/api.rst	Fri Sep 30 17:57:25 2011 +0100
+++ b/doc/api.rst	Fri Sep 30 17:58:24 2011 +0100
@@ -59,6 +59,12 @@
 
 The only exception for this is for Tag objects. Since Tag names are immutable, they are always referred to with their Name.
 
+Version 3
+~~~~~~~~~
+
+This version is in beta. To details of trying it out, see :doc:`apiv3`.
+
+
 
 API Details - Versions 1 & 2
 ----------------------------
@@ -85,7 +91,6 @@
 * `Model API`_
 * `Search API`_
 * `Util API`_
-* `Action API`_
 
 The resources, methods, and data formats of each are described below.
 
@@ -329,7 +334,7 @@
 |                       |               |                                  | parameter as a more flexible     |
 |                       |               |                                  | alternative in GET requests.     |
 +-----------------------+---------------+----------------------------------+----------------------------------+
-|title,                 | Search-String || title=uk&tags=health+census | Search in a particular a field.  |
+|title,                 | Search-String || title=uk&tags=health        | Search in a particular a field.  |
 |tags, notes, groups,   |               || department=environment          |                                  |
 |author, maintainer,    |               |                                  |                                  |
 |update_frequency, or   |               |                                  |                                  |
@@ -349,12 +354,9 @@
 |                       |               |                                  | (0) or the full dataset record   |
 |                       |               |                                  | (1).                             |
 +-----------------------+---------------+----------------------------------+----------------------------------+
-| filter_by_openness    | 0 (default)   | filter_by_openness=1             | Filters results by ones which are|
-|                       | or 1          |                                  | open.                            |
-+-----------------------+---------------+----------------------------------+----------------------------------+
-|filter_by_downloadable | 0 (default)   | filter_by_downloadable=1         | Filters results by ones which    |
-|                       | or 1          |                                  | have at least one resource URL.  |
-+-----------------------+---------------+----------------------------------+----------------------------------+
+
+.. Note: filter_by_openness and filter_by_downloadable were dropped from CKAN version 1.5 onwards.
+
 
 **Resource Parameters**
 
@@ -554,4 +556,4 @@
 Action API
 ~~~~~~~~~~
 
-See: :doc:`action_api`
\ No newline at end of file
+See: 
\ No newline at end of file


http://bitbucket.org/okfn/ckan/changeset/2f3a1d85b443/
changeset:   2f3a1d85b443
user:        dread
date:        2011-09-30 19:13:12
summary:     [i18n] Synced strings with Transifex and compiled i18n - notably hungarian.
affected #:  4 files (-1 bytes)

--- a/ckan/i18n/__init__.py	Fri Sep 30 17:58:24 2011 +0100
+++ b/ckan/i18n/__init__.py	Fri Sep 30 18:13:12 2011 +0100
@@ -3,11 +3,21 @@
 
 
 # TODO: Figure out a nicer way to get this. From the .ini? 
-_KNOWN_LOCALES = ['en', 'ca', 'de',
-                  'es', 'fi', 'fr', 
-                  'it', 'nl', 'no',
-                  'pt_BR', 'ru',
-                  'sq', 'cs_CZ', 'bg',
+# Order these by number of people speaking it in Europe:
+# http://en.wikipedia.org/wiki/Languages_of_the_European_Union#Knowledge
+# (or there abouts)
+_KNOWN_LOCALES = ['en', 'de', 'fr', 'it', 'es',
+#                  'po',
+                  'ru',
+                  'nl',
+                  'no',
+                  'cs_CZ',
+                  'hu',
+                  'pt_BR',
+                  'fi', 
+                  'bg',
+                  'ca',
+                  'sq', 
                   ]
 
 def get_available_locales():


--- a/ckan/i18n/ca/LC_MESSAGES/ckan.po	Fri Sep 30 17:58:24 2011 +0100
+++ b/ckan/i18n/ca/LC_MESSAGES/ckan.po	Fri Sep 30 18:13:12 2011 +0100
@@ -2515,759 +2515,3 @@
 msgid "User name:"
 msgstr "Nom d'usuari:"
 
-#~ msgid "Welcome back, %s"
-#~ msgstr "Benvingut de nou, %s"
-
-#~ msgid "Package name already exists in database"
-#~ msgstr "Aquest nom de paquet ja existeix a la base de dades"
-
-#~ msgid "Package resource(s) incomplete."
-#~ msgstr "Recurs(os) del paquet incomplet"
-
-#~ msgid "This package satisfies the Open Definition."
-#~ msgstr "Aquest paquet compleix la Open Definition."
-
-#~ msgid "[Open Content]"
-#~ msgstr "[Contingut obert]"
-
-#~ msgid "Number of packages"
-#~ msgstr "Nombre de paquets"
-
-#~ msgid "View package resources"
-#~ msgstr "Veure recursos del paquet"
-
-#~ msgid "Skip to content"
-#~ msgstr "Saltar al contingut"
-
-#~ msgid "Add a package"
-#~ msgstr "Afegir un paquet"
-
-#~ msgid "Packages"
-#~ msgstr "Paquets"
-
-#~ msgid "Register a new Package"
-#~ msgstr "Registrar un nou Paquet"
-
-#~ msgid "Full %s dump"
-#~ msgstr "Bolcat total en %s"
-
-#~ msgid "Groups & Tags"
-#~ msgstr "Grups i Etiquetes"
-
-#~ msgid "Create a new Group"
-#~ msgstr "Crear un nou Grup"
-
-#~ msgid "Create a new Authorization Group"
-#~ msgstr "Crear un nou grup d'autorització"
-
-#~ msgid "Project Home Page"
-#~ msgstr "Pàgina principal del projecte"
-
-#~ msgid "Language"
-#~ msgstr "Idioma"
-
-#~ msgid "Credits"
-#~ msgstr "Crèdits"
-
-#~ msgid ""
-#~ "[1:]\n"
-#~ "                An\n"
-#~ "                [2:Open Knowledge Foundation] Project"
-#~ msgstr ""
-#~ "[1:]\n"
-#~ "                Un\n"
-#~ "                projecte de la [2:Open Knowledge Foundation]"
-
-#~ msgid "Powered by CKAN"
-#~ msgstr "Funciona amb CKAN"
-
-#~ msgid "v%(version)s"
-#~ msgstr "v%(version)s"
-
-#~ msgid "Authorization for authorization group:"
-#~ msgstr "Autorització per als Grups d'autorització:"
-
-#~ msgid "- Edit - AuthorizationGroups"
-#~ msgstr "- Editar - Grups d'autorització"
-
-#~ msgid "Edit Authorization Group:"
-#~ msgstr "Editar Grup d'autorització"
-
-#~ msgid ""
-#~ "Instead of specifying the privileges of"
-#~ " specific users on a package or "
-#~ "group,\n"
-#~ "          you can also specify a "
-#~ "set of users that will share the"
-#~ " same rights. To do that, an    \n"
-#~ ""
-#~ "          [1:authorization group] can be "
-#~ "set-up and users can be added "
-#~ "to it."
-#~ msgstr ""
-#~ "En comptes d'especificar els privilegis "
-#~ "d'usuaris específics sobre un paquet o"
-#~ " grup,\n"
-#~ "          també podeu especificar un "
-#~ "conjunt d'usuaris que compartiran els "
-#~ "mateixos drets. Per fer-ho, an    \n"
-#~ ""
-#~ "          es pot crear un [1:grup d'autorització] i afegir-hi usuaris."
-
-#~ msgid "To create a new authorization group, please first"
-#~ msgstr "Per a crear un grup d'autorització, si us plau"
-
-#~ msgid "login"
-#~ msgstr "inicieu la sessió"
-
-#~ msgid "Administrators:"
-#~ msgstr "Administradors:"
-
-#~ msgid "Users:"
-#~ msgstr "Usuaris:"
-
-#~ msgid "Authorization for group:"
-#~ msgstr "Autorització per al grup:"
-
-#~ msgid "Edit Group:"
-#~ msgstr "Editar Grup:"
-
-#~ msgid "There are no packages currently in this group."
-#~ msgstr "Actualment no hi ha paquets dins d'aquest grup."
-
-#~ msgid "Groups of Data Packages"
-#~ msgstr "Grups de Paquets de dades"
-
-#~ msgid "There are [1:%(item_count)s] groups."
-#~ msgstr "Hi ha [1:%(item_count)s] grups."
-
-#~ msgid ""
-#~ "Whilst tags are great at collecting "
-#~ "packages together, there are occasions "
-#~ "when you want to restrict users "
-#~ "from editing a collection. A [1:group]"
-#~ " can be set-up to specify which"
-#~ " users have permission to add or "
-#~ "remove packages from it."
-#~ msgstr ""
-#~ "Tot i que les etiquetes són molt"
-#~ " útils per agrupar paquets, hi ha "
-#~ "ocasions en que cal restringir l'edició"
-#~ " dins d'una col·lecció als usuaris. "
-#~ "Es pot crear un [1:grup] per "
-#~ "especificar quins usuaris tenen permís "
-#~ "per afegir-hi o eliminar-ne "
-#~ "paquets. "
-
-#~ msgid "To create a new group, please first"
-#~ msgstr "Per a crear un grup, si us plau"
-
-#~ msgid "Packages:"
-#~ msgstr "Paquets:"
-
-#~ msgid "There are %(item_count)s packages in this group."
-#~ msgstr "Hi ha %(item_count)s paquets en aquest grup."
-
-#~ msgid ""
-#~ "CKAN is the Comprehensive Knowledge "
-#~ "Archive Network, a [1:registry] of "
-#~ "[2:open knowledge] packages and projects\n"
-#~ ""
-#~ "    (and a few closed ones)."
-#~ msgstr ""
-#~ "CKAN és la Comprehensive Knowledge "
-#~ "Archive Network, un [1:registre] de "
-#~ "paquets i projectes de [2:coneixement "
-#~ "obert]\n"
-#~ "    (i alguns de tancat)."
-
-#~ msgid ""
-#~ "As the diagram shows, CKAN combines "
-#~ "the features of a listing/registry,\n"
-#~ "\t\ta package index and a wiki."
-#~ " As a registry it acts like "
-#~ "[1:freshmeat] but for open data and\n"
-#~ ""
-#~ "\t\tcontent resources. However it adds"
-#~ " to a simple registry in key "
-#~ "ways."
-#~ msgstr ""
-#~ "Com mostra el diagrama, CKAN combina "
-#~ "les capacitats d'un llistat/registre,\n"
-#~ "\t\tun índex de paquets i una "
-#~ "wiki. Com a registre és similar a"
-#~ " [1:freshmeat], però per a dades "
-#~ "obertes i\n"
-#~ "\t\trecursos. Però és molt més que un simple registre."
-
-#~ msgid ""
-#~ "%(title)s is an\n"
-#~ "      [1:open registry]\n"
-#~ "      of data and content packages. "
-#~ "Harnessing the CKAN software, this\n"
-#~ "      site makes it easy to find, share and reuse content and data,\n"
-#~ "      especially in ways that are machine automatable."
-#~ msgstr ""
-#~ "%(title)s és un\n"
-#~ "      [1:registre obert]\n"
-#~ "      de dades i paquets de "
-#~ "continguts. Aprofitant les capacitats de "
-#~ "CKAN, aquest\n"
-#~ "      lloc fa fàcil trobar, compartir i reusar contingut i dades,\n"
-#~ "      especialment de forma automatitzable."
-
-#~ msgid "[1:%(package_count)s registered data packages] available."
-#~ msgstr "[1:%(package_count)s paquets de dades registrats] disponibles."
-
-#~ msgid "Top Tags"
-#~ msgstr "Etiquetes més usades"
-
-#~ msgid "Recently changed packages"
-#~ msgstr "Paquets canviats recentment"
-
-#~ msgid "View revision log »"
-#~ msgstr "Veure registre de revisions »"
-
-#~ msgid "var MSG_MORE_HELP = '"
-#~ msgstr ""
-
-#~ msgid "More »"
-#~ msgstr ""
-
-#~ msgid ""
-#~ "';\n"
-#~ "var MSG_ADD_ROW = '"
-#~ msgstr ""
-
-#~ msgid "Add row to table"
-#~ msgstr ""
-
-#~ msgid ""
-#~ "All material on this site is [1:open] and can be freely used, reused\n"
-#~ "    and redistributed. Formally, the "
-#~ "data/database is licensed under the "
-#~ "[2:Open Data Commons Open\n"
-#~ "      Database License v1.0], with all copyrightable content in that\n"
-#~ "    database plus any additional content"
-#~ " on this site licensed under a "
-#~ "[3:Creative Commons\n"
-#~ "      Attribution Share-Alike v3.0 license]."
-#~ msgstr ""
-#~ "Tot el material d'aquest lloc és "
-#~ "[1:obert] i pot ser lliurement usat, "
-#~ "reusat\n"
-#~ "    i redistribuït. De manera formal,"
-#~ " les dades/base de dades tenen una"
-#~ " llicència [2:Open Data Commons Open\n"
-#~ ""
-#~ "      Database License v1.0], amb tot"
-#~ " el contigut susceptible de tenir "
-#~ "copyright en aquesta\n"
-#~ "    base de dades, així com "
-#~ "qualsevol contingut addicional d'aquest lloc,"
-#~ " ofert amb una llicència [3:Creative "
-#~ "Commons\n"
-#~ "      Attribution Share-Alike v3.0 license]."
-
-#~ msgid "- Authorization - Data Packages"
-#~ msgstr "- Autorització - Paquets de dades"
-
-#~ msgid "Authorization for Data Package:"
-#~ msgstr "Autorització èr al paquet de dades:"
-
-#~ msgid "- Data Packages - History"
-#~ msgstr "- Paquets de dades - Historial"
-
-#~ msgid "- Edit - Data Packages"
-#~ msgstr "- Editar - Paquets de dades"
-
-#~ msgid "Edit Data Package:"
-#~ msgstr "Editar paquet de dades:"
-
-#~ msgid "Important:"
-#~ msgstr "Important:"
-
-#~ msgid ""
-#~ "By submitting content, you agree to release your contributions\n"
-#~ "        under the open license specified on the"
-#~ msgstr ""
-#~ "Enviant aquest contingut, accepteu de "
-#~ "publicar les vostres contribucions\n"
-#~ "        sota la llicència oberta especificada en la"
-
-#~ msgid "license page"
-#~ msgstr "pàgina de la llicència"
-
-#~ msgid ". Please"
-#~ msgstr ". Si us plau"
-
-#~ msgid "refrain"
-#~ msgstr "eviteu"
-
-#~ msgid "from editing this page if you are"
-#~ msgstr "editar aquesta pàgina si"
-
-#~ msgid "not"
-#~ msgstr "no"
-
-#~ msgid "happy to do this."
-#~ msgstr "hi esteu d'acord."
-
-#~ msgid "- History"
-#~ msgstr "- Historial"
-
-#~ msgid "Revision ID"
-#~ msgstr "Id de la revisió"
-
-#~ msgid "Package with timestamp"
-#~ msgstr "Paquet amb marca horària"
-
-#~ msgid "Package History"
-#~ msgstr "Historial del paquet"
-
-#~ msgid "New - Data Packages"
-#~ msgstr "Nou - Paquets de dades"
-
-#~ msgid "Register a New Data Package"
-#~ msgstr "Registrar un nou Paquet de dades"
-
-#~ msgid ""
-#~ "Terms that may link this dataset "
-#~ "to similar ones. For more information"
-#~ " on conventions, see"
-#~ msgstr ""
-#~ "Terme que poden enllaçar aquest conjunt"
-#~ " de dades a altres similars. Per "
-#~ "a més informació sobre convencions, "
-#~ "vegeu"
-
-#~ msgid "this wiki page"
-#~ msgstr "aquesta pàgina de la wiki"
-
-#~ msgid "URL*"
-#~ msgstr "URL*"
-
-#~ msgid ""
-#~ "These can be repeated as required. "
-#~ "For example if the data is being"
-#~ " supplied in multiple formats, or "
-#~ "split into different areas or time "
-#~ "periods, each file is a different "
-#~ "'resource' which should be described "
-#~ "differently. They will all appear on "
-#~ "the dataset page on CKAN together."
-#~ msgstr ""
-#~ "Podeu afegir-ne tants com sigui "
-#~ "necessari. Per exemple, si les dades "
-#~ "s'ofereixen en múltiples formats o "
-#~ "separades en diferents àrees o períodes"
-#~ " de temps, cada arxiu és un "
-#~ "'recurs' diferent, que hauria de ser "
-#~ "descrit diferentment. Tots ells apareixeran"
-#~ " junts a la pàgina del conjunt "
-#~ "de dades de CKAN."
-
-#~ msgid "URL:"
-#~ msgstr "URL:"
-
-#~ msgid ""
-#~ "This is the Internet link directly "
-#~ "to the data - by selecting this"
-#~ " link in a web browser, the "
-#~ "user will immediately download the full"
-#~ " data set. Note that datasets are "
-#~ "not hosted on this site, but by"
-#~ " the publisher of the data. "
-#~ "Alternatively the URL can point to "
-#~ "an API server such as a SPARQL "
-#~ "endpoint or JSON-P service."
-#~ msgstr ""
-#~ "Aquest és un enllaç directe a les"
-#~ " dades a través d'Internet - "
-#~ "seleccionant aquest enllaç en un "
-#~ "navegador web, l'usuari es descarregarà "
-#~ "de forma immediata el conjunt de "
-#~ "dades sencer.Tingueu en compte que les"
-#~ " dades no estan allotjades en aquest"
-#~ " lloc, sinó per qui les publica. "
-#~ "Alternativament, la URL pot apuntar a"
-#~ " un servidor API com un punt "
-#~ "d'accés SPARQL o un servei JSON-P."
-
-#~ msgid "Format:"
-#~ msgstr "Format:"
-
-#~ msgid "This should give the file format in which the data is supplied."
-#~ msgstr "Això hauria d'indicar el format de fitxer en que les dades s'ofereixen."
-
-#~ msgid "Any information you want to add to describe the resource."
-#~ msgstr "Qualsevol informació que vulgueu afegir per a descriure el recurs."
-
-#~ msgid ""
-#~ "By submitting content, you agree to release your contributions\n"
-#~ "  under the open license specified on the"
-#~ msgstr ""
-#~ "Enviant aquest contingut, accepteu de "
-#~ "publicar les vostres contribucions\n"
-#~ "        sota la llicència oberta especificada en la"
-
-#~ msgid ""
-#~ "<script type=\"text/javascript\">\n"
-#~ "//<![CDATA[\n"
-#~ "(function($){\n"
-#~ "    $.fn.ajaxCreateSlug = function(name, url) {\n"
-#~ "        var title = this;\n"
-#~ "        var updater = {\n"
-#~ "            init: function(title, name) {\n"
-#~ "                // Add a new element "
-#~ "where the validity of the package "
-#~ "name can be displayed\n"
-#~ "                this.name_field = name;\n"
-#~ "                this.title_field = title;\n"
-#~ "                this.name_field.parent().append('<div "
-#~ "id=\"package_name_valid_msg\"></div>');\n"
-#~ "                this.title_field.blur(this.title_change_handler())\n"
-#~ "                this.title_field.keyup(this.title_change_handler())\n"
-#~ "                this.name_field.keyup(this.name_change_handler());\n"
-#~ "                this.name_field.blur(this.name_blur_handler());\n"
-#~ "                this.url = url;\n"
-#~ "            },\n"
-#~ "            title_change_handler: function() {\n"
-#~ "                var self = this;\n"
-#~ "                return function() {\n"
-#~ "                    if (!self.name_changed && "
-#~ "self.title_field.val().replace(/^\\s+|\\s+$/g, '')) {\n"
-#~ ""
-#~ "                        self.update(self.title_field.val(), "
-#~ "function(data) {self.name_field.val(data.name)});\n"
-#~ "                    }\n"
-#~ "                }\n"
-#~ "            },\n"
-#~ "            name_blur_handler: function() {\n"
-#~ "                var self = this;\n"
-#~ "                return function() {\n"
-#~ "                    // Reset if the name is emptied\n"
-#~ "                    if "
-#~ "(!self.name_field.val().replace(/^\\s+|\\s+$/g, '')){\n"
-#~ "                        self.name_changed = false;\n"
-#~ "                        $('#package_name_valid_msg').html('');\n"
-#~ "                    } else {\n"
-#~ "                        self.update(self.name_field.val(), "
-#~ "function(data) {\n"
-#~ "                            self.name_field.val(data.name)\n"
-#~ "                        });\n"
-#~ "                    }\n"
-#~ "                };\n"
-#~ "            },\n"
-#~ "            name_change_handler: function() {\n"
-#~ "                var self = this;\n"
-#~ "                return function() {\n"
-#~ "                    // Reset if the name is emptied\n"
-#~ "                    if "
-#~ "(!self.name_field.val().replace(/^\\s+|\\s+$/g, '')){\n"
-#~ "                        self.name_changed = false;\n"
-#~ "                        $('#package_name_valid_msg').html('');\n"
-#~ "                    } else {\n"
-#~ "                        self.name_changed = true;\n"
-#~ "                        self.update(self.name_field.val(), "
-#~ "function(data) {\n"
-#~ "                            if "
-#~ "(self.name_field.val().length >= data.name) {\n"
-#~ ""
-#~ "                                self.name_field.val(data.name);\n"
-#~ "                            }\n"
-#~ "                        });\n"
-#~ "                    }\n"
-#~ "                };\n"
-#~ "            },\n"
-#~ "            // Keep a variable where "
-#~ "we can store whether the name "
-#~ "field has been\n"
-#~ "            // directly modified by the"
-#~ " user or not. If it has, we "
-#~ "should no longer\n"
-#~ "            // fetch updates.\n"
-#~ "            name_changed: false,\n"
-#~ "            // Create a function for "
-#~ "fetching the value and updating the "
-#~ "result\n"
-#~ "            perform_update: function(value, on_success){\n"
-#~ "                var self = this;\n"
-#~ "                $.ajax({\n"
-#~ "                    url: self.url,\n"
-#~ "                    data: 'title=' + value,\n"
-#~ "                    dataType: 'jsonp',\n"
-#~ "                    type: 'get',\n"
-#~ "                    jsonpCallback: 'callback',\n"
-#~ "                    success: function (data) {\n"
-#~ "                        if (on_success) {\n"
-#~ "                            on_success(data);\n"
-#~ "                        }\n"
-#~ "                        var valid_msg = $('#package_name_valid_msg');\n"
-#~ "                        if (data.valid) {\n"
-#~ "                            valid_msg.html('<span style"
-#~ "=\"font-weight: bold; color: #0c0\">This "
-#~ "package name is available!</span>');\n"
-#~ "                        } else {\n"
-#~ "                            valid_msg.html('<span style"
-#~ "=\"font-weight: bold; color: #c00\">This "
-#~ "package name is already used, please "
-#~ "use a different name</span>');\n"
-#~ "                        }\n"
-#~ "                    }\n"
-#~ "                });\n"
-#~ "            },\n"
-#~ "            // We only want to "
-#~ "perform the update if there hasn't "
-#~ "been a change for say 200ms\n"
-#~ "            timer: null,\n"
-#~ "            update: function(value, on_success) {\n"
-#~ "                var self = this;\n"
-#~ "                if (this.timer) {\n"
-#~ "                    clearTimeout(this.timer)\n"
-#~ "                };\n"
-#~ "                this.timer = setTimeout(function () {\n"
-#~ "                    self.perform_update(value, on_success)\n"
-#~ "                }, 200);\n"
-#~ "            }\n"
-#~ "        }\n"
-#~ "        updater.init(title, $(name), url);\n"
-#~ "        return title;\n"
-#~ "    };\n"
-#~ "})( jQuery );\n"
-#~ "$(document).ready(function() {\n"
-#~ "    $('#title').ajaxCreateSlug('#name', "
-#~ "'/api/2/util/package/create_slug');\n"
-#~ "});\n"
-#~ "\n"
-#~ "$(document).ready(function () {\n"
-#~ "    if (!$('#preview').length) {\n"
-#~ "        $(\"#title\").focus();\n"
-#~ "    }\n"
-#~ "});\n"
-#~ "//]]>\n"
-#~ "</script>"
-#~ msgstr ""
-
-#~ msgid "- Data Packages"
-#~ msgstr "- Paquets de dades"
-
-#~ msgid "Groups are collections of packages maintained by users of"
-#~ msgstr "Els Grups són col·leccions de paquets de mantinguts per usuaris de"
-
-#~ msgid ". This package has not been added to any groups yet."
-#~ msgstr ". Aquest paquet encara no s'ha afegit a cap grup."
-
-#~ msgid "Related packages"
-#~ msgstr "Paquets relacionats"
-
-#~ msgid "This Package is Open"
-#~ msgstr "Aquest paquet és Obert"
-
-#~ msgid "This package satisfies the Open Knowledge Definition."
-#~ msgstr "Aquest paquet satisfà la Open Knowledge Definition."
-
-#~ msgid "This package is Not Open"
-#~ msgstr "Aquest paquet No és Obert"
-
-#~ msgid "This is an old revision of this package, as edited"
-#~ msgstr "Aquesta és una revisió antiga d'aquest paquet, editada"
-
-#~ msgid "This is the current revision of this package, as edited"
-#~ msgstr "Aquesta és la revisió actual d'aquest paquet, editada"
-
-#~ msgid "Source:"
-#~ msgstr "Font:"
-
-#~ msgid "Downloads & Resources"
-#~ msgstr "Descàrregues i Recursos"
-
-#~ msgid "Download"
-#~ msgstr "Descarregar"
-
-#~ msgid "(no description)"
-#~ msgstr "(sense descripció)"
-
-#~ msgid "This is a list of all known formats and datasets for"
-#~ msgstr ""
-#~ "Aquesta és una llista de tots els"
-#~ " formats i conjunts de dades coneguts"
-#~ " per a"
-
-#~ msgid ". If you know of another (CSV, SPARQL end-point etc.)"
-#~ msgstr ". Si en coneixeu un altre (CSV, punt d'accés SPARQL, etc.)"
-
-#~ msgid "None given for this package."
-#~ msgstr "Cap per a aquest paquet"
-
-#~ msgid "About this package"
-#~ msgstr "Quant a aquest paquet"
-
-#~ msgid "Something missing?"
-#~ msgstr "Falta alguna cosa?"
-
-#~ msgid "API / datapkg"
-#~ msgstr "API / datapkg"
-
-#~ msgid ""
-#~ "This information on this page (the package metadata) is also\n"
-#~ "                available programatically via this site's"
-#~ msgstr ""
-#~ "La informació d'aquesta pàgina (les metadades del paquet) també es\n"
-#~ "                troba disponible programàticament a través de la "
-
-#~ msgid "CKAN API"
-#~ msgstr "API de CKAN"
-
-#~ msgid "JSON"
-#~ msgstr "JSON"
-
-#~ msgid "RDF"
-#~ msgstr "RDF"
-
-#~ msgid "Turtle"
-#~ msgstr "Turtle"
-
-#~ msgid "N-Triples"
-#~ msgstr "N-Triples"
-
-#~ msgid ""
-#~ "The information on this page and "
-#~ "the downloads / resources are also "
-#~ "available using the"
-#~ msgstr ""
-#~ "La informació d'aquesta pàgina i les "
-#~ "descàrregues /recursos també es troben "
-#~ "disponibles usant la"
-
-#~ msgid "datapkg command line utility"
-#~ msgstr "utilitat de línia de commandes datapkg"
-
-#~ msgid "Information about this package:"
-#~ msgstr "Informació sobre aquest paquet:"
-
-#~ msgid "$ datapkg info ckan://"
-#~ msgstr "$ datapkg info ckan://"
-
-#~ msgid "Download:"
-#~ msgstr "Descàrrega:"
-
-#~ msgid "$ datapkg download ckan://"
-#~ msgstr "$ datapkg download ckan://"
-
-#~ msgid "State:"
-#~ msgstr "Estat:"
-
-#~ msgid ""
-#~ "[1:There was an error while searching.] \n"
-#~ "            Please try another search term."
-#~ msgstr ""
-#~ "[1:S'ha produït un error durant la cerca.] \n"
-#~ "            Si us plau, proveu un altre terme."
-
-#~ msgid "[1:%(item_count)s] packages found"
-#~ msgstr "[1:%(item_count)s] paquets trobats"
-
-#~ msgid "Would you like to [1:create a new package?]"
-#~ msgstr "Voleu [1:crear un paquet nou?]"
-
-#~ msgid "Filter by"
-#~ msgstr "Filtrar per"
-
-#~ msgid "packages with open licenses"
-#~ msgstr "paquets amb llicències obertes"
-
-#~ msgid "packages with downloads"
-#~ msgstr "paquets amb descàrregues"
-
-#~ msgid ""
-#~ "This page lists all changes to package database, with most recent\n"
-#~ "    changes first."
-#~ msgstr ""
-#~ "Aquesta pàgina enumera tots els canvis"
-#~ " efectuats al paquet, amb els més "
-#~ "recents\n"
-#~ "    al principi."
-
-#~ msgid "Purge - Revisions"
-#~ msgstr "Purgar - Revisions"
-
-#~ msgid "Revision Purge"
-#~ msgstr "Purgar una revisió"
-
-#~ msgid "There was an error:"
-#~ msgstr "S'ha produït un error:"
-
-#~ msgid "Purge successful."
-#~ msgstr "Purga satisfactòria"
-
-#~ msgid "revision"
-#~ msgstr "revisió"
-
-#~ msgid "Packages' Tags"
-#~ msgstr "Etiquetes dels paquets"
-
-#~ msgid "Package -"
-#~ msgstr "Paquet -"
-
-#~ msgid "There are %(package_count)s packages tagged with [1:%(tagname)s]:"
-#~ msgstr "Hi ha %(package_count)s paquets etiquetats amb [1:%(tagname)s]:"
-
-#~ msgid "(skip to preview)"
-#~ msgstr "(saltar a la previsualització)"
-
-#~ msgid "Email:"
-#~ msgstr "Correu electrònic:"
-
-#~ msgid "About user:"
-#~ msgstr "Quant a l'usuari:"
-
-#~ msgid "You can use [1:Markdown formatting] here."
-#~ msgstr "Podeu usar [1: format Markdown]."
-
-#~ msgid "Join CKAN to contribute packages under your own name."
-#~ msgstr "Uniu-vos a CKAN per contribuir paquets amb el vostre propi nom."
-
-#~ msgid ""
-#~ "OpenID is service that allows you "
-#~ "to log-on to many different "
-#~ "websites using a single identity.\n"
-#~ "    Find out [1:more about OpenID] "
-#~ "and [2:how to get an OpenID "
-#~ "enabled account]."
-#~ msgstr ""
-#~ "OpenID és un servei que permet "
-#~ "iniciar sessió en molts llocs diferents"
-#~ " usant una identitat única.\n"
-#~ "    Trobeu [1:més informació sobre "
-#~ "OpenID] i [2:com obtenir un compte "
-#~ "que ofereixi OpenID]."
-
-#~ msgid ""
-#~ "OpenID is service that allows you "
-#~ "to log-on to many different "
-#~ "websites\n"
-#~ "        using a single identity. Find out [1:more\n"
-#~ "        about OpenID] and [2:how to get an\n"
-#~ "        OpenID enabled account]. Probably "
-#~ "the simplest way is sign up with"
-#~ " a\n"
-#~ "        free OpenID provider such as [3:https://www.myopenid.com/]."
-#~ msgstr ""
-#~ "OpenID és un servei que permet "
-#~ "iniciar sessió en molts llocs diferents"
-#~ "\n"
-#~ "        usant una identitat única. Trobeu [1:més\n"
-#~ "        informació sobre OpenID] i [2:com obtenir un\n"
-#~ "        compte que ofereixi OpenID]. "
-#~ "Probablement, la forma més senzilla és"
-#~ " registrar-se\n"
-#~ "        amb un proveidor gratuït "
-#~ "d'OpenID com [3:https://www.myopenid.com/]."
-
-#~ msgid "Edit your profile"
-#~ msgstr "Editar el vostre perfil"
-
-#~ msgid "Number of packages administered:"
-#~ msgstr "Nombre de paquets administrats:"
-


Binary file ckan/i18n/hu/LC_MESSAGES/ckan.mo has changed


--- a/ckan/i18n/hu/LC_MESSAGES/ckan.po	Fri Sep 30 17:58:24 2011 +0100
+++ b/ckan/i18n/hu/LC_MESSAGES/ckan.po	Fri Sep 30 18:13:12 2011 +0100
@@ -3,6 +3,7 @@
 # This file is distributed under the same license as the ckan project.
 #
 # Translators:
+# <internet at davidread.org>, 2011.
 # Kalman Kemenczy <kkemenczy at gmail.com>, 2011.
 # okfn <sysadmin at okfn.org>, 2011.
 # stf <stefan.marsiske at gmail.com>, 2011.
@@ -11,7 +12,7 @@
 "Project-Id-Version: CKAN (Comprehensive Knowledge Archive Network)\n"
 "Report-Msgid-Bugs-To: http://www.ckan.org/\n"
 "POT-Creation-Date: 2011-09-30 17:45+0100\n"
-"PO-Revision-Date: 2011-09-30 16:47+0000\n"
+"PO-Revision-Date: 2011-09-30 17:11+0000\n"
 "Last-Translator: dread <internet at davidread.org>\n"
 "Language-Team: Hungarian "
 "(http://www.transifex.net/projects/p/ckan/team/hu/)\n"
@@ -209,7 +210,7 @@
 
 #: ckan/controllers/home.py:89
 msgid "Language has been set to: English"
-msgstr ""
+msgstr "Nyelv lett állítva: Magyar"
 
 #: ckan/controllers/home.py:93
 msgid "No language given!"

Repository URL: https://bitbucket.org/okfn/ckan/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.




More information about the ckan-changes mailing list