]> git.parisson.com Git - telemeta.git/commitdiff
Merge branch 'dev' into lam
authoryomguy <yomguy@parisson.com>
Tue, 8 Jan 2013 08:27:47 +0000 (09:27 +0100)
committeryomguy <yomguy@parisson.com>
Tue, 8 Jan 2013 08:27:47 +0000 (09:27 +0100)
Conflicts:
telemeta/locale/de/LC_MESSAGES/django.mo
telemeta/locale/de/LC_MESSAGES/django.po
telemeta/locale/de/LC_MESSAGES/djangojs.mo
telemeta/locale/de/LC_MESSAGES/djangojs.po
telemeta/locale/fr/LC_MESSAGES/django.mo
telemeta/locale/fr/LC_MESSAGES/django.po
telemeta/locale/fr/LC_MESSAGES/djangojs.mo
telemeta/locale/fr/LC_MESSAGES/djangojs.po

1  2 
telemeta/locale/de/LC_MESSAGES/django.mo
telemeta/locale/de/LC_MESSAGES/django.po
telemeta/locale/de/LC_MESSAGES/djangojs.mo
telemeta/locale/de/LC_MESSAGES/djangojs.po
telemeta/locale/fr/LC_MESSAGES/django.mo
telemeta/locale/fr/LC_MESSAGES/django.po
telemeta/locale/fr/LC_MESSAGES/djangojs.mo
telemeta/locale/fr/LC_MESSAGES/djangojs.po
telemeta/models/media.py
telemeta/util/xmltodict2.py

index 3e1dd4ec99668e552af18a9e202d16172d5ae2a6,d12a2d125e441cd2eb0fecbca1cbfc14d3e97901..0aafeb52d1d881bd93a8dec303c53de48c266e36
Binary files differ
index c0024d184ed2359eeaf7b020839d5f4a80b4695a,d79a67976657fc3460037821363c3f5262fb6a44..7ca6697bdd155f005964a46649e5448263d734e0
@@@ -8,11 -7,11 +7,11 @@@ msgid "
  msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2012-12-18 10:57+0100\n"
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 -"POT-Creation-Date: 2013-01-01 10:34+0100\n"
++"POT-Creation-Date: 2013-01-08 09:27+0100\n"
+ "PO-Revision-Date: 2012-12-22 21:24+0100\n"
+ "Last-Translator: Patrik Tschudin <patsch@gmail.com>\n"
  "Language-Team: LANGUAGE <LL@li.org>\n"
- "Language: \n"
+ "Language: de\n"
  "MIME-Version: 1.0\n"
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
@@@ -24,74 -24,74 +24,74 @@@ msgstr "Dauer
  
  #: models/core.py:150
  msgid "Enter a valid duration in HH:MM[:ss] format."
- msgstr ""
+ msgstr "Gültige Dauer eingeben im Format HH:MM[:ss]"
  
--#: models/enum.py:41 models/enum.py:139 models/media.py:513
++#: models/enum.py:41 models/enum.py:139 models/media.py:546
  #: models/system.py:103
  msgid "value"
- msgstr ""
+ msgstr "Wert"
  
--#: models/enum.py:57 models/media.py:228
++#: models/enum.py:57 models/media.py:242
  msgid "archive format"
- msgstr ""
+ msgstr "Archivformat"
  
--#: models/enum.py:64 models/media.py:210
++#: models/enum.py:64 models/media.py:224
  msgid "secondary edition"
- msgstr ""
+ msgstr "Sekundäredition"
  
--#: models/enum.py:71 models/media.py:204
++#: models/enum.py:71 models/media.py:218
  msgid "mode of acquisition"
- msgstr ""
+ msgstr "Art und Weise des Erhalts"
  
--#: models/enum.py:78 models/media.py:207
++#: models/enum.py:78 models/media.py:221
  msgid "record author"
- msgstr ""
+ msgstr "AutorIn des Eintrags"
  
--#: models/enum.py:85 models/media.py:214
++#: models/enum.py:85 models/media.py:228
  msgid "record writer"
- msgstr ""
+ msgstr "ErfasserIn des Eintrags"
  
--#: models/enum.py:92 models/media.py:200
++#: models/enum.py:92 models/media.py:214
  msgid "legal rights"
- msgstr ""
+ msgstr "Urheberrechte"
  
--#: models/enum.py:99 models/media.py:179
++#: models/enum.py:99 models/media.py:193
  msgid "recording context"
- msgstr ""
+ msgstr "Aufnahmekontext"
  
  #: models/enum.py:106
  msgid "A/D conversion"
- msgstr ""
+ msgstr "A/D Umwandlung"
  
--#: models/enum.py:113 models/media.py:344
++#: models/enum.py:113 models/media.py:358
  msgid "vernacular style"
- msgstr ""
+ msgstr "umgangssprachliche Bezeichnung"
  
--#: models/enum.py:120 models/media.py:346
++#: models/enum.py:120 models/media.py:360
  msgid "generic style"
- msgstr ""
+ msgstr "allgemeine Bezeichnung"
  
--#: models/enum.py:127 models/media.py:484
++#: models/enum.py:127 models/media.py:517
  msgid "keyword"
- msgstr ""
+ msgstr "Schlüsselwort"
  
--#: models/enum.py:134 models/media.py:190
++#: models/enum.py:134 models/media.py:204
  msgid "publisher / status"
- msgstr ""
+ msgstr "HerausgeberIn / Status"
  
  #: models/enum.py:138
  msgid "publisher"
- msgstr ""
+ msgstr "HerausgeberIn"
  
--#: models/enum.py:153 models/enum.py:157 models/media.py:334
++#: models/enum.py:153 models/enum.py:157 models/media.py:348
  msgid "population / social group"
- msgstr ""
+ msgstr "Bevölkerung / soziale Gruppe"
  
  #: models/enum.py:158 models/instrument.py:43 models/instrument.py:53
  #: models/language.py:54 models/location.py:51 models/location.py:158
--#: models/media.py:512
++#: models/media.py:545
  msgid "name"
- msgstr ""
+ msgstr "Name"
  
  #: models/enum.py:172 models/format.py:77
  msgid "tape wheel diameter (cm)"
@@@ -115,33 -115,33 +115,34 @@@ msgstr "Bandmarke
  
  #: models/enum.py:207 models/format.py:71
  msgid "number of channels"
- msgstr ""
+ msgstr "Anzahl Kanäle"
  
--#: models/enum.py:214 models/media.py:351
++#: models/enum.py:214 models/media.py:365
  msgid "organization"
- msgstr ""
+ msgstr "Organisation"
  
--#: models/enum.py:221 models/media.py:355
++#: models/enum.py:221 models/media.py:369
  msgid "rights"
- msgstr ""
+ msgstr "Rechte"
  
--#: models/enum.py:228 models/media.py:325
++#: models/enum.py:228 models/media.py:339
  msgid "topic"
- msgstr ""
+ msgstr "Thema"
  
--#: models/format.py:58 models/media.py:414 models/media.py:473
--#: models/media.py:483 models/media.py:494 models/media.py:510
--#: models/media.py:531 models/media.py:577 models/media.py:598
++#: models/format.py:58 models/media.py:427 models/media.py:486
++#: models/media.py:516 models/media.py:527 models/media.py:543
++#: models/media.py:564 models/media.py:610 models/media.py:635
++#: models/media.py:669
  msgid "item"
- msgstr ""
+ msgstr "Element"
  
  #: models/format.py:61
  msgid "physical format"
- msgstr ""
+ msgstr "physisches Format"
  
--#: models/format.py:62 models/media.py:359
++#: models/format.py:62 models/media.py:373
  msgid "original code"
- msgstr ""
+ msgstr "ursprünglicher Code"
  
  #: models/format.py:63
  msgid "original number"
@@@ -225,11 -225,11 +226,11 @@@ msgstr "Geltungsbereich
  
  #: models/language.py:53 models/location.py:52
  msgid "type"
- msgstr ""
+ msgstr "Typus"
  
--#: models/language.py:55 models/media.py:212
++#: models/language.py:55 models/media.py:226
  msgid "comment"
- msgstr ""
+ msgstr "Kommentar"
  
  #: models/language.py:63
  msgid "languages"
@@@ -257,12 -257,12 +258,12 @@@ msgstr "aktueller Ort
  
  #: models/location.py:58 models/location.py:172 models/location.py:188
  msgid "authoritative"
- msgstr ""
+ msgstr "massgebend"
  
  #: models/location.py:112 models/location.py:170 models/location.py:185
--#: models/media.py:330
++#: models/media.py:344
  msgid "location"
- msgstr ""
+ msgstr "Ort"
  
  #: models/location.py:113
  msgid "locations"
@@@ -282,397 -282,397 +283,418 @@@ msgstr "früherer Ort
  
  #: models/location.py:194
  msgid "location relations"
- msgstr ""
+ msgstr "Ortsbeziehungen"
  
--#: models/media.py:64
++#: models/media.py:65
  msgid "none"
- msgstr ""
+ msgstr "nichts"
  
--#: models/media.py:64
++#: models/media.py:65
  msgid "metadata"
- msgstr ""
+ msgstr "Metadaten"
  
--#: models/media.py:65
++#: models/media.py:66
  msgid "partial"
- msgstr ""
+ msgstr "unvollständig"
  
--#: models/media.py:65
++#: models/media.py:66
  msgid "full"
 -#: models/media.py:75
+ msgstr "vollständig"
- #: models/media.py:75
- msgid "Metadata only"
++#: models/media.py:68
++msgid "broken"
 +msgstr ""
 +
- #: models/media.py:77
- msgid "Sound and metadata"
++#: models/media.py:68
++msgid "pending"
 +msgstr ""
 +
- #: models/media.py:79
- msgid "Private data"
++#: models/media.py:68
++msgid "processing"
 +msgstr ""
 +
- #: models/media.py:80 models/media.py:100 models/media.py:197
- #: models/media.py:352
- msgid "public access"
++#: models/media.py:69
++msgid "done"
 +msgstr ""
 +
- #: models/media.py:96 models/media.py:126 models/media.py:175
- #: models/media.py:317 models/media.py:532 models/media.py:548
- #: models/media.py:580
++#: models/media.py:69
++msgid "ready"
 +msgstr ""
 +
 -#: models/media.py:77
++#: models/media.py:86
+ msgid "Metadata only"
+ msgstr "nur Metadaten"
 -#: models/media.py:79
++#: models/media.py:88
+ msgid "Sound and metadata"
+ msgstr "Ton und Metadaten"
 -#: models/media.py:80 models/media.py:100 models/media.py:197
 -#: models/media.py:352
++#: models/media.py:90
+ msgid "Private data"
+ msgstr "private Daten"
 -#: models/media.py:96 models/media.py:126 models/media.py:175
 -#: models/media.py:317 models/media.py:532 models/media.py:548
 -#: models/media.py:580
++#: models/media.py:91 models/media.py:111 models/media.py:211
++#: models/media.py:366
+ msgid "public access"
+ msgstr "öffentlich zugänglich"
++#: models/media.py:107 models/media.py:137 models/media.py:189
++#: models/media.py:331 models/media.py:565 models/media.py:581
++#: models/media.py:613
  msgid "title"
- msgstr ""
+ msgstr "Titel"
  
--#: models/media.py:97 models/media.py:128 models/media.py:549
--#: models/media.py:582
++#: models/media.py:108 models/media.py:139 models/media.py:582
++#: models/media.py:615
  msgid "description"
- msgstr ""
+ msgstr "Beschreibung"
  
--#: models/media.py:98 models/media.py:222 models/media.py:358
++#: models/media.py:109 models/media.py:236 models/media.py:372
  msgid "code"
- msgstr ""
+ msgstr "Code"
  
--#: models/media.py:99 models/media.py:174
++#: models/media.py:110 models/media.py:188
  msgid "reference"
- msgstr ""
+ msgstr "Referenz"
  
--#: models/media.py:127 models/media.py:581 models/media.py:600
--#: models/system.py:115
++#: models/media.py:138 models/media.py:614 models/media.py:637
++#: models/media.py:671 models/system.py:115
  msgid "date"
- msgstr ""
+ msgstr "Datum"
  
--#: models/media.py:129 models/media.py:599
++#: models/media.py:140 models/media.py:636 models/media.py:670
  msgid "mime_type"
- msgstr ""
+ msgstr "mime_type"
  
--#: models/media.py:130
++#: models/media.py:141
  msgid "url"
- msgstr ""
+ msgstr "url"
  
--#: models/media.py:131
++#: models/media.py:142
  msgid "credits"
- msgstr ""
+ msgstr "Mithilfe"
  
--#: models/media.py:132 models/media.py:375
++#: models/media.py:143 models/media.py:389 models/media.py:639
  msgid "file"
- msgstr ""
+ msgstr "Datei"
  
--#: models/media.py:176 models/media.py:318
++#: models/media.py:190 models/media.py:332
  msgid "original title / translation"
- msgstr ""
+ msgstr "Oritinaltitel / Übersetzung"
  
--#: models/media.py:177
++#: models/media.py:191
  msgid "depositor / contributor"
- msgstr ""
+ msgstr "HinterlegerIn / Zulieferde(r)"
  
--#: models/media.py:180 models/media.py:682
++#: models/media.py:194 models/media.py:753
  msgid "recording year (from)"
- msgstr ""
+ msgstr "Aufnahmejahr (ab)"
  
--#: models/media.py:181 models/media.py:683
++#: models/media.py:195 models/media.py:754
  msgid "recording year (until)"
- msgstr ""
+ msgstr "Aufnahmejahr (bis)"
  
--#: models/media.py:182
++#: models/media.py:196
  msgid "year published"
- msgstr ""
+ msgstr "Publikationsjahr"
  
--#: models/media.py:188 models/media.py:361
++#: models/media.py:202 models/media.py:375
  msgid "recordist"
- msgstr ""
+ msgstr "TonmeisterIn"
  
--#: models/media.py:192
++#: models/media.py:206
  msgid "publisher collection"
- msgstr ""
+ msgstr "Sammlung von HerausgeberIn"
  
--#: models/media.py:193
++#: models/media.py:207
  msgid "publisher serial number"
- msgstr ""
+ msgstr "Seriennummer von HerausgeberIn"
  
--#: models/media.py:194
++#: models/media.py:208
  msgid "author of published notice"
- msgstr ""
+ msgstr "AutorIn des publizierten Kommentars"
  
--#: models/media.py:195
++#: models/media.py:209
  msgid "bibliographic references"
- msgstr ""
+ msgstr "bibliographische Referenz"
  
--#: models/media.py:196
++#: models/media.py:210
  msgid "document type"
- msgstr ""
+ msgstr "Dokumententypus"
  
--#: models/media.py:205
++#: models/media.py:219
  msgid "CNRS depositor"
- msgstr ""
+ msgstr "CNRS HinterlegerIn"
  
--#: models/media.py:208
++#: models/media.py:222
  msgid "related documentation"
- msgstr ""
+ msgstr "verwandte Dokumentation"
  
--#: models/media.py:211
++#: models/media.py:225
  msgid "copies"
- msgstr ""
+ msgstr "Kopien"
  
--#: models/media.py:215
++#: models/media.py:229
  msgid "archiver notes"
- msgstr ""
+ msgstr "Kommentar von ArchivarIn"
  
--#: models/media.py:216
++#: models/media.py:230
  msgid "items finished"
- msgstr ""
+ msgstr "abgeschlossene Elemente"
  
--#: models/media.py:217
++#: models/media.py:231
  msgid "recordist identical to depositor"
- msgstr ""
+ msgstr "TonmeisterIn ist identisch mit HinterlegerIn"
  
--#: models/media.py:218
++#: models/media.py:232
  msgid "published"
- msgstr ""
+ msgstr "publiziert"
  
--#: models/media.py:219
++#: models/media.py:233
  msgid "conservation site"
- msgstr ""
+ msgstr "Konservierungsort"
  
--#: models/media.py:224
++#: models/media.py:238
  msgid "old code"
- msgstr ""
+ msgstr "alter Code"
  
--#: models/media.py:225 models/media.py:379
++#: models/media.py:239 models/media.py:393
  msgid "approximative duration"
- msgstr ""
+ msgstr "ungefähre Dauer"
  
--#: models/media.py:226
++#: models/media.py:240
  msgid "number of components (medium / piece)"
- msgstr ""
+ msgstr "Anzahl Komponenten (Medium / Teil)"
  
--#: models/media.py:230
++#: models/media.py:244
  msgid "digitization"
- msgstr ""
+ msgstr "Digitalisierung"
  
--#: models/media.py:231
++#: models/media.py:245 models/media.py:638
  msgid "status"
- msgstr ""
+ msgstr "Status"
  
--#: models/media.py:232
++#: models/media.py:246
  msgid "a_informer_07_03"
- msgstr ""
+ msgstr "a_informer_07_03"
  
--#: models/media.py:267
++#: models/media.py:281
  msgid "states / nations"
- msgstr ""
+ msgstr "Staaten / Nationen"
  
--#: models/media.py:281
++#: models/media.py:295
  msgid "populations / social groups"
- msgstr ""
+ msgstr "Bevölkerungen / soziale Gruppen"
  
--#: models/media.py:289 models/media.py:440
++#: models/media.py:303 models/media.py:453
  msgid "computed duration"
- msgstr ""
+ msgstr "berechnete Dauer"
  
--#: models/media.py:297 models/media.py:303 models/media.py:320
++#: models/media.py:311 models/media.py:317 models/media.py:334
  msgid "collection"
- msgstr ""
+ msgstr "Sammlung"
  
--#: models/media.py:307 models/media.py:308
++#: models/media.py:321 models/media.py:322
  msgid "collection related media"
- msgstr ""
+ msgstr "zur Sammlung gehörende Medien"
  
--#: models/media.py:321
++#: models/media.py:335
  msgid "recording date (from)"
- msgstr ""
+ msgstr "Aufnahmedatum (von)"
  
--#: models/media.py:322
++#: models/media.py:336
  msgid "recording date (until)"
- msgstr ""
+ msgstr "Aufnahmedatum (bis)"
  
--#: models/media.py:324
++#: models/media.py:338
  msgid "scientist"
- msgstr ""
+ msgstr "WissenschaftlerIn"
  
--#: models/media.py:326
++#: models/media.py:340
  msgid "summary"
- msgstr ""
+ msgstr "Zusammenfassung"
  
--#: models/media.py:327
++#: models/media.py:341
  msgid "remarks"
- msgstr ""
+ msgstr "Bemerkungen"
  
--#: models/media.py:331
++#: models/media.py:345
  msgid "location details"
- msgstr ""
+ msgstr "Einzelheiten zum Ort"
  
--#: models/media.py:332
++#: models/media.py:346
  msgid "cultural area"
- msgstr ""
+ msgstr "Kulturraum"
  
--#: models/media.py:335
++#: models/media.py:349
  msgid "language"
- msgstr ""
+ msgstr "Sprache"
  
--#: models/media.py:337
++#: models/media.py:351
  msgid "ISO language"
- msgstr ""
+ msgstr "ISO Sprache"
  
--#: models/media.py:339
++#: models/media.py:353
  msgid "comments / ethnographic context"
- msgstr ""
+ msgstr "Kommentare / ethnographischer Kontext"
  
--#: models/media.py:340
++#: models/media.py:354
  msgid "moda_execut"
- msgstr ""
+ msgstr "moda_execut"
  
--#: models/media.py:347
++#: models/media.py:361
  msgid "author / compositor"
- msgstr ""
+ msgstr "AutorIn / KomponistIn"
  
--#: models/media.py:348
++#: models/media.py:362
  msgid "contributor"
- msgstr ""
+ msgstr "Mitwirkende(r)"
  
--#: models/media.py:354
++#: models/media.py:368
  msgid "depositor"
- msgstr ""
+ msgstr "HinterlegerIn"
  
--#: models/media.py:360
++#: models/media.py:374
  msgid "item number"
- msgstr ""
+ msgstr "Nummer des Elements"
  
--#: models/media.py:362
++#: models/media.py:376
  msgid "digitalist"
- msgstr ""
+ msgstr "DigitalisiererIn"
  
--#: models/media.py:363
++#: models/media.py:377
  msgid "collector"
- msgstr ""
+ msgstr "SammlerIn"
  
--#: models/media.py:364
++#: models/media.py:378
  msgid "collector selection"
- msgstr ""
+ msgstr "Auswahl von SammlerIn"
  
--#: models/media.py:365
++#: models/media.py:379
  msgid "collector as in collection"
- msgstr ""
+ msgstr "SammlerIn gleich wie bei Sammlung"
  
--#: models/media.py:366
++#: models/media.py:380
  msgid "digitization date"
- msgstr ""
+ msgstr "Datum der Digitalisierung"
  
--#: models/media.py:367
++#: models/media.py:381
  msgid "publishing date"
- msgstr ""
+ msgstr "Datum der Publikation"
  
--#: models/media.py:368
++#: models/media.py:382
  msgid "creator reference"
- msgstr ""
+ msgstr "Referenz von ErzeugerIn"
  
--#: models/media.py:369
++#: models/media.py:383
  msgid "published references"
- msgstr ""
+ msgstr "publizierte Referenzen"
  
--#: models/media.py:371
++#: models/media.py:385
  msgid "copy of"
- msgstr ""
+ msgstr "Kopie von"
  
--#: models/media.py:372
++#: models/media.py:386
  msgid "mime type"
- msgstr "type mime"
 -msgstr "mime type"
++msgstr "mots clés"
  
--#: models/media.py:386 templates/telemeta/mediaitem_edit.html:47
++#: models/media.py:400 templates/telemeta/mediaitem_edit.html:47
  msgid "keywords"
- msgstr "mots clés"
+ msgstr "Schlüsselwörter"
  
--#: models/media.py:467
++#: models/media.py:480
  msgid "instruments"
- msgstr ""
+ msgstr "Instrumente"
  
--#: models/media.py:477 models/media.py:478
++#: models/media.py:510 models/media.py:511
  msgid "item related media"
- msgstr ""
+ msgstr "zum Element gehörende Medien"
  
--#: models/media.py:496
++#: models/media.py:529
  msgid "composition"
- msgstr ""
+ msgstr "Komposition"
  
--#: models/media.py:498
++#: models/media.py:531
  msgid "vernacular name"
- msgstr ""
+ msgstr "umgangssprachlicher Name"
  
--#: models/media.py:499
++#: models/media.py:532
  msgid "number"
- msgstr ""
+ msgstr "Nummer"
  
--#: models/media.py:500
++#: models/media.py:533
  msgid "interprets"
- msgstr ""
+ msgstr "InterpretInnen"
  
--#: models/media.py:511
++#: models/media.py:544
  msgid "id"
- msgstr ""
+ msgstr "id"
  
--#: models/media.py:514
++#: models/media.py:547
  msgid "unit"
- msgstr ""
+ msgstr "Einheit"
  
--#: models/media.py:533
++#: models/media.py:566
  msgid "start"
- msgstr ""
+ msgstr "Start"
  
--#: models/media.py:534
++#: models/media.py:567
  msgid "end"
- msgstr ""
+ msgstr "Ende"
  
--#: models/media.py:538
++#: models/media.py:571
  msgid "item part"
- msgstr ""
+ msgstr "Elementteil"
  
--#: models/media.py:546 models/media.py:563 models/media.py:578
++#: models/media.py:579 models/media.py:596 models/media.py:611
  msgid "public_id"
- msgstr ""
+ msgstr "public_id"
  
--#: models/media.py:564
++#: models/media.py:597
  msgid "playlist"
- msgstr ""
+ msgstr "Wiedergabeliste"
  
--#: models/media.py:565
++#: models/media.py:598
  msgid "resource_type"
- msgstr ""
+ msgstr "resource_type"
  
--#: models/media.py:566
++#: models/media.py:599
  msgid "resource_id"
- msgstr ""
+ msgstr "resource_id"
  
--#: models/media.py:579 models/system.py:55
--msgid "time"
- msgstr ""
++#: models/media.py:612
++#, fuzzy
++msgid "time (s)"
+ msgstr "Zeit"
  
--#: models/media.py:583
++#: models/media.py:616
  msgid "author"
- msgstr ""
+ msgstr "AutorIn"
  
--#: models/media.py:601
++#: models/media.py:672
  msgid "transcoded"
- msgstr ""
+ msgstr "umgewandelt"
  
--#: models/media.py:681
++#: models/media.py:752
  msgid "collections"
- msgstr ""
+ msgstr "Sammlungen"
  
--#: models/media.py:693 models/media.py:694 models/media.py:704
--#: models/media.py:721
++#: models/media.py:764 models/media.py:765 models/media.py:775
++#: models/media.py:792
  msgid "corpus"
- msgstr ""
+ msgstr "Korpus"
  
--#: models/media.py:714 models/media.py:715 models/media.py:732
++#: models/media.py:785 models/media.py:786 models/media.py:803
  msgid "fonds"
- msgstr ""
+ msgstr "Fonds"
  
--#: models/media.py:725 models/media.py:726
++#: models/media.py:796 models/media.py:797
  msgid "corpus related media"
- msgstr ""
+ msgstr "zum Korpus gehörende Medien"
  
--#: models/media.py:736 models/media.py:737
++#: models/media.py:807 models/media.py:808
  msgid "fonds related media"
- msgstr ""
+ msgstr "zum Fonds gehörende Medien"
  
  #: models/system.py:52
  msgid "element type"
@@@ -684,11 -684,11 +706,15 @@@ msgstr "Elementidentifikator
  
  #: models/system.py:54
  msgid "modification type"
- msgstr ""
+ msgstr "Veränderungstyp"
++#: models/system.py:55
++msgid "time"
++msgstr "Zeit"
 +
  #: models/system.py:56
  msgid "user"
- msgstr ""
+ msgstr "Benutzer"
  
  #: models/system.py:85 templates/telemeta/profile_detail.html:43
  msgid "Institution"
index c67975d9ce499f8cea364bc32515d7799b29429e,6f56bd94ee5df819b6d977b46a12c9473a4ed460..fc07b11cc047357231f1a0fd7f9bfcbc966a5a62
Binary files differ
index e4df19f36160da042b93af9c25a0987e796b0579,c330eb40715fe3d0faf5506a5844713764a5a90a..67fa019622ba000ffe5b59fef78175f7db288606
@@@ -8,9 -7,9 +7,9 @@@ msgid "
  msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2012-12-18 10:57+0100\n"
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 -"POT-Creation-Date: 2013-01-01 10:34+0100\n"
++"POT-Creation-Date: 2013-01-08 09:27+0100\n"
+ "PO-Revision-Date: 2012-12-19 08:20+0100\n"
+ "Last-Translator: Patrik Tschudin <patsch@gmail.com>\n"
  "Language-Team: LANGUAGE <LL@li.org>\n"
  "Language: \n"
  "MIME-Version: 1.0\n"
index 1485853a929addb4be2c167b192bc840acb3dd80,a5c30d8282745371300d01cbc69b53f74653cd1b..055afe50a146275f092419e9de3254cbdeedaf29
Binary files differ
index faa90f466c6a9a324fde4ce2021c81a339f33ed0,7dca59dbcc0c678c4b2050604f422aabdb3ed110..70504ada6d2e94d44e4cefa3d5987268446c6991
@@@ -10,7 -10,7 +10,7 @@@ msgid "
  msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2012-12-18 10:57+0100\n"
 -"POT-Creation-Date: 2013-01-01 10:34+0100\n"
++"POT-Creation-Date: 2013-01-08 09:27+0100\n"
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  "Last-Translator: Guillaume Pellerin <yomguy@parisson.com>\n"
  "Language-Team: LANGUAGE <dev@parisson.com>\n"
@@@ -27,36 -27,36 +27,36 @@@ msgstr "Durée
  msgid "Enter a valid duration in HH:MM[:ss] format."
  msgstr "Entrez une durée valide au format HH:MM[:ss]"
  
--#: models/enum.py:41 models/enum.py:139 models/media.py:513
++#: models/enum.py:41 models/enum.py:139 models/media.py:546
  #: models/system.py:103
  msgid "value"
  msgstr "valeur"
  
--#: models/enum.py:57 models/media.py:228
++#: models/enum.py:57 models/media.py:242
  msgid "archive format"
  msgstr "format du support"
  
--#: models/enum.py:64 models/media.py:210
++#: models/enum.py:64 models/media.py:224
  msgid "secondary edition"
  msgstr "réédition"
  
--#: models/enum.py:71 models/media.py:204
++#: models/enum.py:71 models/media.py:218
  msgid "mode of acquisition"
  msgstr "mode d'acquisition"
  
--#: models/enum.py:78 models/media.py:207
++#: models/enum.py:78 models/media.py:221
  msgid "record author"
  msgstr "rédacteur fiche"
  
--#: models/enum.py:85 models/media.py:214
++#: models/enum.py:85 models/media.py:228
  msgid "record writer"
  msgstr "saisie fiche"
  
--#: models/enum.py:92 models/media.py:200
++#: models/enum.py:92 models/media.py:214
  msgid "legal rights"
  msgstr "droit d'utilisation"
  
--#: models/enum.py:99 models/media.py:179
++#: models/enum.py:99 models/media.py:193
  msgid "recording context"
  msgstr "contexte d'enregistrement"
  
  msgid "A/D conversion"
  msgstr "Conversion A/N"
  
--#: models/enum.py:113 models/media.py:344
++#: models/enum.py:113 models/media.py:358
  msgid "vernacular style"
  msgstr "style vernaculaire"
  
--#: models/enum.py:120 models/media.py:346
++#: models/enum.py:120 models/media.py:360
  msgid "generic style"
  msgstr "style générique"
  
--#: models/enum.py:127 models/media.py:484
++#: models/enum.py:127 models/media.py:517
  msgid "keyword"
  msgstr "Mot-clé"
  
--#: models/enum.py:134 models/media.py:190
++#: models/enum.py:134 models/media.py:204
  msgid "publisher / status"
  msgstr "éditeur / statut"
  
  msgid "publisher"
  msgstr "éditeur"
  
--#: models/enum.py:153 models/enum.py:157 models/media.py:334
++#: models/enum.py:153 models/enum.py:157 models/media.py:348
  msgid "population / social group"
  msgstr "population / groupe social"
  
  #: models/enum.py:158 models/instrument.py:43 models/instrument.py:53
  #: models/language.py:54 models/location.py:51 models/location.py:158
--#: models/media.py:512
++#: models/media.py:545
  msgid "name"
  msgstr "nom"
  
@@@ -118,21 -118,21 +118,22 @@@ msgstr "marque de bande
  msgid "number of channels"
  msgstr "Nombre de pistes"
  
--#: models/enum.py:214 models/media.py:351
++#: models/enum.py:214 models/media.py:365
  msgid "organization"
  msgstr "organisation"
  
--#: models/enum.py:221 models/media.py:355
++#: models/enum.py:221 models/media.py:369
  msgid "rights"
  msgstr "droits"
  
--#: models/enum.py:228 models/media.py:325
++#: models/enum.py:228 models/media.py:339
  msgid "topic"
  msgstr "discipline"
  
--#: models/format.py:58 models/media.py:414 models/media.py:473
--#: models/media.py:483 models/media.py:494 models/media.py:510
--#: models/media.py:531 models/media.py:577 models/media.py:598
++#: models/format.py:58 models/media.py:427 models/media.py:486
++#: models/media.py:516 models/media.py:527 models/media.py:543
++#: models/media.py:564 models/media.py:610 models/media.py:635
++#: models/media.py:669
  msgid "item"
  msgstr "item"
  
  msgid "physical format"
  msgstr "nature du support original"
  
--#: models/format.py:62 models/media.py:359
++#: models/format.py:62 models/media.py:373
  msgid "original code"
  msgstr "cote originale"
  
@@@ -228,7 -228,7 +229,7 @@@ msgstr "cadre
  msgid "type"
  msgstr "type"
  
--#: models/language.py:55 models/media.py:212
++#: models/language.py:55 models/media.py:226
  msgid "comment"
  msgstr "commentaire"
  
@@@ -261,7 -261,7 +262,7 @@@ msgid "authoritative
  msgstr "officiel"
  
  #: models/location.py:112 models/location.py:170 models/location.py:185
--#: models/media.py:330
++#: models/media.py:344
  msgid "location"
  msgstr "lieu"
  
@@@ -285,393 -285,394 +286,414 @@@ msgstr "lieu ancêtre
  msgid "location relations"
  msgstr "lieux relations"
  
--#: models/media.py:64
++#: models/media.py:65
  msgid "none"
  msgstr "aucun"
  
--#: models/media.py:64
++#: models/media.py:65
  msgid "metadata"
  msgstr "métadonnées"
  
--#: models/media.py:65
++#: models/media.py:66
  msgid "partial"
  msgstr "partiel"
  
--#: models/media.py:65
++#: models/media.py:66
  msgid "full"
  msgstr "complet"
  
--#: models/media.py:75
++#: models/media.py:68
++msgid "broken"
++msgstr ""
++
++#: models/media.py:68
++msgid "pending"
++msgstr ""
++
++#: models/media.py:68
++msgid "processing"
++msgstr ""
++
++#: models/media.py:69
++msgid "done"
++msgstr ""
++
++#: models/media.py:69
++msgid "ready"
++msgstr ""
++
++#: models/media.py:86
  msgid "Metadata only"
  msgstr "Métadonnées uniquement"
  
--#: models/media.py:77
++#: models/media.py:88
  msgid "Sound and metadata"
  msgstr "Son et métadonnées"
  
--#: models/media.py:79
++#: models/media.py:90
  msgid "Private data"
  msgstr "Données privées"
  
--#: models/media.py:80 models/media.py:100 models/media.py:197
--#: models/media.py:352
++#: models/media.py:91 models/media.py:111 models/media.py:211
++#: models/media.py:366
  msgid "public access"
  msgstr "accès public"
  
--#: models/media.py:96 models/media.py:126 models/media.py:175
--#: models/media.py:317 models/media.py:532 models/media.py:548
--#: models/media.py:580
++#: models/media.py:107 models/media.py:137 models/media.py:189
++#: models/media.py:331 models/media.py:565 models/media.py:581
++#: models/media.py:613
  msgid "title"
  msgstr "titre"
  
--#: models/media.py:97 models/media.py:128 models/media.py:549
--#: models/media.py:582
++#: models/media.py:108 models/media.py:139 models/media.py:582
++#: models/media.py:615
  msgid "description"
  msgstr "description"
  
--#: models/media.py:98 models/media.py:222 models/media.py:358
++#: models/media.py:109 models/media.py:236 models/media.py:372
  msgid "code"
  msgstr "cote"
  
--#: models/media.py:99 models/media.py:174
++#: models/media.py:110 models/media.py:188
  msgid "reference"
  msgstr "référence"
  
--#: models/media.py:127 models/media.py:581 models/media.py:600
--#: models/system.py:115
++#: models/media.py:138 models/media.py:614 models/media.py:637
++#: models/media.py:671 models/system.py:115
  msgid "date"
  msgstr ""
  
--#: models/media.py:129 models/media.py:599
++#: models/media.py:140 models/media.py:636 models/media.py:670
  msgid "mime_type"
  msgstr "type mime"
  
--#: models/media.py:130
++#: models/media.py:141
  msgid "url"
  msgstr ""
  
--#: models/media.py:131
++#: models/media.py:142
  msgid "credits"
  msgstr "crédits"
  
--#: models/media.py:132 models/media.py:375
++#: models/media.py:143 models/media.py:389 models/media.py:639
  msgid "file"
  msgstr "fichier"
  
--#: models/media.py:176 models/media.py:318
++#: models/media.py:190 models/media.py:332
  msgid "original title / translation"
  msgstr "titre original / traduction"
  
--#: models/media.py:177
++#: models/media.py:191
  msgid "depositor / contributor"
  msgstr "déposant / contributeur"
  
--#: models/media.py:180 models/media.py:682
++#: models/media.py:194 models/media.py:753
  msgid "recording year (from)"
  msgstr "année d'enregistrement (depuis)"
  
--#: models/media.py:181 models/media.py:683
++#: models/media.py:195 models/media.py:754
  msgid "recording year (until)"
  msgstr "année d'enregistrement (jusqu'à)"
  
--#: models/media.py:182
++#: models/media.py:196
  msgid "year published"
  msgstr "année de parution"
  
--#: models/media.py:188 models/media.py:361
++#: models/media.py:202 models/media.py:375
  msgid "recordist"
  msgstr "opérateur d'enregistrement"
  
--#: models/media.py:192
++#: models/media.py:206
  msgid "publisher collection"
  msgstr "collection éditeur"
  
--#: models/media.py:193
++#: models/media.py:207
  msgid "publisher serial number"
  msgstr "numéro dans la série"
  
--#: models/media.py:194
++#: models/media.py:208
  msgid "author of published notice"
  msgstr "auteur de la notice éditée"
  
--#: models/media.py:195
++#: models/media.py:209
  msgid "bibliographic references"
  msgstr "références bibliographiques"
  
--#: models/media.py:196
++#: models/media.py:210
  msgid "document type"
  msgstr "type de document"
  
--#: models/media.py:205
++#: models/media.py:219
  msgid "CNRS depositor"
  msgstr "déposant CNRS"
  
--#: models/media.py:208
++#: models/media.py:222
  msgid "related documentation"
  msgstr "documentation associée"
  
--#: models/media.py:211
++#: models/media.py:225
  msgid "copies"
  msgstr "autres exemplaires"
  
--#: models/media.py:215
++#: models/media.py:229
  msgid "archiver notes"
  msgstr "notes de l'archiviste"
  
--#: models/media.py:216
++#: models/media.py:230
  msgid "items finished"
  msgstr "fiches items faites"
  
--#: models/media.py:217
++#: models/media.py:231
  msgid "recordist identical to depositor"
  msgstr "collecteur identique au déposant"
  
--#: models/media.py:218
++#: models/media.py:232
  msgid "published"
  msgstr "édité"
  
--#: models/media.py:219
++#: models/media.py:233
  msgid "conservation site"
  msgstr "lieu de conservation"
  
--#: models/media.py:224
++#: models/media.py:238
  msgid "old code"
  msgstr "ancienne cote"
  
--#: models/media.py:225 models/media.py:379
++#: models/media.py:239 models/media.py:393
  msgid "approximative duration"
  msgstr "durée"
  
--#: models/media.py:226
++#: models/media.py:240
  msgid "number of components (medium / piece)"
  msgstr "nb de composants (support / pièce)"
  
--#: models/media.py:230
++#: models/media.py:244
  msgid "digitization"
  msgstr "numérisation"
  
--#: models/media.py:231
++#: models/media.py:245 models/media.py:638
  msgid "status"
  msgstr "état"
  
--#: models/media.py:232
++#: models/media.py:246
  msgid "a_informer_07_03"
  msgstr "a_informer_07_03"
  
--#: models/media.py:267
++#: models/media.py:281
  msgid "states / nations"
  msgstr "états / nations"
  
--#: models/media.py:281
++#: models/media.py:295
  msgid "populations / social groups"
  msgstr "populations / groupes sociaux"
  
--#: models/media.py:289 models/media.py:440
++#: models/media.py:303 models/media.py:453
  msgid "computed duration"
  msgstr "durée calculée"
  
--#: models/media.py:297 models/media.py:303 models/media.py:320
++#: models/media.py:311 models/media.py:317 models/media.py:334
  msgid "collection"
  msgstr "collection"
  
--#: models/media.py:307 models/media.py:308
++#: models/media.py:321 models/media.py:322
  msgid "collection related media"
  msgstr "média associés à la collection"
  
--#: models/media.py:321
++#: models/media.py:335
  msgid "recording date (from)"
  msgstr "date d'enregistrement (depuis)"
  
--#: models/media.py:322
++#: models/media.py:336
  msgid "recording date (until)"
  msgstr "date d'enregistrement (jusqu'à)"
  
--#: models/media.py:324
++#: models/media.py:338
  msgid "scientist"
 -msgstr "reponsable scientifique"
 +msgstr "responsable scientifique"
  
--#: models/media.py:326
++#: models/media.py:340
  msgid "summary"
  msgstr "résumé"
  
--#: models/media.py:327
++#: models/media.py:341
  msgid "remarks"
  msgstr "remarques"
  
--#: models/media.py:331
++#: models/media.py:345
  msgid "location details"
  msgstr "précisions lieu"
  
--#: models/media.py:332
++#: models/media.py:346
  msgid "cultural area"
  msgstr "aire culturelle"
  
--#: models/media.py:335
++#: models/media.py:349
  msgid "language"
  msgstr "langue"
  
--#: models/media.py:337
++#: models/media.py:351
  msgid "ISO language"
  msgstr "Langue ISO"
  
--#: models/media.py:339
++#: models/media.py:353
  msgid "comments / ethnographic context"
  msgstr "commentaires / contexte ethnographique"
  
--#: models/media.py:340
++#: models/media.py:354
  msgid "moda_execut"
  msgstr "moda_execut"
  
--#: models/media.py:347
++#: models/media.py:361
  msgid "author / compositor"
  msgstr "auteur / compositeur"
  
--#: models/media.py:348
++#: models/media.py:362
  msgid "contributor"
  msgstr "intervenant"
  
--#: models/media.py:354
++#: models/media.py:368
  msgid "depositor"
  msgstr "déposant"
  
--#: models/media.py:360
++#: models/media.py:374
  msgid "item number"
  msgstr "n° de l'item"
  
--#: models/media.py:362
++#: models/media.py:376
  msgid "digitalist"
  msgstr "opérateur de numérisation"
  
--#: models/media.py:363
++#: models/media.py:377
  msgid "collector"
  msgstr "collecteur"
  
--#: models/media.py:364
++#: models/media.py:378
  msgid "collector selection"
  msgstr "sélection collecteur"
  
--#: models/media.py:365
++#: models/media.py:379
  msgid "collector as in collection"
  msgstr "collecteur identique à la collection"
  
--#: models/media.py:366
++#: models/media.py:380
  msgid "digitization date"
  msgstr "date de numérisation"
  
--#: models/media.py:367
++#: models/media.py:381
  msgid "publishing date"
  msgstr "date de création du support édité"
  
--#: models/media.py:368
++#: models/media.py:382
  msgid "creator reference"
  msgstr "référence du créateur"
  
--#: models/media.py:369
++#: models/media.py:383
  msgid "published references"
  msgstr "références éditées"
  
--#: models/media.py:371
++#: models/media.py:385
  msgid "copy of"
  msgstr "copie de"
  
--#: models/media.py:372
 -#, fuzzy
++#: models/media.py:386
  msgid "mime type"
  msgstr "type mime"
  
--#: models/media.py:386 templates/telemeta/mediaitem_edit.html:47
++#: models/media.py:400 templates/telemeta/mediaitem_edit.html:47
  msgid "keywords"
  msgstr "mots-clés"
  
--#: models/media.py:467
++#: models/media.py:480
  msgid "instruments"
  msgstr "instruments"
  
--#: models/media.py:477 models/media.py:478
++#: models/media.py:510 models/media.py:511
  msgid "item related media"
  msgstr "média associés à l'item"
  
--#: models/media.py:496
++#: models/media.py:529
  msgid "composition"
  msgstr "Voix / Instruments"
  
--#: models/media.py:498
++#: models/media.py:531
  msgid "vernacular name"
  msgstr "nom vernaculaire"
  
--#: models/media.py:499
++#: models/media.py:532
  msgid "number"
  msgstr "nombre"
  
--#: models/media.py:500
++#: models/media.py:533
  msgid "interprets"
  msgstr "interprètes"
  
--#: models/media.py:511
++#: models/media.py:544
  msgid "id"
  msgstr ""
  
--#: models/media.py:514
++#: models/media.py:547
  msgid "unit"
  msgstr "unité"
  
--#: models/media.py:533
++#: models/media.py:566
  msgid "start"
  msgstr "début"
  
--#: models/media.py:534
++#: models/media.py:567
  msgid "end"
  msgstr "fin"
  
--#: models/media.py:538
++#: models/media.py:571
  msgid "item part"
  msgstr "partie"
  
--#: models/media.py:546 models/media.py:563 models/media.py:578
++#: models/media.py:579 models/media.py:596 models/media.py:611
  msgid "public_id"
  msgstr "public_id"
  
--#: models/media.py:564
++#: models/media.py:597
  msgid "playlist"
  msgstr "liste de lecture"
  
--#: models/media.py:565
++#: models/media.py:598
  msgid "resource_type"
  msgstr "type de ressource"
  
--#: models/media.py:566
++#: models/media.py:599
  msgid "resource_id"
  msgstr "ressource"
  
--#: models/media.py:579 models/system.py:55
--msgid "time"
++#: models/media.py:612
++#, fuzzy
++msgid "time (s)"
  msgstr "heure"
  
--#: models/media.py:583
++#: models/media.py:616
  msgid "author"
  msgstr "auteur"
  
--#: models/media.py:601
++#: models/media.py:672
  msgid "transcoded"
  msgstr ""
  
--#: models/media.py:681
++#: models/media.py:752
  msgid "collections"
  msgstr "collections"
  
--#: models/media.py:693 models/media.py:694 models/media.py:704
--#: models/media.py:721
++#: models/media.py:764 models/media.py:765 models/media.py:775
++#: models/media.py:792
  msgid "corpus"
  msgstr "corpus"
  
--#: models/media.py:714 models/media.py:715 models/media.py:732
++#: models/media.py:785 models/media.py:786 models/media.py:803
  msgid "fonds"
  msgstr "fonds"
  
--#: models/media.py:725 models/media.py:726
++#: models/media.py:796 models/media.py:797
  msgid "corpus related media"
  msgstr "média associés"
  
--#: models/media.py:736 models/media.py:737
++#: models/media.py:807 models/media.py:808
  msgid "fonds related media"
  msgstr "média associés"
  
@@@ -687,6 -688,6 +709,10 @@@ msgstr "identifiant de l'élément
  msgid "modification type"
  msgstr "type de modification"
  
++#: models/system.py:55
++msgid "time"
++msgstr "heure"
++
  #: models/system.py:56
  msgid "user"
  msgstr "utilisateur"
index f29cf98f1a6085d0559325b33bbfa1c440c318f6,adc4e38714b122e82b6c94cf4d4d4b5bab3cee01..bda67f818230c9c4b18e6da3e714f95859e24557
Binary files differ
index cee764eed305dcd7011fad3988749aa1de764106,6559b5bdb9f58f64819b5a475bbc4e976e39e10c..d1fd5ff27f430ad431567c47be0cbb69b7d2ae97
@@@ -8,7 -8,7 +8,7 @@@ msgid "
  msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2012-12-18 10:57+0100\n"
 -"POT-Creation-Date: 2013-01-01 10:34+0100\n"
++"POT-Creation-Date: 2013-01-08 09:27+0100\n"
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  "Last-Translator: Guillaume Pellerin <yomguy@parisson.com>\n"
  "Language-Team: LANGUAGE <LL@li.org>\n"
Simple merge
index 0000000000000000000000000000000000000000,35f7ab1f7ec8c9b28afa028d8acd681f3f8299ab..10db138912a33a5abd234542d9314366b24982f3
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,398 +1,398 @@@
 -                      errmsg = _("The XML in '%s' is not well-formed and cannot be parsed: %s") % (xml, e)
+ # -*- coding: utf-8 -*-
+ """ xmltodict(): convert xml into tree of Python dicts.
+ This was copied and modified from John Bair's recipe at aspn.activestate.com:
+       http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/149368
+ """
+ import os
+ import string
+ import locale
+ from xml.parsers import expat
+ # If we're in Dabo, get the default encoding.
+ #import dabo
+ #import dabo.lib.DesignerUtils as desUtil
+ #from dabo.dLocalize import _
+ #from dabo.lib.utils import resolvePath
+ #app = dabo.dAppRef
+ #if app is not None:
+       #default_encoding = app.Encoding
+ #else:
+               #enc = locale.getlocale()[1]
+               #if enc is None:
+                       #enc = dabo.defaultEncoding
+               #default_encoding = enc
+ # Python seems to need to compile code with \n linesep:
+ code_linesep = "\n"
+ eol = os.linesep
+ default_encoding = 'utf-8'
+ default_decoding = 'utf-8'
+ class Xml2Obj:
+       """XML to Object"""
+       def __init__(self):
+               self.root = None
+               self.nodeStack = []
+               self.attsToSkip = []
+               self._inCode = False
+               self._mthdName = ""
+               self._mthdCode = ""
+               self._codeDict = None
+               self._inProp = False
+               self._propName = ""
+               self._propData = ""
+               self._propDict = None
+               self._currPropAtt = ""
+               self._currPropDict = None
+       def StartElement(self, name, attributes):
+               """SAX start element even handler"""
+               if name == "code":
+                       # This is code for the parent element
+                       self._inCode = True
+                       parent = self.nodeStack[-1]
+                       if not parent.has_key("code"):
+                               parent["code"] = {}
+                               self._codeDict = parent["code"]
+               elif name == "properties":
+                       # These are the custom property definitions
+                       self._inProp = True
+                       self._propName = ""
+                       self._propData = ""
+                       parent = self.nodeStack[-1]
+                       if not parent.has_key("properties"):
+                               parent["properties"] = {}
+                               self._propDict = parent["properties"]
+               else:
+                       if self._inCode:
+                               self._mthdName = name.encode()
+                       elif self._inProp:
+                               if self._propName:
+                                       # In the middle of a prop definition
+                                       self._currPropAtt = name.encode()
+                               else:
+                                       self._propName = name.encode()
+                                       self._currPropDict = {}
+                                       self._currPropAtt = ""
+                       else:
+                               element = {"name": name.encode()}
+                               if len(attributes) > 0:
+                                       for att in self.attsToSkip:
+                                               if attributes.has_key(att):
+                                                       del attributes[att]
+                                       element["attributes"] = attributes
+                               # Push element onto the stack and make it a child of parent
+                               if len(self.nodeStack) > 0:
+                                       parent = self.nodeStack[-1]
+                                       if not parent.has_key("children"):
+                                               parent["children"] = []
+                                       parent["children"].append(element)
+                               else:
+                                       self.root = element
+                               self.nodeStack.append(element)
+       def EndElement(self, name):
+               """SAX end element event handler"""
+               if self._inCode:
+                       if name == "code":
+                               self._inCode = False
+                               self._codeDict = None
+                       else:
+                               # End of an individual method
+                               mth = self._mthdCode.strip()
+                               if not mth.endswith("\n"):
+                                       mth += "\n"
+                               self._codeDict[self._mthdName] = mth
+                               self._mthdName = ""
+                               self._mthdCode = ""
+               elif self._inProp:
+                       if name == "properties":
+                               self._inProp = False
+                               self._propDict = None
+                       elif name == self._propName:
+                               # End of an individual prop definition
+                               self._propDict[self._propName] = self._currPropDict
+                               self._propName = ""
+                       else:
+                               # end of a property attribute
+                               self._currPropDict[self._currPropAtt] = self._propData
+                               self._propData = self._currPropAtt = ""
+               else:
+                       self.nodeStack = self.nodeStack[:-1]
+       def CharacterData(self, data):
+               """SAX character data event handler"""
+               if self._inCode or data.strip():
+                       data = data.replace("&lt;", "<")
+                       data = data.encode(default_encoding)
+                       if self._inCode:
+                               if self._mthdCode:
+                                       self._mthdCode += data
+                               else:
+                                       self._mthdCode = data
+                       elif self._inProp:
+                               self._propData += data
+                       else:
+                               element = self.nodeStack[-1]
+                               if not element.has_key("cdata"):
+                                       element["cdata"] = ""
+                               element["cdata"] += data
+       def Parse(self, xml):
+               # Create a SAX parser
+               Parser = expat.ParserCreate(default_encoding)
+               # SAX event handlers
+               Parser.StartElementHandler = self.StartElement
+               Parser.EndElementHandler = self.EndElement
+               Parser.CharacterDataHandler = self.CharacterData
+               # Parse the XML File
+               ParserStatus = Parser.Parse(xml, 1)
+               return self.root
+       def ParseFromFile(self, filename):
+               return self.Parse(open(filename,"r").read())
+ def xmltodict(xml, attsToSkip=[], addCodeFile=False):
+       """Given an xml string or file, return a Python dictionary."""
+       parser = Xml2Obj()
+       parser.attsToSkip = attsToSkip
+       isPath = os.path.exists(xml)
+       errmsg = ""
+       if eol not in xml and isPath:
+               # argument was a file
+               try:
+                       ret = parser.ParseFromFile(xml)
+               except expat.ExpatError, e:
 -                      errmsg = _("The file '%s' could not be found") % xml
++                      errmsg = "The XML in '%s' is not well-formed and cannot be parsed: %s" % (xml, e)
+       else:
+               # argument must have been raw xml:
+               if not xml.strip().startswith("<?xml "):
+                       # it's a bad file name
 -                              errmsg = _("An invalid XML string was encountered")
++                      errmsg = "The file '%s' could not be found" % xml
+               else:
+                       try:
+                               ret = parser.Parse(xml)
+                       except expat.ExpatError:
++                              errmsg = "An invalid XML string was encountered"
+       if errmsg:
+               raise dabo.dException.XmlException, errmsg
+       if addCodeFile and isPath:
+               # Get the associated code file, if any
+               codePth = "%s-code.py" % os.path.splitext(xml)[0]
+               if os.path.exists(codePth):
+                       try:
+                               codeDict = desUtil.parseCodeFile(open(codePth).read())
+                               desUtil.addCodeToClassDict(ret, codeDict)
+                       except StandardError, e:
+                               print "Failed to parse code file:", e
+       return ret
+ def escQuote(val, noEscape=False, noQuote=False):
+       """Add surrounding quotes to the string, and escape
+       any illegal XML characters.
+       """
+       if not isinstance(val, basestring):
+               val = str(val)
+       if not isinstance(val, unicode):
+               val = unicode(val, default_encoding)
+       if noQuote:
+               qt = ''
+       else:
+               qt = '"'
+       slsh = "\\"
+ #     val = val.replace(slsh, slsh+slsh)
+       if not noEscape:
+               # First escape internal ampersands. We need to double them up due to a
+               # quirk in wxPython and the way it displays this character.
+               val = val.replace("&", "&amp;&amp;")
+               # Escape any internal quotes
+               val = val.replace('"', '&quot;').replace("'", "&apos;")
+               # Escape any high-order characters
+               chars = []
+               for pos, char in enumerate(list(val)):
+                       if ord(char) > 127:
+                               chars.append("&#%s;" % ord(char))
+                       else:
+                                       chars.append(char)
+               val = "".join(chars)
+       val = val.replace("<", "&#060;").replace(">", "&#062;")
+       return "%s%s%s" % (qt, val, qt)
+ def dicttoxml(dct, level=0, header=None, linesep=None):
+       """Given a Python dictionary, return an xml string.
+       The dictionary must be in the format returned by dicttoxml(), with keys
+       on "attributes", "code", "cdata", "name", and "children".
+       Send your own XML header, otherwise a default one will be used.
+       The linesep argument is a dictionary, with keys on levels, allowing the
+       developer to add extra whitespace depending on the level.
+       """
+       att = ""
+       ret = ""
+       if dct.has_key("attributes"):
+               for key, val in dct["attributes"].items():
+                       # Some keys are already handled.
+                       noEscape = key in ("sizerInfo",)
+                       val = escQuote(val, noEscape)
+                       att += " %s=%s" % (key, val)
+       ret += "%s<%s%s" % ("\t" * level, dct["name"], att)
+       if (not dct.has_key("cdata") and not dct.has_key("children")
+                       and not dct.has_key("code") and not dct.has_key("properties")):
+               ret += " />%s" % eol
+       else:
+               ret += ">"
+               if dct.has_key("cdata"):
+                       ret += "%s" % dct["cdata"].decode(default_encoding).replace("<", "&lt;")
+               if dct.has_key("code"):
+                       if len(dct["code"].keys()):
+                               ret += "%s%s<code>%s" % (eol, "\t" * (level+1), eol)
+                               methodTab = "\t" * (level+2)
+                               for mthd, cd in dct["code"].items():
+                                       # Convert \n's in the code to eol:
+                                       cd = eol.join(cd.splitlines())
+                                       # Make sure that the code ends with a linefeed
+                                       if not cd.endswith(eol):
+                                               cd += eol
+                                       ret += "%s<%s><![CDATA[%s%s]]>%s%s</%s>%s" % (methodTab,
+                                                       mthd, eol, cd, eol,
+                                                       methodTab, mthd, eol)
+                               ret += "%s</code>%s"    % ("\t" * (level+1), eol)
+               if dct.has_key("properties"):
+                       if len(dct["properties"].keys()):
+                               ret += "%s%s<properties>%s" % (eol, "\t" * (level+1), eol)
+                               currTab = "\t" * (level+2)
+                               for prop, val in dct["properties"].items():
+                                       ret += "%s<%s>%s" % (currTab, prop, eol)
+                                       for propItm, itmVal in val.items():
+                                               itmTab = "\t" * (level+3)
+                                               ret += "%s<%s>%s</%s>%s" % (itmTab, propItm, itmVal,
+                                                               propItm, eol)
+                                       ret += "%s</%s>%s" % (currTab, prop, eol)
+                               ret += "%s</properties>%s"      % ("\t" * (level+1), eol)
+               if dct.has_key("children") and len(dct["children"]) > 0:
+                       ret += eol
+                       for child in dct["children"]:
+                               ret += dicttoxml(child, level+1, linesep=linesep)
+               indnt = ""
+               if ret.endswith(eol):
+                       # Indent the closing tag
+                       indnt = ("\t" * level)
+               ret += "%s</%s>%s" % (indnt, dct["name"], eol)
+               if linesep:
+                       ret += linesep.get(level, "")
+       if level == 0:
+               if header is None:
+                       header = '<?xml version="1.0" encoding="%s" standalone="no"?>%s' \
+                                       % (default_encoding, eol)
+               ret = header + ret
+       return ret
+ def flattenClassDict(cd, retDict=None):
+       """Given a dict containing a series of nested objects such as would
+       be created by restoring from a cdxml file, returns a dict with all classIDs
+       as keys, and a dict as the corresponding value. The dict value will have
+       keys for the attributes and/or code, depending on what was in the original
+       dict. The end result is to take a nested dict structure and return a flattened
+       dict with all objects at the top level.
+       """
+       if retDict is None:
+               retDict = {}
+       atts = cd.get("attributes", {})
+       props = cd.get("properties", {})
+       kids = cd.get("children", [])
+       code = cd.get("code", {})
+       classID = atts.get("classID", "")
+       classFile = resolvePath(atts.get("designerClass", ""))
+       superclass = resolvePath(atts.get("superclass", ""))
+       superclassID = atts.get("superclassID", "")
+       if superclassID and os.path.exists(superclass):
+               # Get the superclass info
+               superCD = xmltodict(superclass, addCodeFile=True)
+               flattenClassDict(superCD, retDict)
+       if classID:
+               if os.path.exists(classFile):
+                       # Get the class info
+                       classCD = xmltodict(classFile, addCodeFile=True)
+                       classAtts = classCD.get("attributes", {})
+                       classProps = classCD.get("properties", {})
+                       classCode = classCD.get("code", {})
+                       classKids = classCD.get("children", [])
+                       currDict = retDict.get(classID, {})
+                       retDict[classID] = {"attributes": classAtts, "code": classCode,
+                                       "properties": classProps}
+                       retDict[classID].update(currDict)
+                       # Now update the child objects in the dict
+                       for kid in classKids:
+                               flattenClassDict(kid, retDict)
+               else:
+                       # Not a file; most likely just a component in another class
+                       currDict = retDict.get(classID, {})
+                       retDict[classID] = {"attributes": atts, "code": code,
+                                       "properties": props}
+                       retDict[classID].update(currDict)
+       if kids:
+               for kid in kids:
+                       flattenClassDict(kid, retDict)
+       return retDict
+ def addInheritedInfo(src, super, updateCode=False):
+       """Called recursively on the class container structure, modifying
+       the attributes to incorporate superclass information. When the
+       'updateCode' parameter is True, superclass code is added to the
+       object's code
+       """
+       atts = src.get("attributes", {})
+       props = src.get("properties", {})
+       kids = src.get("children", [])
+       code = src.get("code", {})
+       classID = atts.get("classID", "")
+       if classID:
+               superInfo = super.get(classID, {"attributes": {}, "code": {}, "properties": {}})
+               src["attributes"] = superInfo["attributes"].copy()
+               src["attributes"].update(atts)
+               src["properties"] = superInfo.get("properties", {}).copy()
+               src["properties"].update(props)
+               if updateCode:
+                       src["code"] = superInfo["code"].copy()
+                       src["code"].update(code)
+       if kids:
+               for kid in kids:
+                       addInheritedInfo(kid, super, updateCode)
+ #if __name__ == "__main__":
+       #test_dict = {"name": "test", "attributes":{"path": "c:\\temp\\name",
+                       #"problemChars": "Welcome to <Jos\xc3\xa9's \ Stuff!>\xc2\xae".decode("latin-1")}}
+       #print "test_dict:", test_dict
+       #xml = dicttoxml(test_dict)
+       #print "xml:", xml
+       #test_dict2 = xmltodict(xml)
+       #print "test_dict2:", test_dict2
+       #print "same?:", test_dict == test_dict2