aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AUTHORS2
-rw-r--r--MANIFEST.in5
-rw-r--r--README17
-rw-r--r--babel.ini3
-rwxr-xr-xdevtools/maketarball.sh (renamed from maketarball.sh)0
-rwxr-xr-xdevtools/update_translations.sh48
-rw-r--r--docs/source/_templates/mg_theme/layout.html39
-rw-r--r--docs/source/_templates/mg_theme/static/default.css_t299
-rw-r--r--docs/source/_templates/mg_theme/theme.conf31
-rw-r--r--docs/source/conf.py13
-rw-r--r--docs/source/configuration.rst42
-rw-r--r--docs/source/deploying.rst211
-rw-r--r--docs/source/foreword.rst8
-rw-r--r--docs/source/index.rst2
-rw-r--r--docs/source/media-types.rst34
-rw-r--r--docs/source/production-deployments.rst81
-rw-r--r--docs/source/themes/mg/layout.html29
-rw-r--r--docs/source/themes/mg/static/fonts/Lato-Bold.ttfbin0 -> 93224 bytes
-rw-r--r--docs/source/themes/mg/static/fonts/Lato-BoldItalic.ttfbin0 -> 81936 bytes
-rw-r--r--docs/source/themes/mg/static/fonts/Lato-Italic.ttfbin0 -> 83680 bytes
-rw-r--r--docs/source/themes/mg/static/fonts/Lato-Regular.ttfbin0 -> 96044 bytes
-rw-r--r--docs/source/themes/mg/static/fonts/OFL_1.1.txt97
-rw-r--r--docs/source/themes/mg/static/logo_docs.pngbin0 -> 6626 bytes
-rw-r--r--docs/source/themes/mg/static/mg.css161
-rw-r--r--docs/source/themes/mg/theme.conf5
-rw-r--r--extlib/960.gs/960_16_col.css447
-rwxr-xr-xextlib/960.gs/README.txt54
-rw-r--r--extlib/960.gs/reset.css202
-rw-r--r--extlib/960.gs/text.css86
-rw-r--r--extlib/html5shiv/MIT.txt (renamed from extlib/960.gs/MIT.txt)0
-rw-r--r--extlib/html5shiv/html5shiv.js3
-rw-r--r--extlib/inconsolata/INFO.txt4
-rw-r--r--extlib/inconsolata/Inconsolata.otfbin0 -> 58464 bytes
-rw-r--r--extlib/inconsolata/Inconsolata.pfa1088
-rw-r--r--extlib/inconsolata/Inconsolata.sfd5730
-rw-r--r--extlib/inconsolata/OFL_1.1.txt97
-rw-r--r--extlib/inconsolata/textest.pdfbin0 -> 22783 bytes
-rw-r--r--extlib/jquery/MIT.txt20
-rw-r--r--extlib/jquery/jquery.js4
-rw-r--r--extlib/reset/reset.css49
-rwxr-xr-xlazyserver.sh6
-rw-r--r--mediagoblin.ini6
-rw-r--r--mediagoblin/_version.py11
-rw-r--r--mediagoblin/app.py35
-rw-r--r--mediagoblin/auth/forms.py26
-rw-r--r--mediagoblin/auth/lib.py19
-rw-r--r--mediagoblin/auth/routing.py13
-rw-r--r--mediagoblin/auth/views.py105
-rw-r--r--mediagoblin/config_spec.ini18
-rw-r--r--mediagoblin/db/__init__.py2
-rw-r--r--mediagoblin/db/mixin.py92
-rw-r--r--mediagoblin/db/mongo/__init__.py (renamed from mediagoblin/templates/mediagoblin/auth/fp_changed_success.html)14
-rw-r--r--mediagoblin/db/mongo/indexes.py (renamed from mediagoblin/db/indexes.py)5
-rw-r--r--mediagoblin/db/mongo/migrations.py (renamed from mediagoblin/db/migrations.py)10
-rw-r--r--mediagoblin/db/mongo/models.py (renamed from mediagoblin/db/models.py)0
-rw-r--r--mediagoblin/db/mongo/open.py78
-rw-r--r--mediagoblin/db/mongo/util.py292
-rw-r--r--mediagoblin/db/open.py41
-rw-r--r--mediagoblin/db/sql/__init__.py (renamed from mediagoblin/templates/mediagoblin/auth/fp_email_sent.html)15
-rw-r--r--mediagoblin/db/sql/base.py38
-rw-r--r--mediagoblin/db/sql/convert.py151
-rw-r--r--mediagoblin/db/sql/extratypes.py18
-rw-r--r--mediagoblin/db/sql/models.py153
-rw-r--r--mediagoblin/db/sql/open.py33
-rw-r--r--mediagoblin/db/util.py277
-rw-r--r--mediagoblin/decorators.py17
-rw-r--r--mediagoblin/edit/__init__.py2
-rw-r--r--mediagoblin/edit/forms.py32
-rw-r--r--mediagoblin/edit/lib.py4
-rw-r--r--mediagoblin/edit/routing.py5
-rw-r--r--mediagoblin/edit/views.py100
-rw-r--r--mediagoblin/gmg_commands/__init__.py5
-rw-r--r--mediagoblin/gmg_commands/import_export.py36
-rw-r--r--mediagoblin/gmg_commands/migrate.py14
-rw-r--r--mediagoblin/gmg_commands/users.py36
-rw-r--r--mediagoblin/gmg_commands/util.py13
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mobin12268 -> 14396 bytes
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po497
-rw-r--r--mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mobin10826 -> 13397 bytes
-rw-r--r--mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po501
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mobin11089 -> 13692 bytes
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po548
-rw-r--r--mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po458
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mobin10809 -> 13543 bytes
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po524
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mobin11329 -> 13891 bytes
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po547
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mobin11272 -> 12357 bytes
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po403
-rw-r--r--mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mobin10530 -> 13161 bytes
-rw-r--r--mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po457
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mobin11026 -> 13574 bytes
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po523
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mobin11224 -> 13736 bytes
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po469
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mobin10695 -> 11670 bytes
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po412
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mobin10287 -> 12901 bytes
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po509
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mobin10945 -> 13279 bytes
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po515
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mobin11051 -> 13685 bytes
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po535
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mobin13895 -> 16681 bytes
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po530
-rw-r--r--mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mobin11267 -> 13900 bytes
-rw-r--r--mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po576
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mobin10764 -> 13350 bytes
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po488
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mobin10627 -> 13259 bytes
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po455
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mobin11015 -> 13448 bytes
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po511
-rw-r--r--mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mobin0 -> 13409 bytes
-rw-r--r--mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po637
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mobin10509 -> 11198 bytes
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po324
-rw-r--r--mediagoblin/init/__init__.py46
-rw-r--r--mediagoblin/init/celery/__init__.py14
-rw-r--r--mediagoblin/init/celery/from_celery.py2
-rw-r--r--mediagoblin/init/config.py2
-rw-r--r--mediagoblin/listings/routing.py1
-rw-r--r--mediagoblin/listings/views.py27
-rw-r--r--mediagoblin/meddleware/__init__.py32
-rw-r--r--mediagoblin/meddleware/csrf.py (renamed from mediagoblin/middleware/csrf.py)30
-rw-r--r--mediagoblin/meddleware/noop.py (renamed from mediagoblin/middleware/noop.py)9
-rw-r--r--mediagoblin/media_types/__init__.py88
-rw-r--r--mediagoblin/media_types/ascii/__init__.py27
-rw-r--r--mediagoblin/media_types/ascii/asciitoimage.py172
l---------mediagoblin/media_types/ascii/fonts/Inconsolata.otf1
-rw-r--r--mediagoblin/media_types/ascii/processing.py93
-rw-r--r--mediagoblin/media_types/image/__init__.py26
-rw-r--r--mediagoblin/media_types/image/processing.py109
-rw-r--r--mediagoblin/media_types/video/__init__.py27
-rw-r--r--mediagoblin/media_types/video/devices/web-advanced.json505
-rw-r--r--mediagoblin/media_types/video/devices/web-flv.pngbin0 -> 2234 bytes
-rw-r--r--mediagoblin/media_types/video/devices/web-webm.svg259
-rw-r--r--mediagoblin/media_types/video/devices/web.svg982
-rw-r--r--mediagoblin/media_types/video/processing.py119
-rw-r--r--mediagoblin/media_types/video/transcoders.py658
-rw-r--r--mediagoblin/messages.py2
-rw-r--r--mediagoblin/process_media/errors.py44
-rw-r--r--mediagoblin/processing.py (renamed from mediagoblin/process_media/__init__.py)120
-rw-r--r--mediagoblin/routing.py4
-rw-r--r--mediagoblin/static/css/base.css265
l---------mediagoblin/static/css/extlib/960_16_col.css1
l---------mediagoblin/static/css/extlib/reset.css2
l---------mediagoblin/static/css/extlib/text.css1
l---------mediagoblin/static/fonts/Inconsolata.otf1
-rw-r--r--mediagoblin/static/images/empty_back.pngbin0 -> 191 bytes
-rw-r--r--mediagoblin/static/images/icon_comment.pngbin0 -> 283 bytes
-rw-r--r--mediagoblin/static/images/icon_delete.pngbin472 -> 0 bytes
-rw-r--r--mediagoblin/static/images/icon_edit.pngbin297 -> 0 bytes
-rw-r--r--mediagoblin/static/images/media_thumbs/video.jpgbin0 -> 7278 bytes
-rw-r--r--mediagoblin/static/images/navigation_end.pngbin718 -> 0 bytes
-rw-r--r--mediagoblin/static/images/navigation_left.pngbin406 -> 0 bytes
-rw-r--r--mediagoblin/static/images/navigation_right.pngbin383 -> 0 bytes
-rw-r--r--mediagoblin/static/images/pagination_left.pngbin252 -> 0 bytes
-rw-r--r--mediagoblin/static/images/pagination_right.pngbin249 -> 0 bytes
-rw-r--r--mediagoblin/static/js/comment_show.js9
l---------mediagoblin/static/js/extlib/html5shiv.js1
l---------mediagoblin/static/js/extlib/jquery.js1
-rw-r--r--mediagoblin/static/js/show_password.js19
-rw-r--r--mediagoblin/staticdirect.py17
-rw-r--r--mediagoblin/storage/__init__.py12
-rw-r--r--mediagoblin/storage/cloudfiles.py11
-rw-r--r--mediagoblin/storage/filestorage.py14
-rw-r--r--mediagoblin/submit/__init__.py2
-rw-r--r--mediagoblin/submit/forms.py9
-rw-r--r--mediagoblin/submit/security.py2
-rw-r--r--mediagoblin/submit/views.py179
-rw-r--r--mediagoblin/templates/mediagoblin/404.html19
-rw-r--r--mediagoblin/templates/mediagoblin/auth/change_fp.html15
-rw-r--r--mediagoblin/templates/mediagoblin/auth/forgot_password.html11
-rw-r--r--mediagoblin/templates/mediagoblin/auth/login.html26
-rw-r--r--mediagoblin/templates/mediagoblin/auth/register.html9
-rw-r--r--mediagoblin/templates/mediagoblin/base.html56
-rw-r--r--mediagoblin/templates/mediagoblin/edit/attachments.html8
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit.html10
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit_account.html45
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit_profile.html8
-rw-r--r--mediagoblin/templates/mediagoblin/listings/tag.html19
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/ascii.html40
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/image.html (renamed from mediagoblin/middleware/__init__.py)7
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/video.html52
-rw-r--r--mediagoblin/templates/mediagoblin/root.html37
-rw-r--r--mediagoblin/templates/mediagoblin/submit/start.html6
-rw-r--r--mediagoblin/templates/mediagoblin/test_submit.html2
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/gallery.html43
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/media.html266
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html10
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/processing_panel.html6
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/user.html52
-rw-r--r--mediagoblin/templates/mediagoblin/utils/object_gallery.html12
-rw-r--r--mediagoblin/templates/mediagoblin/utils/pagination.html8
-rw-r--r--mediagoblin/templates/mediagoblin/utils/prev_next.html46
-rw-r--r--mediagoblin/templates/mediagoblin/utils/tags.html24
-rw-r--r--mediagoblin/templates/mediagoblin/utils/wtforms.html14
-rw-r--r--mediagoblin/templates/mediagoblin/webfinger/host-meta.xml27
-rw-r--r--mediagoblin/templates/mediagoblin/webfinger/xrd.xml27
-rw-r--r--mediagoblin/tests/test_auth.py73
-rw-r--r--mediagoblin/tests/test_celery_setup.py4
-rw-r--r--mediagoblin/tests/test_csrf_middleware.py21
-rw-r--r--mediagoblin/tests/test_edit.py95
-rw-r--r--mediagoblin/tests/test_mgoblin_app.ini6
-rw-r--r--mediagoblin/tests/test_migrations.py4
-rw-r--r--mediagoblin/tests/test_misc.py26
-rw-r--r--mediagoblin/tests/test_paste.ini2
-rw-r--r--mediagoblin/tests/test_storage.py27
-rw-r--r--mediagoblin/tests/test_submission.py49
-rw-r--r--mediagoblin/tests/test_tags.py9
-rw-r--r--mediagoblin/tests/test_tests.py6
-rw-r--r--mediagoblin/tests/tools.py64
-rw-r--r--mediagoblin/tools/common.py1
-rw-r--r--mediagoblin/tools/files.py2
-rw-r--r--mediagoblin/tools/mail.py7
-rw-r--r--mediagoblin/tools/pagination.py18
-rw-r--r--mediagoblin/tools/request.py12
-rw-r--r--mediagoblin/tools/response.py7
-rw-r--r--mediagoblin/tools/template.py23
-rw-r--r--mediagoblin/tools/text.py12
-rw-r--r--mediagoblin/tools/url.py2
-rw-r--r--mediagoblin/user_pages/__init__.py2
-rw-r--r--mediagoblin/user_pages/forms.py2
-rw-r--r--mediagoblin/user_pages/views.py88
-rw-r--r--mediagoblin/views.py3
-rw-r--r--mediagoblin/webfinger/__init__.py25
-rw-r--r--mediagoblin/webfinger/routing.py25
-rw-r--r--mediagoblin/webfinger/views.py117
-rw-r--r--mediagoblin/workbench.py9
-rw-r--r--paste.ini25
-rwxr-xr-xruntests.sh3
-rw-r--r--setup.py14
233 files changed, 20363 insertions, 6322 deletions
diff --git a/AUTHORS b/AUTHORS
index c9fc5c8e..76e16b86 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -13,6 +13,7 @@ Thank you!
* Alex Camelio
* Bernhard Keller
* Caleb Forbes Davis V
+* Corey Farwell
* Chris Moylan
* Christopher Allan Webber
* Daniel Neel
@@ -27,6 +28,7 @@ Thank you!
* Nathan Yergler
* Odin Hørthe Omdal
* Osama Khalid
+* Pablo J. Urbano Santos
* Rasmus Larsson
* Sam Kleinman
* Sebastian Spaeth
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 00000000..b1f93dba
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,5 @@
+recursive-include mediagoblin/templates *.html
+recursive-include mediagoblin/static *.js *.css *.png *.svg
+recursive-include mediagoblin/tests *.ini
+recursive-include docs *.rst *.html
+
diff --git a/README b/README
index 0aba179b..07f9a094 100644
--- a/README
+++ b/README
@@ -8,19 +8,18 @@ What is GNU MediaGoblin?
* Initially, a place to store all your photos that’s as awesome as, if
not more awesome than, existing network services (Flickr, SmugMug,
Picasa, etc)
-* Later, a place for all sorts of media, such as video, music, etc hosting.
-* Federated with OStatus!
* Customizable!
* A place for people to collaborate and show off original and derived
- creations. Free, as in freedom. We’re a GNU project in the making,
- afterall.
+ creations. Free, as in freedom. We’re a GNU project after all.
+* Later, a place for all sorts of media, such as video, music, etc hosting.
+* Later, federated with OStatus!
Is it ready for me to use?
==========================
-Not yet! We're working on it and we hope to have a usable system by
-September / October 2011.
+Yes! But with caveats. The software is usable and there are instances
+running, but it's still in its early stages.
Can I help/hang out/participate/whisper sweet nothings in your ear?
@@ -33,9 +32,9 @@ hang out, see `our Join page <http://mediagoblin.org/join/>`_
Where is the documentation?
===========================
-The beginnings of a user manual is located in the ``docs/`` directory
-in HTML, Texinfo, and source (Restructured Text) forms. It's also
-available online at http://docs.mediagoblin.org/ in HTML form.
+The beginnings of a site administration manual is located in the ``docs/``
+directory in HTML, Texinfo, and source (Restructured Text) forms. It's
+also available online at http://docs.mediagoblin.org/ in HTML form.
Contributor/developer documentation as well as documentation on the
project processes and infrastructure is located on
diff --git a/babel.ini b/babel.ini
index a4e3267a..1a8231f5 100644
--- a/babel.ini
+++ b/babel.ini
@@ -4,9 +4,12 @@
[jinja2: mediagoblin/templates/**.html]
# Extract jinja templates (html)
encoding = utf-8
+extensions = jinja2.ext.autoescape
+
[jinja2: mediagoblin/templates/**.txt]
# Extract jinja templates (text)
encoding = utf-8
+extensions = jinja2.ext.autoescape
# # Extraction from JavaScript files
# [javascript: mediagoblin/static/js/**.js]
diff --git a/maketarball.sh b/devtools/maketarball.sh
index 5f17e578..5f17e578 100755
--- a/maketarball.sh
+++ b/devtools/maketarball.sh
diff --git a/devtools/update_translations.sh b/devtools/update_translations.sh
new file mode 100755
index 00000000..1708e7e0
--- /dev/null
+++ b/devtools/update_translations.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# exit if anything fails
+set -e
+
+echo "==> checking out master"
+git checkout master
+
+echo "==> pulling git master"
+git pull
+
+echo "==> pulling present translations"
+./bin/tx pull -a
+git add mediagoblin/i18n/
+git commit -m "Committing present MediaGoblin translations before pushing extracted messages"
+
+echo "==> Extracting translations"
+./bin/pybabel extract -F babel.ini -o mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po .
+
+echo "==> Pushing extracted translations to Transifex"
+./bin/tx push -s
+
+# gets the new strings added to all files
+echo "==> Re-Pulling translations from Transifex"
+./bin/tx pull -a
+
+echo "==> Compiling .mo files"
+./bin/pybabel compile -D mediagoblin -d mediagoblin/i18n/
+
+echo "==> Committing to git"
+git add mediagoblin/i18n/
+git commit -m "Committing extracted and compiled translations"
diff --git a/docs/source/_templates/mg_theme/layout.html b/docs/source/_templates/mg_theme/layout.html
deleted file mode 100644
index eccda14b..00000000
--- a/docs/source/_templates/mg_theme/layout.html
+++ /dev/null
@@ -1,39 +0,0 @@
-{#
- default/layout.html
- ~~~~~~~~~~~~~~~~~~~
-
- Sphinx layout template for the default theme.
-
- :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
- :license: BSD, see LICENSE for details.
-#}
-{% extends "basic/layout.html" %}
-
-{% if theme_collapsiblesidebar|tobool %}
-{% set script_files = script_files + ['_static/sidebar.js'] %}
-{% endif %}
-
-{%- block footer %}
- <div class="footer">
- <div>
- {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
- {%- if last_updated %}
- {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
- {%- endif %}
- {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
- </div>
-<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /></a><br /><span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type">{{ shorttitle|e }}</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://bluesock.org/~willg/" property="cc:attributionName" rel="cc:attributionURL">Will Kahn-Greene</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a>.<br />
- </div>
-
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-163840-8']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-</script>
-{%- endblock %}
diff --git a/docs/source/_templates/mg_theme/static/default.css_t b/docs/source/_templates/mg_theme/static/default.css_t
deleted file mode 100644
index f200a0fe..00000000
--- a/docs/source/_templates/mg_theme/static/default.css_t
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * default.css_t
- * ~~~~~~~~~~~~~
- *
- * Sphinx stylesheet -- default theme.
- *
- * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-@import url("basic.css");
-
-/* -- page layout ----------------------------------------------------------- */
-
-body {
- font-family: {{ theme_bodyfont }};
- font-size: 100%;
- background-color: {{ theme_footerbgcolor }};
- color: #000;
- margin: 0;
- padding: 0;
-}
-
-div.document {
- background-color: {{ theme_sidebarbgcolor }};
-}
-
-div.documentwrapper {
- float: left;
- width: 100%;
-}
-
-div.bodywrapper {
- margin: 0 0 0 230px;
-}
-
-div.body {
- background-color: {{ theme_bgcolor }};
- color: {{ theme_textcolor }};
- padding: 0 20px 30px 20px;
-}
-
-{%- if theme_rightsidebar|tobool %}
-div.bodywrapper {
- margin: 0 230px 0 0;
-}
-{%- endif %}
-
-div.footer {
- color: {{ theme_footertextcolor }};
- width: 100%;
- padding: 9px 0 9px 0;
- text-align: center;
- font-size: 75%;
-}
-
-div.footer a {
- color: {{ theme_footertextcolor }};
- text-decoration: underline;
-}
-
-div.related {
- background-color: {{ theme_relbarbgcolor }};
- line-height: 30px;
- color: {{ theme_relbartextcolor }};
-}
-
-div.related a {
- color: {{ theme_relbarlinkcolor }};
-}
-
-div.sphinxsidebar {
- {%- if theme_stickysidebar|tobool %}
- top: 30px;
- bottom: 0;
- margin: 0;
- position: fixed;
- overflow: auto;
- height: auto;
- {%- endif %}
- {%- if theme_rightsidebar|tobool %}
- float: right;
- {%- if theme_stickysidebar|tobool %}
- right: 0;
- {%- endif %}
- {%- endif %}
-}
-
-{%- if theme_stickysidebar|tobool %}
-/* this is nice, but it it leads to hidden headings when jumping
- to an anchor */
-/*
-div.related {
- position: fixed;
-}
-
-div.documentwrapper {
- margin-top: 30px;
-}
-*/
-{%- endif %}
-
-div.sphinxsidebar h3 {
- font-family: {{ theme_headfont }};
- color: {{ theme_sidebartextcolor }};
- font-size: 1.4em;
- font-weight: normal;
- margin: 0;
- padding: 0;
-}
-
-div.sphinxsidebar h3 a {
- color: {{ theme_sidebartextcolor }};
-}
-
-div.sphinxsidebar h4 {
- font-family: {{ theme_headfont }};
- color: {{ theme_sidebartextcolor }};
- font-size: 1.3em;
- font-weight: normal;
- margin: 5px 0 0 0;
- padding: 0;
-}
-
-div.sphinxsidebar p {
- color: {{ theme_sidebartextcolor }};
-}
-
-div.sphinxsidebar p.topless {
- margin: 5px 10px 10px 10px;
-}
-
-div.sphinxsidebar ul {
- margin: 10px;
- padding: 0;
- color: {{ theme_sidebartextcolor }};
-}
-
-div.sphinxsidebar a {
- color: {{ theme_sidebarlinkcolor }};
-}
-
-div.sphinxsidebar input {
- border: 1px solid {{ theme_sidebarlinkcolor }};
- font-family: sans-serif;
- font-size: 1em;
-}
-
-
-/* -- hyperlink styles ------------------------------------------------------ */
-
-a {
- color: {{ theme_linkcolor }};
- text-decoration: none;
-}
-
-a:visited {
- color: {{ theme_visitedlinkcolor }};
- text-decoration: none;
-}
-
-a:hover {
- text-decoration: underline;
-}
-
-{% if theme_externalrefs|tobool %}
-a.external {
- text-decoration: none;
- border-bottom: 1px dashed {{ theme_linkcolor }};
-}
-
-a.external:hover {
- text-decoration: none;
- border-bottom: none;
-}
-{% endif %}
-
-/* -- body styles ----------------------------------------------------------- */
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
- font-family: {{ theme_headfont }};
- background-color: {{ theme_headbgcolor }};
- font-weight: normal;
- color: {{ theme_headtextcolor }};
- border-bottom: 1px solid #ccc;
- margin: 20px -20px 10px -20px;
- padding: 3px 0 3px 10px;
-}
-
-div.body h1 { margin-top: 0; font-size: 200%; }
-div.body h2 { font-size: 160%; }
-div.body h3 { font-size: 140%; }
-div.body h4 { font-size: 120%; }
-div.body h5 { font-size: 110%; }
-div.body h6 { font-size: 100%; }
-
-a.headerlink {
- color: {{ theme_headlinkcolor }};
- font-size: 0.8em;
- padding: 0 4px 0 4px;
- text-decoration: none;
-}
-
-a.headerlink:hover {
- background-color: {{ theme_headlinkcolor }};
- color: white;
-}
-
-div.body p, div.body dd, div.body li {
- text-align: justify;
- line-height: 130%;
-}
-
-div.admonition p.admonition-title + p {
- display: inline;
-}
-
-div.admonition p {
- margin-bottom: 5px;
-}
-
-div.admonition pre {
- margin-bottom: 5px;
-}
-
-div.admonition ul, div.admonition ol {
- margin-bottom: 5px;
-}
-
-div.note {
- background-color: #eee;
- border: 1px solid #ccc;
-}
-
-div.seealso {
- background-color: #ffc;
- border: 1px solid #ff6;
-}
-
-div.topic {
- background-color: #eee;
-}
-
-div.warning {
- background-color: #ffe4e4;
- border: 1px solid #f66;
-}
-
-p.admonition-title {
- display: inline;
-}
-
-p.admonition-title:after {
- content: ":";
-}
-
-pre {
- padding: 5px;
- background-color: {{ theme_codebgcolor }};
- color: {{ theme_codetextcolor }};
- line-height: 120%;
- border: 1px solid #ac9;
- border-left: none;
- border-right: none;
-}
-
-tt {
- background-color: #ecf0f3;
- padding: 0 1px 0 1px;
- font-size: 0.95em;
-}
-
-th {
- background-color: #ede;
-}
-
-.warning tt {
- background: #efc2c2;
-}
-
-.note tt {
- background: #d6d6d6;
-}
-
-.viewcode-back {
- font-family: {{ theme_bodyfont }};
-}
-
-div.viewcode-block:target {
- background-color: #f4debf;
- border-top: 1px solid #ac9;
- border-bottom: 1px solid #ac9;
-}
diff --git a/docs/source/_templates/mg_theme/theme.conf b/docs/source/_templates/mg_theme/theme.conf
deleted file mode 100644
index 49442e3b..00000000
--- a/docs/source/_templates/mg_theme/theme.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-[theme]
-inherit = basic
-stylesheet = default.css
-pygments_style = sphinx
-
-[options]
-rightsidebar = false
-stickysidebar = false
-collapsiblesidebar = false
-externalrefs = false
-
-footerbgcolor = #b11818
-footertextcolor = #ffffff
-sidebarbgcolor = #6a0000
-sidebartextcolor = #ffffff
-sidebarlinkcolor = #98dbcc
-relbarbgcolor = #b11818
-relbartextcolor = #ffffff
-relbarlinkcolor = #ffffff
-bgcolor = #ffffff
-textcolor = #000000
-headbgcolor = #fdeded
-headtextcolor = #20435c
-headlinkcolor = #c60f0f
-linkcolor = #355f7c
-visitedlinkcolor = #355f7c
-codebgcolor = #eeffcc
-codetextcolor = #333333
-
-bodyfont = sans-serif
-headfont = 'Trebuchet MS', sans-serif
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 7ea3a340..3014e592 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -28,7 +28,7 @@ sys.path.insert(0, os.path.abspath('.'))
extensions = ["mgext.youcanhelp"]
# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+templates_path = ['source/_templates']
# The suffix of source filenames.
source_suffix = '.rst'
@@ -48,9 +48,9 @@ copyright = u'2011, Free Software Foundation, Inc and contributors'
# built documents.
#
# The short X.Y version.
-version = '0.0.5'
+version = '0.3.0'
# The full version, including alpha/beta/rc tags.
-release = '0.0.5'
+release = '0.3.0-dev'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -91,7 +91,8 @@ pygments_style = 'sphinx'
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
-html_theme = 'default'
+# html_theme = 'default'
+html_theme = 'mg'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
@@ -99,7 +100,7 @@ html_theme = 'default'
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
+html_theme_path = ['themes']
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
@@ -110,7 +111,7 @@ html_theme = 'default'
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
-#html_logo = None
+html_logo = 'logo_docs.png'
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
diff --git a/docs/source/configuration.rst b/docs/source/configuration.rst
index 093f492c..1e22ad2d 100644
--- a/docs/source/configuration.rst
+++ b/docs/source/configuration.rst
@@ -19,13 +19,13 @@ mediagoblin.ini
tweak settings for MediaGoblin, you'll usually tweak them here.
paste.ini
- This is primarily a server configuration file, on the python side
- (specifically, on the wsgi side, via `paste deploy
+ This is primarily a server configuration file, on the Python side
+ (specifically, on the WSGI side, via `paste deploy
<http://pythonpaste.org/deploy/>`_ / `paste script
<http://pythonpaste.org/script/>`_). It also sets up some
middleware that you can mostly ignore, except to configure
sessions... more on that later. If you are adding a different
- python server other than fastcgi / plain http, you might configure
+ Python server other than fastcgi / plain HTTP, you might configure
it here. You probably won't need to change this file very much.
@@ -47,19 +47,23 @@ Let's assume you're doing the virtualenv setup described elsewhere in this
manual, and you need to make local tweaks to the config files. How do you do
that? Let's see.
-To make changes to mediagoblin.ini:
+To make changes to mediagoblin.ini ::
- cp mediagoblin.ini mediagoblin_local.ini
+ cp mediagoblin.ini mediagoblin_local.ini
-To make changes to paste.ini:
- cp paste.ini paste_local.ini
+To make changes to paste.ini ::
+
+ cp paste.ini paste_local.ini
From here you should be able to make direct adjustments to the files,
and most of the commands described elsewhere in this manual will "notice"
your local config files and use those instead of the non-local version.
-(Note that all commands provide a way to pass in a specific config
-file also, usually by a -cf flag.)
+.. note::
+
+ Note that all commands provide a way to pass in a specific config
+ file also, usually by a ``-cf`` flag.
+
Common changes
==============
@@ -69,9 +73,9 @@ Enabling email notifications
You'll almost certainly want to enable sending emails. By default,
MediaGoblin doesn't really do this... for the sake of developer
-convenience, it runs in "email debug mode". Change this:
+convenience, it runs in "email debug mode". Change this::
- email_debug_mode = false
+ email_debug_mode = false
You can (and should) change the "from" email address by setting
``email_sender_address``.
@@ -82,21 +86,21 @@ If you have more custom SMTP settings, you also have the following
options at your disposal, which are all optional, and do exactly what
they sound like.
- - email_smtp_host
- - email_smtp_port
- - email_smtp_user
- - email_smtp_pass
+- email_smtp_host
+- email_smtp_port
+- email_smtp_user
+- email_smtp_pass
All other configuration changes
-------------------------------
-To be perfectly honest, there are quite a few options and I'm not
-going to be able to get to documanting them all in time for 0.1.0.
+To be perfectly honest, there are quite a few options and we haven't had
+time to document them all
So here's a cop-out section saying that if you get into trouble, hop
-onto IRC and we'll help you out:
+onto IRC and we'll help you out::
- #mediagoblin on irc.freenode.net
+ #mediagoblin on irc.freenode.net
Celery
======
diff --git a/docs/source/deploying.rst b/docs/source/deploying.rst
index 5f07a1d2..4aded2e6 100644
--- a/docs/source/deploying.rst
+++ b/docs/source/deploying.rst
@@ -11,9 +11,11 @@ it simple with some assumptions and use a setup that combines
mediagoblin + virtualenv + fastcgi + nginx on a .deb or .rpm based
GNU/Linux distro.
-Note: these tools are for administrators wanting to deploy a fresh
-install. If instead you want to join in as a contributor, see our
-`Hacking HOWTO <http://wiki.mediagoblin.org/HackingHowto>`_ instead.
+.. note::
+
+ These tools are for site administrators wanting to deploy a fresh
+ install. If instead you want to join in as a contributor, see our
+ `Hacking HOWTO <http://wiki.mediagoblin.org/HackingHowto>`_ instead.
Prepare System
--------------
@@ -33,12 +35,15 @@ MediaGoblin has the following core dependencies:
On a DEB-based system (e.g Debian, gNewSense, Trisquel, Ubuntu, and
derivatives) issue the following command: ::
- sudo apt-get install mongodb git-core python python-dev python-lxml python-imaging python-virtualenv
+ sudo apt-get install mongodb git-core python python-dev python-lxml \
+ python-imaging python-virtualenv
On a RPM-based system (e.g. Fedora, RedHat, and derivatives) issue the
following command: ::
- yum install mongodb-server python-paste-deploy python-paste-script git-core python python-devel python-lxml python-imaging python-virtualenv
+ yum install mongodb-server python-paste-deploy python-paste-script \
+ git-core python python-devel python-lxml python-imaging \
+ python-virtualenv
Configure MongoDB
~~~~~~~~~~~~~~~~~
@@ -46,10 +51,11 @@ Configure MongoDB
After installing MongoDB some preliminary database configuration may
be necessary.
-Ensure that MongoDB `journaling <http://www.mongodb.org/display/DOCS/Journaling>`_
-is enabled. Journaling is enabled by default in version 2.0 and later
-64-bit MongoDB instances. Check your deployment, and consider enabling
-journaling if you're running 32-bit systems or earlier version.
+Ensure that MongoDB `journaling
+<http://www.mongodb.org/display/DOCS/Journaling>`_ is enabled. Journaling
+is enabled by default in version 2.0 and later 64-bit MongoDB instances.
+Check your deployment, and consider enabling journaling if you're running
+32-bit systems or earlier version.
.. warning::
@@ -77,41 +83,42 @@ create "system account" or dedicated service user. Ensure that it is
not possible to log in to your system with as this user.
You should create a working directory for MediaGoblin. This document
-assumes your local git repository will be located at ``/srv/mediagoblin.example.org/mediagoblin/``
-for this documentation. Substitute your prefer ed local deployment path
-as needed.
+assumes your local git repository will be located at
+``/srv/mediagoblin.example.org/mediagoblin/`` for this documentation.
+Substitute your prefer ed local deployment path as needed.
This document assumes that all operations are performed as this
user. To drop privileges to this user, run the following command: ::
+ su - [mediagoblin]
- su - [mediagoblin]``
-
-Where, "``[mediagoblin]`` is the username of the system user that will
+Where, "``[mediagoblin]``" is the username of the system user that will
run MediaGoblin.
Install MediaGoblin and Virtualenv
----------------------------------
-As of |version|, MediaGoblin has a rapid development pace. As a result
-the following instructions recommend installing from the ``master``
-branch of the git repository. Eventually production deployments will
-want to transition to running from more consistent releases.
+.. note::
+
+ As of |version|, MediaGoblin has a rapid development pace. As a result
+ the following instructions recommend installing from the ``master``
+ branch of the git repository. Eventually production deployments will
+ want to transition to running from more consistent releases.
Issue the following commands, to create and change the working
-directory. Modify these commands to reflect your own environment: ::
+directory. Modify these commands to reflect your own environment::
- mkdir -p /srv/mediagoblin.example.org/
- cd /srv/mediagoblin.example.org/
+ mkdir -p /srv/mediagoblin.example.org/
+ cd /srv/mediagoblin.example.org/
-Clone the MediaGoblin repository: ::
+Clone the MediaGoblin repository::
- git clone git://gitorious.org/mediagoblin/mediagoblin.git
+ git clone git://gitorious.org/mediagoblin/mediagoblin.git
-And setup the in-package virtualenv: ::
+And setup the in-package virtualenv::
- cd mediagoblin
- virtualenv . && ./bin/python setup.py develop
+ cd mediagoblin
+ virtualenv . && ./bin/python setup.py develop
.. note::
@@ -127,11 +134,16 @@ more reliable and considerably easier to configure and illustrate. If
you're familiar with Python packaging you may consider deploying with
your preferred the method.
+Assuming you are going to deploy with FastCGI, you should also install
+flup::
+
+ ./bin/easy_install flup
+
This concludes the initial configuration of the development
environment. In the future, if at any point you want update your
-codebase, you should also run: ::
+codebase, you should also run::
- ./bin/python setup.py develop --upgrade && ./bin/gmg migrate.
+ ./bin/python setup.py develop --upgrade && ./bin/gmg migrate.
Deploy MediaGoblin Services
---------------------------
@@ -140,9 +152,9 @@ Test the Server
~~~~~~~~~~~~~~~
At this point MediaGoblin should be properly installed. You can
-test the deployment with the following command: ::
+test the deployment with the following command::
- ./lazyserver.sh --server-name=broadcast
+ ./lazyserver.sh --server-name=broadcast
You should be able to connect to the machine on port 6543 in your
browser to confirm that the service is operable.
@@ -151,7 +163,7 @@ Connect the Webserver to MediaGoblin with FastCGI
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This section describes how to configure MediaGoblin to work via
-fastcgi. Our configuration example will use nginx, however, you may
+FastCGI. Our configuration example will use nginx, however, you may
use any webserver of your choice as long as it supports the FastCGI
protocol. If you do not already have a web server, consider nginx, as
the configuration files may be more clear than the
@@ -161,94 +173,85 @@ Create a configuration file at
``/srv/mediagoblin.example.org/nginx.conf`` and create a symbolic link
into a directory that will be included in your ``nginx`` configuration
(e.g. "``/etc/nginx/sites-enabled`` or ``/etc/nginx/conf.d``) with
-one of the following commands (as the root user:) ::
+one of the following commands (as the root user)::
- ln -s /srv/mediagoblin.example.org/nginx.conf /etc/nginx/conf.d/
- ln -s /srv/mediagoblin.example.org/nginx.conf /etc/nginx/sites-enabled/
+ ln -s /srv/mediagoblin.example.org/nginx.conf /etc/nginx/conf.d/
+ ln -s /srv/mediagoblin.example.org/nginx.conf /etc/nginx/sites-enabled/
Modify these commands and locations depending on your preferences and
the existing configuration of your nginx instance. The contents of
-this ``nginx.conf`` file should be modeled on the following: ::
-
- server {
- #################################################
- # Stock useful config options, but ignore them :)
- #################################################
- include /etc/nginx/mime.types;
-
- autoindex off;
- default_type application/octet-stream;
- sendfile on;
-
- # Gzip
- gzip on;
- gzip_min_length 1024;
- gzip_buffers 4 32k;
- gzip_types text/plain text/html application/x-javascript text/javascript text/xml text/css;
-
- #####################################
- # Mounting MediaGoblin stuff
- # This is the section you should read
- #####################################
-
- server_name mediagoblin.example.org www.mediagoblin.example.org;
- access_log /var/log/nginx/mediagoblin.example.access.log;
- error_log /var/log/nginx/mediagoblin.example.error.log;
-
- # MediaGoblin's stock static files: CSS, JS, etc.
- location /mgoblin_static/ {
- alias /srv/mediagoblin.example.org/mediagoblin/static/;
- }
-
- # Instance specific media:
- location /mgoblin_media/ {
- alias /srv/mediagoblin.example.org/mediagoblin/user_dev/media/public/;
- }
-
- # Mounting MediaGoblin itself via fastcgi.
- location / {
- fastcgi_pass 127.0.0.1:26543;
- include /etc/nginx/fastcgi_params;
- }
+this ``nginx.conf`` file should be modeled on the following::
+
+ server {
+ #################################################
+ # Stock useful config options, but ignore them :)
+ #################################################
+ include /etc/nginx/mime.types;
+
+ autoindex off;
+ default_type application/octet-stream;
+ sendfile on;
+
+ # Gzip
+ gzip on;
+ gzip_min_length 1024;
+ gzip_buffers 4 32k;
+ gzip_types text/plain text/html application/x-javascript text/javascript text/xml text/css;
+
+ #####################################
+ # Mounting MediaGoblin stuff
+ # This is the section you should read
+ #####################################
+
+ # Change this to update the upload size limit for your users
+ client_max_body_size 8m;
+
+ server_name mediagoblin.example.org www.mediagoblin.example.org;
+ access_log /var/log/nginx/mediagoblin.example.access.log;
+ error_log /var/log/nginx/mediagoblin.example.error.log;
+
+ # MediaGoblin's stock static files: CSS, JS, etc.
+ location /mgoblin_static/ {
+ alias /srv/mediagoblin.example.org/mediagoblin/mediagoblin/static/;
+ }
+
+ # Instance specific media:
+ location /mgoblin_media/ {
+ alias /srv/mediagoblin.example.org/mediagoblin/user_dev/media/public/;
+ }
+
+ # Mounting MediaGoblin itself via FastCGI.
+ location / {
+ fastcgi_pass 127.0.0.1:26543;
+ include /etc/nginx/fastcgi_params;
+
+ # our understanding vs nginx's handling of script_name vs
+ # path_info don't match :)
+ fastcgi_param PATH_INFO $fastcgi_script_name;
+ fastcgi_param SCRIPT_NAME "";
}
+ }
Now, nginx instance is configured to serve the MediaGoblin
application. Perform a quick test to ensure that this configuration
works. Restart nginx so it picks up your changes, with a command that
-resembles one of the following (as the root user:) ::
+resembles one of the following (as the root user)::
- sudo /etc/init.d/nginx restart
- sudo /etc/rc.d/nginx restart
+ sudo /etc/init.d/nginx restart
+ sudo /etc/rc.d/nginx restart
Now start MediaGoblin. Use the following command sequence as an
-example: ::
+example::
- cd /srv/mediagoblin.example.org/mediagoblin/
- ./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543
+ cd /srv/mediagoblin.example.org/mediagoblin/
+ ./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543
Visit the site you've set up in your browser by visiting
<http://mediagobilin.example.org>. You should see MediaGoblin!
-Production MediaGoblin Deployments with Paste
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The instance configured with ``lazyserver`` is not ideal for a
-production MediaGoblin deployment. Ideally, you should be able to use
-a a control script (i.e. init script.) to launch and restart the
-MediaGoblin process.
-
-Use the following command as the basis for such a script: ::
-
- CELERY_ALWAYS_EAGER=true \
- /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \
- /srv/mediagoblin.example.org/mediagoblin/paste.ini \
- --pid-file=/tmp/mediagoblin.pid \
- --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 \
-
.. note::
- The above configuration places MediaGoblin in "always eager" mode
- with Celery. This is fine for development and smaller
- deployments. However, if you're getting into the really large
- deployment category, consider reading the section of this manual on
- Celery.
+ The configuration described above is sufficient for development and
+ smaller deployments. However, for larger production deployments
+ with larger processing requirements, see the
+ ":doc:`production-deployments`" documentation.
diff --git a/docs/source/foreword.rst b/docs/source/foreword.rst
index 835a7e7a..aa27647f 100644
--- a/docs/source/foreword.rst
+++ b/docs/source/foreword.rst
@@ -5,14 +5,14 @@ Foreword
About the MediaGoblin Manual
============================
-This is the user manual for MediaGoblin. It covers how to set up and
-configure MediaGoblin and the kind of information that someone running
-MediaGoblin would need to know.
+This is the site administrator manual for MediaGoblin. It covers how
+to set up and configure MediaGoblin and the kind of information that
+someone running MediaGoblin would need to know.
We have other documentation at:
* http://mediagoblin.org/join/ for general "join us" information
-* http://wiki.mediagoblin.org/ for our contributor-focused wiki
+* http://wiki.mediagoblin.org/ for our contributor/developer-focused wiki
Improving the MediaGobiin Manual
diff --git a/docs/source/index.rst b/docs/source/index.rst
index e9f3993e..f9c9285d 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -14,7 +14,9 @@ Table of Contents:
foreword
about
deploying
+ production-deployments
configuration
+ media-types
help
theming
codebase
diff --git a/docs/source/media-types.rst b/docs/source/media-types.rst
new file mode 100644
index 00000000..76478143
--- /dev/null
+++ b/docs/source/media-types.rst
@@ -0,0 +1,34 @@
+.. _media-types-chapter:
+
+====================
+Enabling Media Types
+====================
+
+In the future, there will be all sorts of media types you can enable,
+but in the meanwhile there's only one additional media type: video.
+
+First, you should probably read ":doc:`configuration`" to make sure
+you know how to modify the mediagoblin config file.
+
+Video
+=====
+
+To enable video, first install gstreamer and the python-gstreamer
+bindings (as well as whatever gstremaer extensions you want,
+good/bad/ugly). On Debianoid systems::
+
+ sudo apt-get install python-gst0.10
+
+Next, modify (and possibly copy over from ``mediagoblin.ini``) your
+``mediagoblin_local.ini``. Uncomment this line in the ``[mediagoblin]``
+section::
+
+ media_types = mediagoblin.media_types.image, mediagoblin.media_types.video
+
+Now you should be able to submit videos, and mediagoblin should
+transcode them.
+
+Note that you almost certainly want to separate Celery from the normal
+paste process or your users will probably find that their connections
+time out as the video transcodes. To set that up, check out the
+":doc:`production-deployments`" section of this manual.
diff --git a/docs/source/production-deployments.rst b/docs/source/production-deployments.rst
new file mode 100644
index 00000000..ef0bcad6
--- /dev/null
+++ b/docs/source/production-deployments.rst
@@ -0,0 +1,81 @@
+=========================================
+Considerations for Production Deployments
+=========================================
+
+This document contains a number of suggestions for deploying
+MediaGoblin in actual production environments. Consider
+":doc:`deploying`" for a basic overview of how to deploy MediaGoblin.
+
+Deploy with Paste
+-----------------
+
+The instance configured with ``./lazyserver.sh`` is not ideal for a
+production MediaGoblin deployment. Ideally, you should be able to use
+an "init" or "control" script to launch and restart the MediaGoblin
+process.
+
+Use the following command as the basis for such a script: ::
+
+ CELERY_ALWAYS_EAGER=true \
+ /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \
+ /srv/mediagoblin.example.org/mediagoblin/paste.ini \
+ --pid-file=/var/run/mediagoblin.pid \
+ --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543
+
+The above configuration places MediaGoblin in "always eager" mode
+with Celery, this means that submissions of content will be processed
+synchronously, and the user will advance to the next page only after
+processing is complete. If we take Celery out of "always eager mode,"
+the user will be able to immediately return to the MediaGoblin site
+while processing is ongoing. In these cases, use the following command
+as the basis for your script: ::
+
+ CELERY_ALWAYS_EAGER=false \
+ /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \
+ /srv/mediagoblin.example.org/mediagoblin/paste.ini \
+ --pid-file=/var/run/mediagoblin.pid \
+ --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543
+
+Separate Celery
+---------------
+
+While the ``./lazyserer.sh`` configuration provides an efficient way to
+start using a MediaGoblin instance, it is not suitable for production
+deployments for several reasons:
+
+In nearly every scenario, work on the Celery queue will need to
+balance with the demands of other processes, and cannot proceed
+synchronously. This is a particularly relevant problem if you use
+MediaGoblin to host video content. Processing with Celery ought to be
+operationally separate from the MediaGoblin application itself, this
+simplifies management and support better workload distribution.
+
+Basically, if you're doing anything beyond a trivial workload, such as
+image hosting for a small set of users, or have limited media types
+such as "ASCII art" or icon sharing, you will need to run ``celeryd``
+as a separate process.
+
+Build an :ref:`init script <init-script>` around the following
+command::
+
+ CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery ./bin/celeryd
+
+Modify your existing MediaGoblin and application init scripts, if
+necessary, to prevent them from starting their own ``celeryd``
+processes.
+
+.. _init-script:
+
+Use an Init Script
+------------------
+
+Look in your system's ``/etc/init.d/`` or ``/etc/rc.d/`` directory for
+examples of how to build scripts that will start, stop, and restart
+MediaGoblin and Celery. These scripts will vary by
+distribution/operating system. In the future, MediaGoblin will provide
+example scripts as examples.
+
+.. TODO insert init script here
+.. TODO are additional concerns ?
+ .. Other Concerns
+ .. --------------
diff --git a/docs/source/themes/mg/layout.html b/docs/source/themes/mg/layout.html
new file mode 100644
index 00000000..891ed64c
--- /dev/null
+++ b/docs/source/themes/mg/layout.html
@@ -0,0 +1,29 @@
+{#
+ default/layout.html
+ ~~~~~~~~~~~~~~~~~~~
+
+ Sphinx layout template for the default theme.
+
+ :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{% extends "basic/layout.html" %}
+
+{% if theme_collapsiblesidebar|tobool %}
+{% set script_files = script_files + ['_static/sidebar.js'] %}
+{% endif %}
+
+{%- block footer %}
+ <div class="footer">
+ <div>
+
+MediaGoblin documentation released into the public domain via <a href="http://creativecommons.org/publicdomain/zero/1.0/">CC0</a>.
+
+ {%- if last_updated %}
+ {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
+ {%- endif %}
+
+ {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
+ </div>
+ </div>
+{%- endblock %}
diff --git a/docs/source/themes/mg/static/fonts/Lato-Bold.ttf b/docs/source/themes/mg/static/fonts/Lato-Bold.ttf
new file mode 100644
index 00000000..bc3529fc
--- /dev/null
+++ b/docs/source/themes/mg/static/fonts/Lato-Bold.ttf
Binary files differ
diff --git a/docs/source/themes/mg/static/fonts/Lato-BoldItalic.ttf b/docs/source/themes/mg/static/fonts/Lato-BoldItalic.ttf
new file mode 100644
index 00000000..2cf5ae0d
--- /dev/null
+++ b/docs/source/themes/mg/static/fonts/Lato-BoldItalic.ttf
Binary files differ
diff --git a/docs/source/themes/mg/static/fonts/Lato-Italic.ttf b/docs/source/themes/mg/static/fonts/Lato-Italic.ttf
new file mode 100644
index 00000000..11ca3eb6
--- /dev/null
+++ b/docs/source/themes/mg/static/fonts/Lato-Italic.ttf
Binary files differ
diff --git a/docs/source/themes/mg/static/fonts/Lato-Regular.ttf b/docs/source/themes/mg/static/fonts/Lato-Regular.ttf
new file mode 100644
index 00000000..26ce1002
--- /dev/null
+++ b/docs/source/themes/mg/static/fonts/Lato-Regular.ttf
Binary files differ
diff --git a/docs/source/themes/mg/static/fonts/OFL_1.1.txt b/docs/source/themes/mg/static/fonts/OFL_1.1.txt
new file mode 100644
index 00000000..f1a20ac1
--- /dev/null
+++ b/docs/source/themes/mg/static/fonts/OFL_1.1.txt
@@ -0,0 +1,97 @@
+Copyright (c) <dates>, <Copyright Holder> (<URL|email>),
+with Reserved Font Name <Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>),
+with Reserved Font Name <additional Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>).
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/docs/source/themes/mg/static/logo_docs.png b/docs/source/themes/mg/static/logo_docs.png
new file mode 100644
index 00000000..99f04cc7
--- /dev/null
+++ b/docs/source/themes/mg/static/logo_docs.png
Binary files differ
diff --git a/docs/source/themes/mg/static/mg.css b/docs/source/themes/mg/static/mg.css
new file mode 100644
index 00000000..96344df4
--- /dev/null
+++ b/docs/source/themes/mg/static/mg.css
@@ -0,0 +1,161 @@
+/*
+
+MediaGoblin theme - MediaGoblin-style Sphinx documentation theme
+
+Written in 2012 by Jef van Schendel <mail@jefvanschendel.nl>
+
+To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.
+
+You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
+
+*/
+
+@import url("basic.css");
+
+/* text fonts and styles */
+
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Lato Bold'), local('Lato-Bold'), url('fonts/Lato-Bold.ttf') format('truetype');
+}
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 400;
+ src: local('Lato Italic'), local('Lato-Italic'), url('fonts/Lato-Italic.ttf') format('truetype');
+}
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 700;
+ src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url('fonts/Lato-BoldItalic.ttf') format('truetype');
+}
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Lato Regular'), local('Lato-Regular'), url('fonts/Lato-Regular.ttf') format('truetype');
+}
+
+body {
+ font: 16px 'Lato',Helvetica,Arial,sans-serif;
+ background-color: #FCFCFC;
+ color: #3C3C3C;
+ margin: 0;
+ padding: 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ border-bottom: 1px solid #CCCCCC;
+ background: none;
+ color: black;
+ font-weight: bold;
+ padding-bottom: 0.17em;
+ padding-top: 0.5em;
+}
+
+h1 {
+ font-size: 1.875em;
+}
+
+h2 {
+ font-size: 1.375em;
+}
+
+h3, h4, h5, h6 {
+ font-size: 1.125em;
+}
+
+p {
+ font-weight: normal;
+ margin: 0.4em 0 0.5em;
+}
+
+a {
+ color: #499776;
+}
+
+a:visited {
+ color: #2A5744;
+}
+
+a:active {
+ color: #65D1A3;
+}
+
+h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
+ text-decoration: none;
+}
+
+div.topic, pre {
+ background-color: #F1F1F1;
+ border: 1px dashed #ccc;
+ color: black;
+ line-height: 1.1em;
+ padding: 1em;
+}
+
+code, tt {
+ font: 14px monospace,"Courier New";
+ background-color: #FFFFDD;
+ border: thin solid #bbb;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+pre {
+ font: 14px monospace,"Courier New";
+}
+
+div.related a, div.related a:visited, div.related a:active {
+ color: #86D4B1;
+}
+
+/* layout */
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 270px;
+}
+
+div.body {
+ padding: 0 20px 30px 20px;
+}
+
+div.footer {
+ width: 100%;
+ padding: 9px 0 9px 0;
+ text-align: center;
+ font-size: 75%;
+}
+
+div.sphinxsidebar {
+ width: 240px;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 30px;
+}
+
+div.sphinxsidebar ul {
+ margin: 10px 10px 10px 0;
+ padding: 0;
+}
+
+div.related {
+ line-height: 30px;
+ font-size: 90%;
+ width: 100%;
+ background-color: #161616;
+ color: #C3C3C3;
+}
+
+p.logo {
+ margin-top: 30px;
+}
diff --git a/docs/source/themes/mg/theme.conf b/docs/source/themes/mg/theme.conf
new file mode 100644
index 00000000..dd58038a
--- /dev/null
+++ b/docs/source/themes/mg/theme.conf
@@ -0,0 +1,5 @@
+[theme]
+inherit = basic
+stylesheet = mg.css
+pygments_style = sphinx
+
diff --git a/extlib/960.gs/960_16_col.css b/extlib/960.gs/960_16_col.css
deleted file mode 100644
index faa6d8b2..00000000
--- a/extlib/960.gs/960_16_col.css
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- 960 Grid System ~ Core CSS.
- Learn more ~ http://960.gs/
-
- Licensed under GPL and MIT.
-*/
-
-/*
- Forces backgrounds to span full width,
- even if there is horizontal scrolling.
- Increase this if your layout is wider.
-
- Note: IE6 works fine without this fix.
-*/
-
-body {
- min-width: 960px;
-}
-
-/* Container
-----------------------------------------------------------------------------------------------------*/
-
-.container_16 {
- margin-left: auto;
- margin-right: auto;
- width: 960px;
-}
-
-/* Grid >> Global
-----------------------------------------------------------------------------------------------------*/
-
-.grid_1,
-.grid_2,
-.grid_3,
-.grid_4,
-.grid_5,
-.grid_6,
-.grid_7,
-.grid_8,
-.grid_9,
-.grid_10,
-.grid_11,
-.grid_12,
-.grid_13,
-.grid_14,
-.grid_15,
-.grid_16 {
- display: inline;
- float: left;
- position: relative;
- margin-left: 10px;
- margin-right: 10px;
-}
-
-.push_1, .pull_1,
-.push_2, .pull_2,
-.push_3, .pull_3,
-.push_4, .pull_4,
-.push_5, .pull_5,
-.push_6, .pull_6,
-.push_7, .pull_7,
-.push_8, .pull_8,
-.push_9, .pull_9,
-.push_10, .pull_10,
-.push_11, .pull_11,
-.push_12, .pull_12,
-.push_13, .pull_13,
-.push_14, .pull_14,
-.push_15, .pull_15,
-.push_16, .pull_16 {
- position: relative;
-}
-
-/* Grid >> Children (Alpha ~ First, Omega ~ Last)
-----------------------------------------------------------------------------------------------------*/
-
-.alpha {
- margin-left: 0;
-}
-
-.omega {
- margin-right: 0;
-}
-
-/* Grid >> 16 Columns
-----------------------------------------------------------------------------------------------------*/
-
-.container_16 .grid_1 {
- width: 40px;
-}
-
-.container_16 .grid_2 {
- width: 100px;
-}
-
-.container_16 .grid_3 {
- width: 160px;
-}
-
-.container_16 .grid_4 {
- width: 220px;
-}
-
-.container_16 .grid_5 {
- width: 280px;
-}
-
-.container_16 .grid_6 {
- width: 340px;
-}
-
-.container_16 .grid_7 {
- width: 400px;
-}
-
-.container_16 .grid_8 {
- width: 460px;
-}
-
-.container_16 .grid_9 {
- width: 520px;
-}
-
-.container_16 .grid_10 {
- width: 580px;
-}
-
-.container_16 .grid_11 {
- width: 640px;
-}
-
-.container_16 .grid_12 {
- width: 700px;
-}
-
-.container_16 .grid_13 {
- width: 760px;
-}
-
-.container_16 .grid_14 {
- width: 820px;
-}
-
-.container_16 .grid_15 {
- width: 880px;
-}
-
-.container_16 .grid_16 {
- width: 940px;
-}
-
-/* Prefix Extra Space >> 16 Columns
-----------------------------------------------------------------------------------------------------*/
-
-.container_16 .prefix_1 {
- padding-left: 60px;
-}
-
-.container_16 .prefix_2 {
- padding-left: 120px;
-}
-
-.container_16 .prefix_3 {
- padding-left: 180px;
-}
-
-.container_16 .prefix_4 {
- padding-left: 240px;
-}
-
-.container_16 .prefix_5 {
- padding-left: 300px;
-}
-
-.container_16 .prefix_6 {
- padding-left: 360px;
-}
-
-.container_16 .prefix_7 {
- padding-left: 420px;
-}
-
-.container_16 .prefix_8 {
- padding-left: 480px;
-}
-
-.container_16 .prefix_9 {
- padding-left: 540px;
-}
-
-.container_16 .prefix_10 {
- padding-left: 600px;
-}
-
-.container_16 .prefix_11 {
- padding-left: 660px;
-}
-
-.container_16 .prefix_12 {
- padding-left: 720px;
-}
-
-.container_16 .prefix_13 {
- padding-left: 780px;
-}
-
-.container_16 .prefix_14 {
- padding-left: 840px;
-}
-
-.container_16 .prefix_15 {
- padding-left: 900px;
-}
-
-/* Suffix Extra Space >> 16 Columns
-----------------------------------------------------------------------------------------------------*/
-
-.container_16 .suffix_1 {
- padding-right: 60px;
-}
-
-.container_16 .suffix_2 {
- padding-right: 120px;
-}
-
-.container_16 .suffix_3 {
- padding-right: 180px;
-}
-
-.container_16 .suffix_4 {
- padding-right: 240px;
-}
-
-.container_16 .suffix_5 {
- padding-right: 300px;
-}
-
-.container_16 .suffix_6 {
- padding-right: 360px;
-}
-
-.container_16 .suffix_7 {
- padding-right: 420px;
-}
-
-.container_16 .suffix_8 {
- padding-right: 480px;
-}
-
-.container_16 .suffix_9 {
- padding-right: 540px;
-}
-
-.container_16 .suffix_10 {
- padding-right: 600px;
-}
-
-.container_16 .suffix_11 {
- padding-right: 660px;
-}
-
-.container_16 .suffix_12 {
- padding-right: 720px;
-}
-
-.container_16 .suffix_13 {
- padding-right: 780px;
-}
-
-.container_16 .suffix_14 {
- padding-right: 840px;
-}
-
-.container_16 .suffix_15 {
- padding-right: 900px;
-}
-
-/* Push Space >> 16 Columns
-----------------------------------------------------------------------------------------------------*/
-
-.container_16 .push_1 {
- left: 60px;
-}
-
-.container_16 .push_2 {
- left: 120px;
-}
-
-.container_16 .push_3 {
- left: 180px;
-}
-
-.container_16 .push_4 {
- left: 240px;
-}
-
-.container_16 .push_5 {
- left: 300px;
-}
-
-.container_16 .push_6 {
- left: 360px;
-}
-
-.container_16 .push_7 {
- left: 420px;
-}
-
-.container_16 .push_8 {
- left: 480px;
-}
-
-.container_16 .push_9 {
- left: 540px;
-}
-
-.container_16 .push_10 {
- left: 600px;
-}
-
-.container_16 .push_11 {
- left: 660px;
-}
-
-.container_16 .push_12 {
- left: 720px;
-}
-
-.container_16 .push_13 {
- left: 780px;
-}
-
-.container_16 .push_14 {
- left: 840px;
-}
-
-.container_16 .push_15 {
- left: 900px;
-}
-
-/* Pull Space >> 16 Columns
-----------------------------------------------------------------------------------------------------*/
-
-.container_16 .pull_1 {
- left: -60px;
-}
-
-.container_16 .pull_2 {
- left: -120px;
-}
-
-.container_16 .pull_3 {
- left: -180px;
-}
-
-.container_16 .pull_4 {
- left: -240px;
-}
-
-.container_16 .pull_5 {
- left: -300px;
-}
-
-.container_16 .pull_6 {
- left: -360px;
-}
-
-.container_16 .pull_7 {
- left: -420px;
-}
-
-.container_16 .pull_8 {
- left: -480px;
-}
-
-.container_16 .pull_9 {
- left: -540px;
-}
-
-.container_16 .pull_10 {
- left: -600px;
-}
-
-.container_16 .pull_11 {
- left: -660px;
-}
-
-.container_16 .pull_12 {
- left: -720px;
-}
-
-.container_16 .pull_13 {
- left: -780px;
-}
-
-.container_16 .pull_14 {
- left: -840px;
-}
-
-.container_16 .pull_15 {
- left: -900px;
-}
-
-/* `Clear Floated Elements
-----------------------------------------------------------------------------------------------------*/
-
-/* http://sonspring.com/journal/clearing-floats */
-
-.clear {
- clear: both;
- display: block;
- overflow: hidden;
- visibility: hidden;
- width: 0;
- height: 0;
-}
-
-/* http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-demystified */
-
-.clearfix:before,
-.clearfix:after,
-.container_16:before,
-.container_16:after {
- content: '.';
- display: block;
- overflow: hidden;
- visibility: hidden;
- font-size: 0;
- line-height: 0;
- width: 0;
- height: 0;
-}
-
-.clearfix:after,
-.container_16:after {
- clear: both;
-}
-
-/*
- The following zoom:1 rule is specifically for IE6 + IE7.
- Move to separate stylesheet if invalid CSS is a problem.
-*/
-
-.clearfix,
-.container_16 {
- zoom: 1;
-} \ No newline at end of file
diff --git a/extlib/960.gs/README.txt b/extlib/960.gs/README.txt
deleted file mode 100755
index da0ea86f..00000000
--- a/extlib/960.gs/README.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-===============
-960 GRID SYSTEM
-===============
-
-Created by Nathan Smith. See the official site for more info: http://960.gs/
-
-============================================================================
-
-To install the Adobe Fireworks extension, simply double-click the *.mxp file
-included in the /fireworks_extension directory. If you are running Windows 7
-you will need admin permissions in order to install this extension properly.
-
-============================================================================
-
-Thank you for downloading the 960 Grid System. I hope it helps to streamline
-web development workflow. Enclosed in the bundle are printable sketch sheets
-and template files for Adobe Fireworks and Photoshop, OmniGraffle and Visio.
-
-Also included is a lightweight CSS file, which contains the grid dimensions.
-To use this file, simply include the 960.css in the <head> of the HTML page.
-You may also use the reset.css and text.css files, or opt to leave them out.
-Here is an example of the XHTML code necessary to incorporate the CSS files:
-
-<head>
-<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" />
-<link rel="stylesheet" type="text/css" media="all" href="css/text.css" />
-<link rel="stylesheet" type="text/css" media="all" href="css/960.css" />
-</head>
-
-It is worth noting that these styles do not automatically make up a finished
-site design. They are simply a starting point, ideally for rapid prototyping
-or as a basis for creating your own designs. You should not feel constrained
-by the way I have built the initial code. If you disagree with how something
-has been done, feel free to revise it for the needs of your particular site.
-
-The files in the 960 Grid System are free of charge, licensed under MIT/GPL.
-
-============================================================================
-
-Note that if you are building a site in a language which reads from right to
-left, use the CSS files that end in "_rtl.css" instead. Denote the language:
-
-<html lang="..." dir="rtl">
-
-Be sure to replace "..." with the appropriate two-letter abbreviation of the
-language you are using. Example: lang="he" for Hebrew, lang="ar" for Arabic.
-
-============================================================================
-
-GPL license:
-http://www.gnu.org/licenses/gpl.html
-
-MIT license:
-http://www.opensource.org/licenses/mit-license.php \ No newline at end of file
diff --git a/extlib/960.gs/reset.css b/extlib/960.gs/reset.css
deleted file mode 100644
index 87b7f368..00000000
--- a/extlib/960.gs/reset.css
+++ /dev/null
@@ -1,202 +0,0 @@
-/* `XHTML, HTML4, HTML5 Reset
-----------------------------------------------------------------------------------------------------*/
-
-a,
-abbr,
-acronym,
-address,
-applet,
-article,
-aside,
-audio,
-b,
-big,
-blockquote,
-body,
-canvas,
-caption,
-center,
-cite,
-code,
-dd,
-del,
-details,
-dfn,
-dialog,
-div,
-dl,
-dt,
-em,
-embed,
-fieldset,
-figcaption,
-figure,
-font,
-footer,
-form,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-header,
-hgroup,
-hr,
-html,
-i,
-iframe,
-img,
-ins,
-kbd,
-label,
-legend,
-li,
-mark,
-menu,
-meter,
-nav,
-object,
-ol,
-output,
-p,
-pre,
-progress,
-q,
-rp,
-rt,
-ruby,
-s,
-samp,
-section,
-small,
-span,
-strike,
-strong,
-sub,
-summary,
-sup,
-table,
-tbody,
-td,
-tfoot,
-th,
-thead,
-time,
-tr,
-tt,
-u,
-ul,
-var,
-video,
-xmp {
- border: 0;
- margin: 0;
- padding: 0;
- font-size: 100%;
-}
-
-html,
-body {
- height: 100%;
-}
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-menu,
-nav,
-section {
-/*
- Override the default (display: inline) for
- browsers that do not recognize HTML5 tags.
-
- IE8 (and lower) requires a shiv:
- http://ejohn.org/blog/html5-shiv
-*/
- display: block;
-}
-
-b,
-strong {
-/*
- Makes browsers agree.
- IE + Opera = font-weight: bold.
- Gecko + WebKit = font-weight: bolder.
-*/
- font-weight: bold;
-}
-
-img {
- color: transparent;
- font-size: 0;
- vertical-align: middle;
-/*
- For IE.
- http://css-tricks.com/ie-fix-bicubic-scaling-for-images
-*/
- -ms-interpolation-mode: bicubic;
-}
-
-li {
-/*
- For IE6 + IE7.
-*/
- display: list-item;
-}
-
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-th,
-td,
-caption {
- font-weight: normal;
- vertical-align: top;
- text-align: left;
-}
-
-q {
- quotes: none;
-}
-
-q:before,
-q:after {
- content: '';
- content: none;
-}
-
-sub,
-sup,
-small {
- font-size: 75%;
-}
-
-sub,
-sup {
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-sup {
- top: -0.5em;
-}
-
-svg {
-/*
- For IE9.
-*/
- overflow: hidden;
-} \ No newline at end of file
diff --git a/extlib/960.gs/text.css b/extlib/960.gs/text.css
deleted file mode 100644
index 1a6b302f..00000000
--- a/extlib/960.gs/text.css
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- 960 Grid System ~ Text CSS.
- Learn more ~ http://960.gs/
-
- Licensed under GPL and MIT.
-*/
-
-/* `Basic HTML
-----------------------------------------------------------------------------------------------------*/
-
-body {
- font: 13px/1.5 'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;
-}
-
-pre,
-code {
- font-family: 'DejaVu Sans Mono', Monaco, Consolas, monospace;
-}
-
-hr {
- border: 0 #ccc solid;
- border-top-width: 1px;
- clear: both;
- height: 0;
-}
-
-/* `Headings
-----------------------------------------------------------------------------------------------------*/
-
-h1 {
- font-size: 25px;
-}
-
-h2 {
- font-size: 23px;
-}
-
-h3 {
- font-size: 21px;
-}
-
-h4 {
- font-size: 19px;
-}
-
-h5 {
- font-size: 17px;
-}
-
-h6 {
- font-size: 15px;
-}
-
-/* `Spacing
-----------------------------------------------------------------------------------------------------*/
-
-ol {
- list-style: decimal;
-}
-
-ul {
- list-style: disc;
-}
-
-li {
- margin-left: 30px;
-}
-
-p,
-dl,
-hr,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-ol,
-ul,
-pre,
-table,
-address,
-fieldset,
-figure {
- margin-bottom: 20px;
-} \ No newline at end of file
diff --git a/extlib/960.gs/MIT.txt b/extlib/html5shiv/MIT.txt
index 5a2aeb47..5a2aeb47 100644
--- a/extlib/960.gs/MIT.txt
+++ b/extlib/html5shiv/MIT.txt
diff --git a/extlib/html5shiv/html5shiv.js b/extlib/html5shiv/html5shiv.js
new file mode 100644
index 00000000..8de0ff54
--- /dev/null
+++ b/extlib/html5shiv/html5shiv.js
@@ -0,0 +1,3 @@
+// HTML5 Shiv v3 | @jon_neal @afarkas @rem | MIT/GPL2 Licensed
+// Uncompressed source: https://github.com/aFarkas/html5shiv
+(function(a,b){var c=function(a){return a.innerHTML="<x-element></x-element>",a.childNodes.length===1}(b.createElement("a")),d=function(a,b,c){return b.appendChild(a),(c=(c?c(a):a.currentStyle).display)&&b.removeChild(a)&&c==="block"}(b.createElement("nav"),b.documentElement,a.getComputedStyle),e={elements:"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),shivDocument:function(a){a=a||b;if(a.documentShived)return;a.documentShived=!0;var f=a.createElement,g=a.createDocumentFragment,h=a.getElementsByTagName("head")[0],i=function(a){f(a)};c||(e.elements.join(" ").replace(/\w+/g,i),a.createElement=function(a){var b=f(a);return b.canHaveChildren&&e.shivDocument(b.document),b},a.createDocumentFragment=function(){return e.shivDocument(g())});if(!d&&h){var j=f("div");j.innerHTML=["x<style>","article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}","audio{display:none}","canvas,video{display:inline-block;*display:inline;*zoom:1}","[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}","mark{background:#FF0;color:#000}","</style>"].join(""),h.insertBefore(j.lastChild,h.firstChild)}return a}};e.shivDocument(b),a.html5=e})(this,document) \ No newline at end of file
diff --git a/extlib/inconsolata/INFO.txt b/extlib/inconsolata/INFO.txt
new file mode 100644
index 00000000..61d3a0f1
--- /dev/null
+++ b/extlib/inconsolata/INFO.txt
@@ -0,0 +1,4 @@
+Inconsolata
+-----------
+
+This font is found at http://www.levien.com/type/myfonts/inconsolata.html
diff --git a/extlib/inconsolata/Inconsolata.otf b/extlib/inconsolata/Inconsolata.otf
new file mode 100644
index 00000000..34888982
--- /dev/null
+++ b/extlib/inconsolata/Inconsolata.otf
Binary files differ
diff --git a/extlib/inconsolata/Inconsolata.pfa b/extlib/inconsolata/Inconsolata.pfa
new file mode 100644
index 00000000..83a17d7a
--- /dev/null
+++ b/extlib/inconsolata/Inconsolata.pfa
@@ -0,0 +1,1088 @@
+%!PS-AdobeFont-1.0: Inconsolata 001.010
+%%Title: Inconsolata
+%Version: 001.010
+%%CreationDate: Sat Feb 7 12:03:37 2009
+%%Creator: Raph Levien
+%Copyright: Created by Raph Levien using his own tools and FontForge.
+%Copyright: Copyright 2006 Raph Levien. Released under the SIL Open
+%Copyright: Font License, http://scripts.sil.org/OFL.
+% 2005-8-26: Created.
+% Generated by FontForge 20090121 (http://fontforge.sf.net/)
+%%EndComments
+
+10 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /Inconsolata def
+/FontBBox {-1 -177 510 835 }readonly def
+/PaintType 0 def
+/FontInfo 11 dict dup begin
+ /version (001.010) readonly def
+ /Notice (Created by Raph Levien using his own tools and FontForge. Copyright 2006 Raph Levien. Released under the SIL Open Font License, http://scripts.sil.org/OFL.) readonly def
+ /FullName (Inconsolata) readonly def
+ /FamilyName (Inconsolata) readonly def
+ /Weight (Medium) readonly def
+ /FSType 8 def
+ /ItalicAngle 0 def
+ /isFixedPitch true def
+ /UnderlinePosition -100 def
+ /UnderlineThickness 50 def
+ /ascent 820 def
+end readonly def
+/Encoding 256 array
+ 0 1 255 { 1 index exch /.notdef put} for
+dup 1/NameMe.1 put
+dup 2/NameMe.2 put
+dup 3/NameMe.3 put
+dup 4/NameMe.4 put
+dup 5/NameMe.5 put
+dup 6/NameMe.6 put
+dup 7/NameMe.7 put
+dup 8/NameMe.8 put
+dup 9/NameMe.9 put
+dup 10/NameMe.10 put
+dup 11/NameMe.11 put
+dup 12/NameMe.12 put
+dup 13/NameMe.13 put
+dup 14/NameMe.14 put
+dup 15/NameMe.15 put
+dup 16/NameMe.16 put
+dup 17/NameMe.17 put
+dup 18/NameMe.18 put
+dup 19/NameMe.19 put
+dup 20/NameMe.20 put
+dup 21/NameMe.21 put
+dup 22/NameMe.22 put
+dup 23/NameMe.23 put
+dup 24/NameMe.24 put
+dup 25/NameMe.25 put
+dup 26/NameMe.26 put
+dup 27/NameMe.27 put
+dup 28/NameMe.28 put
+dup 29/NameMe.29 put
+dup 30/NameMe.30 put
+dup 31/NameMe.31 put
+dup 32/space put
+dup 33/exclam put
+dup 34/quotedbl put
+dup 35/numbersign put
+dup 36/dollar put
+dup 37/percent put
+dup 38/ampersand put
+dup 39/quotesingle put
+dup 40/parenleft put
+dup 41/parenright put
+dup 42/asterisk put
+dup 43/plus put
+dup 44/comma put
+dup 45/hyphen put
+dup 46/period put
+dup 47/slash put
+dup 48/zero put
+dup 49/one put
+dup 50/two put
+dup 51/three put
+dup 52/four put
+dup 53/five put
+dup 54/six put
+dup 55/seven put
+dup 56/eight put
+dup 57/nine put
+dup 58/colon put
+dup 59/semicolon put
+dup 60/less put
+dup 61/equal put
+dup 62/greater put
+dup 63/question put
+dup 64/at put
+dup 65/A put
+dup 66/B put
+dup 67/C put
+dup 68/D put
+dup 69/E put
+dup 70/F put
+dup 71/G put
+dup 72/H put
+dup 73/I put
+dup 74/J put
+dup 75/K put
+dup 76/L put
+dup 77/M put
+dup 78/N put
+dup 79/O put
+dup 80/P put
+dup 81/Q put
+dup 82/R put
+dup 83/S put
+dup 84/T put
+dup 85/U put
+dup 86/V put
+dup 87/W put
+dup 88/X put
+dup 89/Y put
+dup 90/Z put
+dup 91/bracketleft put
+dup 92/backslash put
+dup 93/bracketright put
+dup 94/asciicircum put
+dup 95/underscore put
+dup 96/grave put
+dup 97/a put
+dup 98/b put
+dup 99/c put
+dup 100/d put
+dup 101/e put
+dup 102/f put
+dup 103/g put
+dup 104/h put
+dup 105/i put
+dup 106/j put
+dup 107/k put
+dup 108/l put
+dup 109/m put
+dup 110/n put
+dup 111/o put
+dup 112/p put
+dup 113/q put
+dup 114/r put
+dup 115/s put
+dup 116/t put
+dup 117/u put
+dup 118/v put
+dup 119/w put
+dup 120/x put
+dup 121/y put
+dup 122/z put
+dup 123/braceleft put
+dup 124/bar put
+dup 125/braceright put
+dup 126/asciitilde put
+dup 127/NameMe.127 put
+dup 128/NameMe.128 put
+dup 129/NameMe.129 put
+dup 130/NameMe.130 put
+dup 131/NameMe.131 put
+dup 132/NameMe.132 put
+dup 133/NameMe.133 put
+dup 134/NameMe.134 put
+dup 135/NameMe.135 put
+dup 136/NameMe.136 put
+dup 137/NameMe.137 put
+dup 138/NameMe.138 put
+dup 139/NameMe.139 put
+dup 140/NameMe.140 put
+dup 141/NameMe.141 put
+dup 142/NameMe.142 put
+dup 143/NameMe.143 put
+dup 144/NameMe.144 put
+dup 145/NameMe.145 put
+dup 146/NameMe.146 put
+dup 147/NameMe.147 put
+dup 148/NameMe.148 put
+dup 149/NameMe.149 put
+dup 150/NameMe.150 put
+dup 151/NameMe.151 put
+dup 152/NameMe.152 put
+dup 153/NameMe.153 put
+dup 154/NameMe.154 put
+dup 155/NameMe.155 put
+dup 156/NameMe.156 put
+dup 157/NameMe.157 put
+dup 158/NameMe.158 put
+dup 159/NameMe.159 put
+dup 160/nonbreakingspace put
+dup 161/exclamdown put
+dup 162/cent put
+dup 163/sterling put
+dup 164/euro put
+dup 165/yen put
+dup 166/Scaron put
+dup 167/section put
+dup 168/scaron put
+dup 169/copyright put
+dup 170/ordfeminine put
+dup 171/guillemotleft put
+dup 172/logicalnot put
+dup 173/softhyphen put
+dup 174/registered put
+dup 175/macron put
+dup 176/degree put
+dup 177/plusminus put
+dup 178/uni00B2 put
+dup 179/uni00B3 put
+dup 180/Zcaron put
+dup 181/micro put
+dup 182/paragraph put
+dup 183/periodcentered put
+dup 184/zcaron put
+dup 185/uni00B9 put
+dup 186/ordmasculine put
+dup 187/guillemotright put
+dup 188/OE put
+dup 189/oe put
+dup 190/Ydieresis put
+dup 191/questiondown put
+dup 192/Agrave put
+dup 193/Aacute put
+dup 194/Acircumflex put
+dup 195/Atilde put
+dup 196/Adieresis put
+dup 197/Aring put
+dup 198/AE put
+dup 199/Ccedilla put
+dup 200/Egrave put
+dup 201/Eacute put
+dup 202/Ecircumflex put
+dup 203/Edieresis put
+dup 204/Igrave put
+dup 205/Iacute put
+dup 206/Icircumflex put
+dup 207/Idieresis put
+dup 208/Eth put
+dup 209/Ntilde put
+dup 210/Ograve put
+dup 211/Oacute put
+dup 212/Ocircumflex put
+dup 213/Otilde put
+dup 214/Odieresis put
+dup 215/multiply put
+dup 216/Oslash put
+dup 217/Ugrave put
+dup 218/Uacute put
+dup 219/Ucircumflex put
+dup 220/Udieresis put
+dup 221/Yacute put
+dup 222/Thorn put
+dup 223/germandbls put
+dup 224/agrave put
+dup 225/aacute put
+dup 226/acircumflex put
+dup 227/atilde put
+dup 228/adieresis put
+dup 229/aring put
+dup 230/ae put
+dup 231/ccedilla put
+dup 232/egrave put
+dup 233/eacute put
+dup 234/ecircumflex put
+dup 235/edieresis put
+dup 236/igrave put
+dup 237/iacute put
+dup 238/icircumflex put
+dup 239/idieresis put
+dup 240/eth put
+dup 241/ntilde put
+dup 242/ograve put
+dup 243/oacute put
+dup 244/ocircumflex put
+dup 245/otilde put
+dup 246/odieresis put
+dup 247/divide put
+dup 248/oslash put
+dup 249/ugrave put
+dup 250/uacute put
+dup 251/ucircumflex put
+dup 252/udieresis put
+dup 253/yacute put
+dup 254/thorn put
+dup 255/ydieresis put
+readonly def
+currentdict end
+currentfile eexec
+743F8413F3636CA85A9FFEFB50B4BB27302A5D8F831C8E7403C0106A132FF59D98092C95
+DC41D4C9241F1BD142718DBFC7990762D5702DF0A9EB7021A4E2963A13092EE8CE8D5420
+1693D02365290EAA96629C387B0C4D1D8F02EB5E206499E04031887F3D8326E1D52DE489
+DAF6385A0DF2C94A15E48C4F20A9A6E49ED44889E52CB5C42B509B29A2E21E2F65EDB849
+6A92804F43E45E2A5F7C701DC5251F457E338E2C67AFBFFFC9F1DC889EE31B6AC70DFF59
+766BC955C317A79D28364884CB3B1485A8CF42F0EB33E3A89026B9BB3082A4357FD4D28D
+ED92CF5006DCB258B0583019C44096C4F55E26B71018B6D73D9C82F9CD1FD4D3AF3B373B
+86AE36D5F73674AC34BFF15373CCF3744BDD34566C2D355AAA3C7A2BF5F440B13550AB25
+F9774E5E426548CD877393C89D2C66A0223C3B799F1BFADC79A2F135FB491B6A0DBBF42D
+E22E06C135617487E09820B8E435C13BB493D18EAB3F09530A17B104E9A21ECC2F6A3099
+8BB197801D507A4D287734EAC59F28F3F1543BB64C64D43516EAF67DC96E4FEF71EC4D98
+C8BCCAE296BF517D3A6927DD85765F85B59CB2FEEA4978825D5BA7832CC9C44F8D7195AE
+D2D27773E6A93C1CB545AAB95CE469EBE7DBE770CBB3A4B913542C93B2716BB48C4F5F5E
+ABDDBE740AE279051CA883F22E80E4AED31D5D5001A055F97A1FCA1DAA1E4319E97F484D
+301D9CD958A63214722032F006332D39C950DDBB0FB2FCDB82E0626291B4DB630BAD5EB4
+429F0484513B463E8EB1E2BE15F7DA7C9F1365025585465A6593B4246C6FF4447CF57700
+BE5577BF3F417FD88630D661D61693F9E92083EFE6EBE8054C4368233C3CF0FCCE71B15D
+D33AC388B678D0CC1BC8E5820AC2EEAF141C25BF2A423583ABD12395A6029A283F77B210
+B1C394F8BC8B835B0DD4A668E36FF47E3569DD995A18123945E06C82B043D76C87E57CEF
+19BCC653762D133144AFAD088F345F7E9AE84942696C1985529EAB4CE22965A4B256DEBC
+9B4A39B65DB7378B9917D76A15E978DD881078BE13967CB730D7A171F9DFCA9294ACA80E
+CE24E834CD0FDE0620FE9ECC22B5D72221D6A625B26C69925D22656DEFCCD6534045E522
+B942ADEAA201528C758566E6D9F8FCE0ED25854FD16417A7461A5092E5602ED96CE20787
+975FE5569193B044B83549541DE2226557952E53E90409A11C9BCA440D77A9179EFA65FA
+43FF7C10FF7B17D61A758C7F3E658542A0E44D8D84A638CDAC6595CCFDDEB2EF67FBBDF0
+B5B3BABBF5FD497FC88B32AE0EB2C7A62624A74146712946A106E7DAB8F455A8CFD88736
+F917A3EAC075D30BBE94F3D54301637ACA3DF58C7A652420BE7D221C53C8DD6C03C4F22F
+28E291C8D8C5C3D6CFE745A7F438EF594812E849D6E54666DAB28F6D0D6EF5E77C456AB8
+BB71F5AA6D677EEF06A784F99E1531C00C02312F42EEAE3A67C87BBE018E1E09895FED1F
+3F3712315F712F718BF4E7B672905E8B51522A7684DDDC6C4AED805A04BDFB6930D77A49
+67CD4CF63010A7AE4D88EA75138A9F27B15F50FD125C5182DB692F5B45FFDA25A63C1481
+40837722F0AE5823DAB6757D38A6EADCCDD7A0F2BC6825616CBA755697E699B40A3CA817
+17261FE9E09BE98650FEEB8D1525C2A9E33C174005F9C600832C4E8F426E7479B507F7DA
+884C72AF75C1818F6A1D35C1FDBC7B3FAF26A1F0F31B92E58CE39D892245BFB4212E9A77
+5836C9CF189550EFB8B23F147B4CC78B48040A2C2E1D83A35D0691B761DB111D4CCCDCEA
+09F13E8831AA4E330E0128105868F6F194771F9317127815D25653AD3F6981596D5C665A
+9613A6370D667980AE148B4F2C8B208AC2A3FBD0264FA03610C2764985C46924B6EF3A05
+1A2CD3F33BCC0C1D6D6D96008FCB58D84D88125D5B1A87083397D4302A1B2773F2CC59A9
+A7313CB431EA3A66C05E50EA8D94CF488C792E01C7F773FC42D394B9BB4CF7BFB76E73AD
+8B3CA41B172CEBB4BA391BB113CE4DBD6E4956628B4B20BAB6521EBFA45066FC65A2C7F3
+2F3DCBC22D01949EC33D19278FF72B3AEDC014BBF1041466A7C86EB1299881015A826235
+B13D7B3FA708A93686ED59D187050F8FBDB81DD98FC72EA4BCC5A40CEEB88192BB6AB175
+8B6A5A6BF4544F4831CC2AD93B09D1BE11156F97313F927DB21ACCF0DE0C925813365CE1
+1B5DBC508028ADCE89BE4B25DBD6D9906D6BD8AC2B3B1631BAE58619C5319CD83EDFCA29
+BADCE8580BFBFDE29EBE31879EF741795C0B962DCA3AE3F5C6A1AA2CE6D21EE239BB1B9E
+C7BBCE8C17CA0C8769773897E69615DB661CA26CD5444805CEA78414BE8A66A1685535C3
+E56A8EB579498386E9017B5233853CB9D031F863B7DFDDCCF39D55FCB073B2E3153DF76D
+C738D92FA3BB53B8C5067C347888A3CA135D04A214C30996D8721BFA425BCD69D069F314
+F4E761FC7F18EA5031715F01E89C6DEB95FDA6BB7A1C4CB2123CE36D13EEE81647141D27
+CAE4F80850746CA32876F6DFB1C191EF5B6AAE0A9C74EAAE17EF095996DAAAE24619161B
+F3B659ECFD3C4DD95C2229238BFC9E5A495080827D6A747C3B3FD3EF1247D2979C816A5C
+CEC294EE4A51A5089850F152D7BF2DC4682129846F159698CEED06499EE842AA45658986
+0E32068679836E0B726CFA1F0FB7E95ACCD3BBD70FD14F14161FE3168789593A659C768D
+D0F49748C1EB3D813F7C33ACF19D9627D82A6F457002B731AFFD24A3B9EE378295C37BB4
+11F39323247E845A80DD99625FE0BCAB3545F586BF74993BD3784D307CEC418481748420
+BBF213417639866D6112944C198BCF8E4D20B521B79FC5D935AA1184C2AADC4E7A89180F
+6A3380CB10F5542E5AB05881749C0512DBBE9101FFD2B4E79892BAC9428982CE386B64F3
+3B8A7C2FB184F1CC35B0EA584EF80A07D5A280AB944492F84D22FDFE47B9C893EB3F1515
+458859572F0DE48C7E5A10B6E3F946159B630D813CAC9312DA1683D923C4D9099FDD7A15
+B8667037556DF0536E44D3EEBFDD7CE67BCD0B1C09151A5AE07F3021023070C4159799F1
+88FDF758F48FF19E9D6CF06054E22F723BA336A81B127443743AA3D98EF3A209EC712894
+84EC103DE6523F763F944E31718BA6D56FC6DD03A29B49C2FF1894F736AA1AB9BCFAD31C
+60407CC4476DF0F69B96F7685141C8B63A5587875198ECE5BDD4924685773715E943A92A
+5A22415B8E85911EB72DF7410F6F1BADE8E8FD9348CB4D483C6D1200F35014D82DA9ABE3
+B476C00E7D3C762395A65D29148102224E6593AD80A566D10C8C14D577BFAF6D425FD2DD
+FCFB898E1F25199C2F2202ACE9E8425A7476510A4DBEEEE0B925B9D7D53E39E18E7B4F71
+809D01631B121F11C0785ED6D8F63319CFD11D4F810D04CB0D1C1997F50814451FF5E50A
+28F7D421CFEA781B89BDB53A9752A2F94A55A3EF211683E4CB4193EC3487909A46511643
+96B8C9F47C038ACB3A2940336596E008F9180171E06B8DDAB417E9FDFE042B952AC201F1
+CA2796E98374A16248C3939CB6FA9ADA4A6E1438E34394E8BB27275EC021F368BEFD7614
+9924EFAA8652A9B2CC4F493AB91452CABAABFCC7CD99D8BCA7F43852D40EB7897130F9A9
+548D091295511913275DB758BEEBEC3C4FEDBFBE13B92BC84412DE875938AEFF92F8B7F5
+5906A4A398768107C74AB503E55335AACFD3D107A3EE49D58CC291D4F507598311FB0FBB
+12F343A50237D83D8D281B1CCFFBFA2865EC4BF19998D3B60B5FCF20D1C2B699867EB100
+7A1C3FA5BB0F307C0F1A248225E4426C1E13352A1A1BA2511EF9A977A166106DED6682B8
+41A84D03A090FBE879045EE849E55D47530F269AC5F2212CD29F02F652C29DCED3B79101
+51937689C3BAB8D15DFFBF02676188AB1360792FC364143A6C0FA49494024EDEB72F0E90
+58E6D37CCF2A423120DB91DC7078887ED2561991B9B6C48EC10AB1084918C660A31EEF79
+4F5E1643E30046E876CBF84658483BC815343866EB1652FA6EEF41F98034FAF691169136
+76B9BFF152F9ED8C825BB9692A7E4CEB06AC4266CCADF5182E7A1586BDEC3B411064D6A5
+7B4A78162600FE4461CB0A6FCE4125B19ACB5F4BE5B1C70A565693CEC9BAE9EC277C5CF1
+3EC22CEE695858694DF4BB1D5FCEBE9E496D6A2B780D5FA9AE9E672FE35AF6558340DB82
+4213CE5AF7786FD5BEE2873B6508575C2BE154C4B2E7ED11D317A5058D23B335E3D0C5B2
+10BAAAF8270E01BEB660DA7D441B7A70921000E7564CCAE5FC90DD7E843BFBA1E1752021
+4C99A1411BE9CA4F64B48661B452D1674994DBB3B91F8CD458C787BCF29101F3D3D5236E
+37912A31A058EF76E3C74BB472A2C008305D1E8B35E7F40E0257AAE3BC7F24C48C18E5EF
+0FDC4DBBFCF48803BD7BBB797E128E39285BCDB6D0874B3764AF273D050264AF5810FCD4
+44A5EB6CFF8D48A1C7648E9D28966CD59EF607293054B22F111FF473C3D41336237DBCB8
+0062D35521EC38382AE3A54782962A18284A3AD75ADF2CBF18C5BD25B34D6594924F652E
+55D52507DC2CB831505223A5D86BF5C5AD1B7495C1BC9EBB7A7DF85C88DEB148018D9A79
+BE9954FEA2A3BD0D900FEF063EF37F552E3D5750E02C185F5EE94D7A93833A5EAC075BDC
+1C7ECE2D2482EEE2BC8E64D94A186008E6B4E53759ABF9AA74AFC8318BB810FEF89F6145
+BC72F812C6DE3091F3A351E1CF34BC3D1097AB5B7E05CEED21E41E2CE6E519938E4C7BFE
+D27C8E7B14B7042FDF155892E806B581977A0B6FF68334D903673DDE588EFC59B4F695F3
+4269A0B280435E546A34CC83D67D92915D842AFF0887903D9DFCC2EB1E64352BF165C1C2
+0767307C99F16D31E343B1A9F58F8CEA1C4F4B1505A75768838D7D7B7EC6CAEB5D464D21
+41A7BC21FD5DA3EFE42C9E6E74DD3BD11A844A395D83FF422E41DF1519C73466385C7779
+C1668D1269004CAD19E2FBCD012A741DB8F8E4B92E32D6121E7EF9808619C1A85E8552D1
+97D6E1C41F7E45708B4EBC90D54887B5A0774A19710EC804544AB557012D7D59BAE248FA
+A13614C9F3024F888A211D4F756E32473DA876138C1E7EEDFA604EC3CD33EF1F056F90F6
+4F836C1893A17C2CA4CD7558C9F63745CD659F3A5B5E23B260F0F17756092B5EE980E039
+3405F6289EBD24CB343FC7E68038981670D7407725397D88BB1406E8DD70C31429F74CE8
+A8F86BE6A1662353BD763548AD4A4E5A1318A54EC9A3AB56BFD991AC1E9A43E5BEE0A331
+DE6080DA712C6F2FACD94191EA36BCA53257F8856A7A108469A684012053B3D07813DEBD
+B7120CCF3087158F7229A05562A4D414BB9E5AF84EB08E560032862BC7FC1D4D5E00E6E5
+052A9E88327B6C7F018CDB5229EC282EC87E5A9E841D1903D72277E4C82D82F098BB7B7B
+D39EED6BB7EC87B5B70AE7219B43E3F6212570E7A2AC7D0738A7FA0303A0269B0BF62D2B
+D527026D57E5752527C8AB8D0C63BF1D914574A405C3E2C3944353796D86AA5E2F6B2A04
+C6AD1171377F3E1D26609B050952E0DABD4CE338AFC0BB4775D3779BFBF7F3365594C610
+176E3B0A62F5AFFA655D3ACFB8FF1BD7AF48A56E4AEC7D1B4FAFC8294E84BB9B3C4316FE
+B1C99131D63E7681F8F8D4ECDE8B7904CE3307FEA96D569994F63F7C1EB02F93AB1B2BAB
+2D95489642AD5FDF9D4ECEFF5619E70AE4A677881EEA0F84DEF708A7F73C5C99E43723ED
+3AD445D2A3FE327FA2FFFF37CAC7960E4585C3086735CC1167E73B9628EF17FF7AFEE09D
+D98F7016E8963B3CD7BDA0F756A6036D00A6FB11EB2DAF93FAF7A39BC2EC273650ED3E2D
+6C0DC9DC875C4BB852A0E0C1C8E546263309373E96DF8221B8309F3D35ECB61906D2A7E4
+0B6A2C92F04BD39E74EEF161D8A2F5EE7F4788E4C65BA7582C63858FD7E9E34250849CE0
+C8EAC1036C2055BDC50BD9D2BD0F228F0F6DD950F5850523C376364E394BBC979FFDE391
+5603CFE721359639069B00E0B09A3831677C1CC0AD41B0741FAFE3153807AECB7CB39A87
+56C53F818B2C0E03F8AE2E7766B1BD43595955E719169FDECBE1E93FFA0719275A971A93
+05FA40D2F715B0DE5AFA9299077A6DD1C46E6E7B98EFD6FE106CC2C5591AF6371054B80D
+4B17CF8F7E7A925E2289C9F063D7D6EBE5E2450D3FAAC78F2AED7479A9DCB9E42B0BB39E
+1E50801169216DDC66316C628C72A1046C0E414D16465DCAA2BCD7C499DA8511F6BCDC6D
+69F68EF6D98497C51749046384A3433906AFAED3058AF24D1827F498733562C6A4813188
+B008C48FCB1BE78F89CD1809D22A984DE092AD78EEA4143A731D1F48322767A1503AAB4C
+70E9B42A240B0770CAC79FD58579F57B23FFF37623883B7F33B060D8DAD0C21975CDEEF5
+2F5F2E395DE45E97E22A558F181478A86DAB0CE022C1FA5C513279FBA66536A4D1D13ABC
+E569CCD74DF5245190912983CA329C943B421B4CA583A6047AD453FA2E8E9583F6C9081D
+1DF2FF6469092B0FBE6EB38F789035EB82933CBF3D16D30C1DBA9F404D0C1C0892A36ED3
+A92D3BBEF436F3F1556536727F16D3F54C00A1A1693F285708ECA695D3B30ED177E353A6
+820E02F738027FDDA3BEEA8DF4B61D51ECB2201AFAFFD71C5D0BC21EFD4B381A8B14D8D5
+599D784FECFE6C0B83A126238ED4DCA2B797F360685049A7407B92C16FAED859CC68FBD0
+6F8A715BE5369E6F702539CDF50244E3414CA90A74D2E63FFF1253AA87F2B8D96874F0D4
+0292C41D3BA060434C45E6E88D8DF9E025196E310D3BA2045AF6570E3F87EB248A942BBA
+75528BC7FCA8B0C0B73874496BE86EBFCA8A1F28F18C1B29E924BCD56E8A1ECC202025A0
+4C81CD070F2DF6302F69B890EF4E7F1723D91434D9E2C7DB91E375E5F352F81DEAB15DBF
+5B702CF085535F4EA8B62BFD3C10455CB744A0FF840EB52BEE87C94DD8081BB23C3F1132
+D15BE52C4ED0BACA4794C96A2014381B3FEFE22E5B4B37BFF2C99C04C6FC4FBC71B465DC
+0AF985148120E96CBB1D34B8F63E3120ED7826D799EDA434B9DF86E00BABC41C9095C69D
+341249CDEE62D2F119C8C74029181AA202045AEEFA9EB41050653D356404BFB650DB8DF0
+F5680D8F5EC8A44F423540BBB43771220867F173D8D0CAD7406F8E64287A8DB8FDC947D3
+AEC9B0C5BF050735BF2CC285099C9799DBB9D3FA6FD87AA957683F9569D3261E14DD796B
+463F973B16F8895A738177E7CFB94EED7207BE01253F879351B2776C28F361860BD5182D
+A21F7B995B7A6B4BB09089DC6618343E0EDD922ED395A3D615CEBC9AE71992438429EE83
+ECB9E64ED7573F2F0C32F41010AAD6EF7F7902B397423433C297AAE40F16CDE76DA7BD43
+7A738C99709A13CE7EEF117B0D01ADD0E240135B754F7E16B7C7CD4E82F0BC951CB069E3
+AB189926C7C07F49C7EA7C3B5FACD93863A8D3E9917B417B2D2A5256ABAA9123B66179D8
+91B4EA97ADA8F1DB43EF175FD3487CDEC72BE6A2B89E43F340630535765411FA15D2B3C6
+350FDB2E3BFD6F660D539CB8120ED86B59AA539BE0AFCF84D03B8BC4BA0F0CA8FDC45893
+F061190878BD44003EB80D54E84CD41FB4244D5749FD17D9C7FB045357E651390A1CB833
+A43390912C1EAC62F86D50F1843D212EA2B72689D2681F46E327B28DFBF8D7D8FA2731F2
+D620C306703A4428DC3E8C22566D84A8F38C61C3F1A64F63FC65D0431BD7CF9C47A66569
+B4FA594DEA0944707062BCBC9E91BF4541A374E167E10E9EF02F5BC483A23FF0C6FEF410
+4618393C9BC5BDC5C2F4B69E81A93E6BC40D70D409B10E85D2CF9CE8E8FA6C8E125AFBEA
+452B79C547F82334D49B0EE386446E2351B6C8FD8031EA0E134B2CD41DDD622F0FEAF670
+1486D8288A5BCC146B35F7E75B6970338C6C613F9FC5E24C37E6E7C4C8C959417D30B406
+3CFC5B53E0B1833D10D72AA19D4F9852378E0BDDA8825C726F241E5A973286180C106FB5
+1D285AEAF479F7DBCA63AFD05CE41CB88E0E6D74F60210D66E73EA0E5AAEEA61672C088C
+0F86588F749D689E51A205B54A4B3C841B0298C77A3D82AD88BB02886B229371948D1A2D
+8D4D9B6E2331C4666FC7257E2ECFC1225093FFAF7A060876A2CB7D828BA0848EA0B52D9F
+96F9E7C786B928962DD71E761211432D66CBD6265DAC3FD3D3AB6A87DB72A6C266245B65
+6321255C4EAF77284AE1F46A76D1470C79FC4376DBB53DD7C0B660D629EEE6CA728ECDA9
+E4A7F91D10EADF2A143EA09689139F88BBF9E41DA8F09899669CFAFE4782DCF736BE2429
+8DEEFEE14143BFC8A22DF8A9092013AC3413AD2A6A59ECB2B9047FB27B4B3457B87F670F
+6F9A8A4F25C3B3294FB84012C70B90FB25662D6D5C8E9C1F9521FA9A9D9422BF378A6BFE
+C25B973C89F1BD470F6B8988AFFC9A87EA0F02693C054DF043A562572744E38B0D0B8FFB
+E9270EA45CCFAD6C7FF0374FE0EC402F788007F6025D5D33FCC84573A912F0E63526878D
+D09C2855792DC97AB90F6A000FDBDE52DC493363DF430F2B55DD9BC6B6BEB9735686D645
+3DE803AD239321053F764B9C12D8A3D19823B052A8CBBACCBE2A958154E57BAE9257430B
+A807220BC18C0141CE899B07BF776A8A50E84923E3163145ED3BBB84C7325FE6210E9776
+44DF731EF1A83F58CC60292D0A7EF1C2DDC93F7C56FBFA24BF220B1908C5600918154444
+F14363DA2D46933FDF42CB5B284777DB7AE316711CDE5FB27FD5A6D8ADBB8BC711395E1C
+50BC77674568C7C18A5F9DB1DC31501B263C0CEAE79A1EA01A389E61BCB744C18E6C9345
+C8339E3542A53EC210278175A9FB5476FB32562BAA6A01EE5A06A5D03C9773B8BCDCF7FD
+A89420F3B9A04D9A7ACA7A79F6F1DDEF968DF0A568B0062B8D0B14382FCB924170B7752B
+56E6AF3B37B5C0D7DF4A7D9FFFF71CA476DB2414372686B1F0223F7BC7D26EE75A4068A5
+8BF93E6E81D04EA847CAC1CA42550AF0956A3E6CBF7CBF28A87395502A8A4FBB49BAA7D6
+22A1A8AF3BBB9CCDFFD99232069ECEAAB36A476F1D0D57AB4F925A7E8F227FA9CB8458E7
+7050221CE4F99776D8862B82E023753CD502B02FD1FE3A041873CBEAD85629B6A1B81AA5
+DCB2A82D368F2BC05672CE027F44BF28ECC41A28C636240F494A8E963319FAE4EFB0059B
+B97B5CCAB45B87FA6DE1D67E7717C8295A580AD9860C3A539A62EA5049645174BBA5D93D
+6ADA0EC957186C469B13133F7C253424A41D9CFF5D48FF5C1E6D0BFFA39668C2D5254F27
+937F6C113ECB59FAA417C79DC0A0602A03244E81D6AFC40C112504D82AEE2F880FB1418F
+B3A13D31BD659820CF24504E230589651BF49F02210D877EFD77F166D02A731612386A4C
+0D7E0DF87D77D26DF0FBC832B5F9221EE8003886EB4DD87FDC063278D50C3FC638046C77
+99BA361F5419F74ACD06D18B9330343EAD919AF3BE0EAF2F97FB8C681F1241C661E13DB7
+BC5A42410396360388C76A57917459DF9E3AD893E16E47C6D19DEF058BB6B8F15C9074BB
+0D3FED9568CA6016FC6C343F78D3DE779225741E24712206FB7DF5B9E60E6B1A49ADFA80
+4E9C6F59A9372AA2381443D81D3834CCD26DD9A498C511511F0A3C2ED105D31BCC102BA2
+2BCD1E033BE7D90C5078DA0587D44AD84E8C62CE26D5676D92994C01255A999AAA42331A
+BC8CAD6BEDA04739C4C6BC6FCB3E584576DC94C44C776783EE4F72DEF2A0F76D9A31CFE8
+66D5DB6220ABA6A643466DAB3F62DDA5D6EDAC1160D0C586F5C0562E73DC27CD1F97CD76
+81EDA5E2D16C486785E7D64B8338EBF758684313E1746B927D3D751DC8BC4F2F53E82AA2
+AABE4BA7A4432E22311F471D45E5F9C1AF00D8537E2B56D14376FEE8244989943ED01F3F
+33800310E62BF9DA08DF47C2560EDEF3291D321547D11D478A6FEE8280D6A58DCD0E4704
+565F44CF46537A32AA37EF20F55528894368932B3E0D5CCADD1815237C02D7BF5D38C2C0
+95F0198AB0E775C2A3650CDA6280791093B0F0FDBCC12EB0ED6258FF5A38226FCE85955B
+1B5864A9E7414D4A530356CB0A4A59274894E80B03F500332F18F7E53D1B712C17CF2D22
+DC5561320E28F9F9D2CE5A54E51EA54A73D953FF56B3A281F3F4F393E078852A9F08D2F8
+176746C413BC5BBC8C40118E522E7F82758E03A92194FBF92790666F067930381852D53E
+655D32AB79475193F6F460F080405F7A7C1D4131207C8B5E9612A0F3906A45C8BBEFC352
+9F536EE2A388C728A73BAE869BC1376DB0F9F0B2B2E8003EE628FB639188499D07420B88
+460C137877AF93A3943A07634A236BEBE206B5CE3BBFABD0F42ABB4F4E2CED4F64D6FB2F
+0B1A92A79A5E160846BE6A37D52B75FC3DB80F4213681D9DBB12E093DCD15973530620BE
+2B5166E10B3440073246E1CDC87A43925AD4192A758232E8C025D38A31A976FCD40E54FA
+47F8E95415C18B5A8F3AE5C9D08EC07C97D72850FB9448D046F731E75A8BE351FE452B7A
+582EAA1CDF5360D96E065AF534B7683CE811DA3FA17E4165101CA68FAE7992D39CE9E260
+5ABF320AD456A3859C113076429F1FACD7D7299F4C97FFCBA3E5AB8611167380D46F3620
+2E0203BE1756FD086BA019DB1C3AEE521027A24905D7FEB24DBA39640FD79028C37B0175
+F0105CB9E9D62FB1473ACBDE309461473FDBC7DE6213DFD2AE88B5DCE787CC00C515927B
+B8705A3B42B7B702C33BEF950CF965BF5A761FD8706E7C780879916D436FF963DB2F8B17
+B5DE1B7586A88662C1D43A157AE3C82424F42861B7871EFBEB104F5DE9611BAF463A2B2F
+C69C34F5BF921FFE2EBB8EC63D63A3E59DD87F9643C44346D8A75D46BF92429404481C15
+32F4F2096C49DC7E8705E48C371E01C17279591A35874BB8B05577E1E758794B661EC58C
+5ABE361DEBD59EA914A5E922374B5729CF338575A44120BCAAF373ABB05425B583C3123A
+7129335B7BEA84B063261C606A1136CFB4771795968511038513BDC4BA6B2622E3CDABF3
+0ABC3EC8777F26A243528F1BEDB447FFCE543691DC700FD61F88B78F35F54ED90E0EE490
+50BBA809C6A1624CE093B7C07268F8D9B9618728BF9E73788E53DBF1085D0F4261736C05
+3306F412079BB44BF2AD382126D9F5F1A89C2938448B8B2EA584490574AAC3826DD6D0E2
+4D18BADE49B35E5A551495A7E0283C4A6335B46EB7635E1D93BB227A6956F5C99587E524
+D2ECEE3B038CE4C240477F6F052B66918951F1A7C86DAE384A7DF3E6F4C2DF39BB842386
+262F3093D94709E44B4F6C1508B3C8A34AFAA4DDF298EA4E9D452727BCADC3447D4DEF16
+F9158B579098E80FE8528A7EBB4639BEF180933089AE85856C4F1B4B3D9FE3F9993772B8
+87D3A415368ECDE584053E933C6A66512552F161FD7D1F3C089E55180F0FBD42AF74D108
+9A6ECC2A8A0A566861A07EF2D570F1F6A4A0D333FAD864F0C722A10C7E709844F75AA6BE
+FEAD7C7C21F947E8764598862CC5A098D8D7A90232B3D4C4A3479CEA0C5AF82B9B22596C
+2D4755269FE5187A2BDE3106867CEF50BD128E3489F77930B4B0A81CDD4A2432028AA58E
+9580470632FA24C48BEFAF51D726AAB97988058BE56B699D031C957B843DC0197D368E2E
+268991D6E0D4064EA111CB25B7843979331DDF2708059ACA15BBD1753326CFF7126C4EBD
+5E339C62B17304964057FD31E81E3EB7B66B56CF8C4EFA1026FF09190CBFAB39C62E9F97
+3032C5E2475C6F55B72F2BE77BDB4EE0E635A424B85FF0B4EC0EE96F1C54504094786343
+77E35C4FB1FE64426842E3B9350DC31A3051107525BD8A15BCD93BCB24EF5B0DE378771A
+E8803DBA93CBEABDA312EADB3E33D19F307B76D31FE0E60D1BFF457DB8DBBDFB91B040BD
+845CDF6EE02A4D81CFBBF5985FD060B763E3C4141F0A9BAE9EB8DF14E40D7C93A46190A8
+9C295AE87281CA6CA9749400BC3F6FFE287CEBB0F6F82C4DB5FA010D833D81816DA700DF
+63FC04B324AFD0AD229ED76DB877710E83618F9C621A26870D2A31AA418F4C8FB2E7E7C4
+1B57CFCE2DC46460876BA91246E82477702CF24EFC20FE32C096BF31E38F8AACE860DE81
+D888B1C5B0F195CD6C147A2E422474D1335E2584A67EB6E1FE6133951290C3879F885BFB
+ACCD497F349BF7DC76F7A0567225E79A635A85523FB9B5C058A248B60ADE40C1D5DC9537
+9D5111642CE8868CBDFF94BC41714ACBF551D4634955DC86272A31DAA51A460B5B66F379
+DFEC84C2DE47EE94053F3DD318693A3DD0485D08FFD5DF88D2102F18B0787AF6F5A4E312
+69E316FD499B6F36A06355F7D329C27886B24437A67144A7CDAD71299A95AB6B75992DE5
+802935A847B4FBDD755264209E967A434647E026410755664E58290755D47FB7DAF6CA62
+28351DECF90BDCAA9E97A4B683B1BDEC6EDA812D5D27AD68D87F76A05F66D7E8327C855D
+FC353D133402B597330650E52BE7E9DF382A2E7664EA34C8DFACA713E06964813ECFD915
+C8FC76E98338772F97C78A250DE27DF108F8EA6A6E01C5279CDCB99DC0E9DEA49E2A6C48
+3C9A3F315DE9866D7AA8A3B84C5C30E43752D497D8AFD4788D2AF10BBAC57EF224A54704
+2E455EA1B15526700697522CB192DD142B6C04A1E5ECC8CBDA2B0531E2742974D427A874
+E93A089B946D41EB841BA2DA3EA57080AE895B4D88953C7DC0CBB55100E7B56475FD7F81
+951238AA52B7376B8B7CB4A08F93CFBC31414CD644F6813FE411A2076A2087467B62C6B0
+47C11619DFAB0E6034DF21C52F6E0687A630D35C2F689EF4ACE325FA6AB3FE47AF250BFD
+17A3A34A45E6B3EEF17B402536DBEC877B95730F9CB5370A68094511CBB793258302D883
+117542B2AA7FAC3C1992E1FAACD8D1ED6C26A218CC7ED2E438DEF09CF268CB706C371D79
+282C3B007B0A199DA60DA023C7DD797F8199C8BA4693DC77206D8B455DEDCF45A2C27B06
+CE8B98097E68E34DF45C447722111CAE1FE9A2132A949EC35B928CF31C373F8117B03284
+D48F200B22114E254C08282AAD37418951B825A5E2B3F428DFAC65D48560FDA6DC092155
+FA29A09467E049109C2E5D2BB7CE2EA8B449A1D01F64B996B34625F3D60C5C48DCB6C6AB
+99A3431149D1BAA1380AA884F1F21BFC3C28AA9A8D72A3B8AF91541810C05FAEDD7F3DD6
+04574837DE6A378CF04E34C6B6460953B498594F7676B94EA4BE8C3CD8AF20E5B467B175
+D544FE69BE9942340FC0220A2FA134D4B97CC523C9AE4C86A7841590495DCC3DE6ED645B
+58F50D11159EDEBCEEDA679D55FB8288D52AAD3F685227C514E43E284DFAC06BDF9C7D9F
+ADAF527840DF255E92962C5C78B46E68C72893EABBD1FD4E1858842A9B2EF85663966869
+C734D1E577B3EB650A68D7270659984344CA91BE8F7CCB53A1E3CE26D043C9CF9A94981F
+3AC6E593E61128B3093481A80E172528F5B887CD55B5807E3310F55EA87E90AF1F7C9AA4
+BC4CE22E0D3B27A670AB2759C349F596FAB2AA24BCA521F9C22B9C02FAF37FB9F852A3F4
+FD6B3AF1A1F3D1F4EA285BCFB0C0F7C5B8333BD2013EBB6613347824AFF2DB14F28B7712
+3189B3DB4668035E7C7ABCD09CB7A58C02D09EDA98306B567FCCEA4060DEC980901FE159
+C75D65E7EDA505FABC3646E5E48820DECC78552F854DACD0C1E8FCD34BE4513C1D0A5657
+C4429DFBAD3625390AE9CD8C40087E0D1FCC0D1BD0B0504DAFC30C16239ABEE7D9CF9799
+F5E506028BF66E9393BEB384CF20965B03A73B465852CAAC82772D828663AD729DF3F492
+14824703CE36BCBE2F492DC778C8D6467205171BCE00CF11C2ED4651DC9DF4F8C33D9BBE
+971E3594BA10511827E453ABEA44AD355B3ACC323EFFA3995651F572988F182431C5593E
+4504903AFA37AEFD95DBD5E147BC1E2A29C2C8542F2658C06D212AFDBCF47CB0A3D70665
+355F72AC1DD9CE376E5E717B653860975E2138CD053C496AF9A6551586447A31932F3C75
+9951BC52CBAB7BC6305B6C11C00D1880DD285E3A8F21B7421E1B3C6437BF40675560B499
+1E4291BC2BB91D61C6ACD1770B78FEDA917DFE69656AB91D19FA3F2F35278EC7DC3F75AD
+CBF76BF301AC248CC66C2BC0739BFE8339EC1F81A8B81F5CC59F8B38CDE717700998B65A
+AD729140C89CE76E44AAFB5720DB8D088FF7028C3BB12EBFF413324B247ACEDCE4706528
+02EED0F9621BD22A9FE207B493B5C2431C172CC1E5E465A2ADF672C917E428E3D9EB628B
+01D5D637EE70620DA8639C52389EA2D619DE192620CFB21934B037930B3BDB495D641C5A
+532B823AB00B436B69E64AC361331CBC85B9F54E95F8862F85A2FA947399FF1499A63E5B
+62F022D3191810521E873AA747A7A7CA664485F539B923B95C2459114034F985E671B240
+263687FF2DECD8A97973A102C95992F3A5315DFA8CD2825A9C8512FDCF8EA5A649E57FA1
+6CB149998608CCAAB6AF6D311DD8444022C0A3D53585786D9AFE05AE23DDBF6461CAB60C
+FBA85D7C2B5C983F6AABFD65A02CBD89869B880765B09194B888CFD57D34429581F505B2
+453A0DE55E0A727D9C02561CC3FA538463AE65D91A36D71FF34C1A65981DCA294989C8BE
+053166A8627C01610DA5828AB836279AD2C688FA8A96961F4F03B4E0A620C8D60D931F1A
+ED6DC195A458D42CC9E18A8290EC050E6C832442857558C6F3984FCC5FE57E3C641B0CB2
+7DC78113D3BF91DED8AB6D2592A90A323AD5FDF725BB3ED60B9BFDE427DEDBFCEC35A147
+1898A2BFD5ED3C39E764393CCD5A41FEAA287E88A828C228B37B3086B91473B913DE0B87
+F5E0A3E6379D1110830B46BD1B9CF1EC261076AD78D5C426D9578589228BD2D0624912BB
+A60666E1767EF59F6E88A3E2BC1CD2FEC4E75F8162121E4F1E91E5818B78202D31B8BA09
+9E1B10D90BBA1BB994638CD6E1A53DDA70C41EA727958555F99508899982FAC290D739A6
+A27DCCF89B199F9BB895694CF97349651AACBA7F5C6961D888FDE51CD1D039E7A6B4E249
+D2503A5FC4DA4AC3A4D52E1908CA72733601F38CFC77BDD4627A99C7205644678AF0A119
+B4826C816E4EEE5763B111E7F6F64E94A2E21B4AA165726A3BD4BF7B2D029EA2A5F0D8B2
+121F13F70944F7C4E08BDC081E783931476005BEEF2AA44895125B603E1AD0D5630B9839
+1DE18F15A89B8CAC43E7773985BFACDF40A4AAF72B32B989A97A9CE012BDE6506048910A
+950E81528F6836E33E4EA06DBEB483DEAD014F6FF4CCC17FBA14557B93F07738733CD69A
+FF3FAD8D030AA5BF7C0DAE9B2293A85FE6685E4CD06D3A3A5FF69233DC41A9256DC96E56
+4DC8804ADCB562AF017EC5371CBE336AA48B8A47353657511C8C345E5FFB5B2D1DCC385D
+7ACEDDE127E1C1396E34A63AA9EAB19E3A03542BA99C15CFF99AC5ED8E765AE6A17FA3C2
+6D33DFA0CD291856100A8EEE51D4752A3BDF71E670CB1ADCA1A946F6284370CDB73A57C3
+B92D7ECDE804DD72981CDE024BF09E1A6FEE156FFA5EED52EBFC63CCA6B99DFA55B7C0C9
+D2F6CA796869CED592CC18592A0E52F5BDC1FE6181E8FB38E7F7D8409CC1A52F990163C7
+D4EF1F3C52CFD0EDF376FC5D8D0ADD14E01BE5A6C63A30CA12F10DF0E863B661F94E5187
+66C1640C2E53B05E44FD7F6BBDC704BBCE316C416B8F5440B2007280858AEF3A2D5858DB
+174B3A4C51D4973F227D50B433F444C2B015EC09E62FEBA96F71589269374CC4D860F0AA
+DDA5838983CF417CD294FBE3B66B3722957C50811482BBEA6E67F64B112A1D41B9AB965A
+163DA85EAF8808DA9B8CEA7873C37FFD40CDBD5BF558A687F42F4D85D179377585FB9399
+4C0F941F378C9ACDA1FE1C8000D434F8A6E25761AA589165D3FE816E1121EC41B08C8606
+9633A2FBB88A57C69D0C960AD5670E3D8A23A8E932C56BF10AF7D232B4F509DE979BA0BF
+983A7AE7C63D0BDB98DC4DA7F83BA079689FCAB1D3F616FB4F6ACFA1EEDA10154113CFC7
+6F705B6BB560FD91F513B371D645595DA6ACCEDD983F2535401E8805ECFA30A50C0CBEB0
+C9A167E95ABF41E46F6135F16BF263992E53AC0AC674595752E44B646D347DD5006477BD
+F689D53471714018FBAB73B6DB59E38E888F156969563AD9A60D1F1DBA5EE335891CEA6F
+E09EC37A81B1C01AB0DF819909E7CEB02A652A570C3AE5A709C50B0A84B2372A6BDD0A0B
+2D74A26929AE6FACC2085607F274983EA9BD6E4EE5B335F0BB8559031C6A1119FA896259
+1B9B692D9953CA48EDB4DD5620713A7D520DC49539654E83A41AD1E1981AF3FC348456A2
+FDB2615E84A0C04CBE72C5583A0EB2DA8E16BC093343218BFA7B3FAB2F392292642B8E7E
+D6D7F60EAFF40C5FE2D5E3922119967C016EEACAA12E9C9BB9E95C543E4142D8FE5B3C59
+F12272D12A5AF94F64B2AB0AA81B5D4E6F021716728450F4FD3A4A124286901F2E569B7E
+4B7BAF1FA08D9546C65DDB4D172F0A36F17CFC2E3317A8F602A65539707FCCE7D3EE5F8B
+97D4A5EFC7BD49C272068A590A031FD988BEC2B4B243195902F059F15F513C1D0A565F3D
+1CF75776E45F913C074E9F92D29C4C495FB210526FF826B16010EF716E721210390F8CA0
+BF5DB3CBEE6A2AA442287C7547FDA4162F35603BD98F76F2DA93566DB89DB7DFC181012D
+69C6F57A39A6A11D7BA61F7C5E49974AEF69E08240719EED3BDB3DB39BD1AFAA39DC5B7C
+72E19373CEE017D3AC8BE09150DB004D1933346059927C5C3F11A21B0A52C3A9C5E50294
+8A5A29E0C4EDAC562371353454EB5AB59ECCF71656B1B765467F55142E5B42DAEE517065
+04854760D63726F38543DDE1415904ED707A8C75DF3CBF6412CE799DE6FA7B74F92FBA55
+8F75F16B730AFB8BE0425FD7B40EC1ADCE67ED48E804396F104CDA42F7FA7C25E9C45016
+41AAA410BAFE1856E1925DA6B6FC2CCB5C6EF5C78A65B36D1EC2B7C6D65769F69F6DBB5F
+556058598F6B7D92FB81A280D60796462F40FBE9623E7FB44C3E1E3232B30421253863C7
+B1518A8CDF2CAD468632D726AD70F61242EDDF20EC15D9E502E8668C26A583A9185C88DA
+7678483F8AEA59F97373701E25F698B3C60B8524BD34C596DC7FFE284FD59D4F2765915C
+8562A919E48AEF5882B04548426B3F91CE52AC4B0C6B8B055374793DB94D87F37E2EC09C
+B5707CFEE332B79327D5832160FEEF1E7256D2D828B3B932CB9596AF1A74F72A5A58B462
+457EC9622EA70C8E7BCCA6010C62D375A1E4B819642937E46BED83AAC3447C9EDDD660A8
+128273CEDE717E93D46C8A445322AAFFE6ABAF50D6EB8647FA9E75893673BD3C3298693D
+CCCF823FC5CE853B5B9B894F8CBC00B0CFF16D662785C8A72A83B6817966D27274058804
+361C58B673F78C9CDBB4716EEEC89B7A80BD85003AFC1CC4287ACE0F4CD12DFA940689D0
+357E71E2BD2219BB273AF131B7FC88B0F59E867D7968E77EA32736DF6AA0640D1F7EBE54
+7FA6B4863B3A6D3E61C3F86E9A621B64290EFA830DF1476F70145777B02C9A4EE785BCC5
+1293915FAF0728B0A3C76370080BEFF2C121943FED45A075B90D810209D97AF4A58BFDB9
+C2BEDDFA79AA0398800B0372CEF1C6EBA3639F980469D048FE41FF7F3E62C38BED78439A
+172D4974184A55B9F7EE80E58A05DE801577AE94F41A5AA0A58B10A1218C6B211B13EAB0
+5E8E685B4AFF1D9BED162967D352CBD30CC256F5D656189C064CD04F636730EC75C6DC93
+5BD33B933AAB1AE67B9CFAC5CC422EEA6FD1D759D7A9076811D5C16D251DB24F3C84A66A
+1B89B0BCCCAD2E602F7CFE6FD81F40B15FA59CE4FFCE9EAB3368555B584A0E7BD1230586
+9BC6935EFF37C0CDA1A2B048850EA555E500048D12DA09F1AF426AEE319B3C29CB084C81
+AF6CB695495F4C4BA7D82F0CCD5B1E37B5B54FA0B4F310946A95A24E4F0EAB558D5DBDF3
+3240960F738A090A7C48ECB77DA89A2F5BCC71E59DCE2CD1D9D60E4CF84162D838394794
+C1128C29861FF5B6D853C2973C5DBEB4B2EA6DC8BF9F39C128FE6C03071D666DCA2F2F59
+034E01F861F6ED0F2A47F929463866D9747755B19E87EAF688F63FF61398982B2B578A6D
+1126D12FAD575C6748D9A869280A1DF1A6C065C30127CEF0D320CCF0B70AFE78FDF8F85D
+73D92B58CF31CAFBFAE863C733CAF86F0C21CB12BE7AB4685B75192707ACB49072E4DF0C
+CB5C8820B266096773164D42D8700F690F3875921B3BD06B5A7547F7F28C0D66E9C847B3
+A6ED4205AB7DC565AD386EF9E9F26300B7DA7815D89ACEF70F7747C4839E077EDAF1425F
+516B28DFBDE2A50FA09456FF518BAA484FB2AB219F869159D1C90A367C2D0AD37A41CF2B
+F251107318239B0D2AED86B90BC5A609A9E23EB23DA7A9B3B09F5B77160D3107D67279B8
+FB27C672DD2C451210D8ECA64F38A82FFBC5B32DE24BB88FDEF3E00343ACF94C0F70727D
+EB162B037C07E42FB61EFA6CD8716B76266AD0736C2DEA741DEAD3C8970856750E626208
+47177E8BA6C165EC9332E89379B0F42895F378E7F40A891EDE85D7D3B269AB3FFB162F6F
+5523A5AEEA6C63A09FB477C75F48E84D80944477B3CDE2FFDE7041970DD9F0F2D3C200A4
+28939960C25D39197820ABC862FD747B6351EA1FADF7DCD5469293034E8FB6ED32BB93CA
+734B4C6C7309CE8CE974D9464ABCA6FB789915B8BB8F6F9C233ED5CC1B3130481C72DC63
+B766F3C3B4E6881540D3B9701101082E43DFAE894B1EEFDCD7B60E3A441E8F42E47FED67
+CF5478A0E57424B19B6F2B110D7B508EBF532D37E86E4046A0EF69D7E188719640C5DDF4
+F1C8AB2CB2D1A03583E0BBD530CB90097D881466A0FBDC68C8C82C2DF517B0832A695D94
+DC0073F03210A8E9DA4340E9076DC29FEB24F6AF46D11869CD7AF8B03D56A9A9D4DC8B10
+714E558C94D505A160425468277FFB7453A54FA3A048F2E755B836757F590F976E4F57B7
+B34D0C1E931E0F46F665CA10A584111B63FC0D1DBBC583451A390F33010AF97C1A5436F4
+633C63E5FEB3F57CCE852A3264E8D6FC40BFC47AF469563AC79BD0FAF36DB986AAE2291B
+426E4FADF2BBB75D097D84E4219B50C69E4BD6B883C399C1A1764BDA9BFA7C8F507BD3DA
+043DBAAF1B2A1CED051407DD9904978A3372A237C63201D6AC08F45760F2A9F9A05E17C6
+3BF3FBF88F5C22B84A7C31A93DF8094A22E0BEC8FA6B5B8392E2FEE1167C9BE75C71FC61
+D96B1A64962EA9AD2351E4BC0E9D1251E08B32E46EE414A02E4BDA4EFC756B50BACAC527
+05358FA4E0831DDCC2EA109E658818F4AE3BD1B529EC8290068949CDAF8432B32D761D5B
+A189F6D754A6BE6AF0F9B7228B4A0CCECD9C1612FF5267AFF1D80CE0DE78D34AE50DE18E
+45DAE4668CD8AD3CD83FBBCD1C9FDFD0DF6D1EB98319F2B0B8FB3160ACF30A50A76519EC
+5C6E29AF1858EAE89DF07CEDC156242C097D510DAA16983DBEC439FAFC4B92F644880754
+2C0C9070401A365467D5B92FB0265E36C043DD057689520146CE13AD1202A05DB8EF6FFD
+BD83EB5B66A7039819EB3A3569D7934BA17D6843F33B90E29B3B70E41B6E3952627B50A7
+9B22946085E1C3B49ECC799223301FF665267577EB42EDD3F96570BE473D8FADF6E20977
+B828BCCDCA9E99B656F843C421C29C3761AC94B209CF662A504BD6F476270081DF274BF9
+CFBE86EC832EE64AC7594107F77A6F5D32AFEE61FF06EC0916B60EA34CC474F77C8C9360
+C9AB3DF8D00E46865C787F991025EE0B8753CEA8CE04D3CE619FD3FC7989EE6DE3BE2DC8
+DC4AE51580948374F63C5B4DEF6A3218EBFACF11FE052E68086354D82F7CF192A869EB95
+F1C3B82F9C9BDDA35B7664E7CD414756D14BCB4C85F0277055D2C024F97CFCEE848F1218
+C0465D65EE3A2460168E96D8BC5FCA42D002CF8CCA740E88B4BDA4C77B630564D41F6F1B
+8E2C293F18B6F11C43552FC1853FA0E56B4A9D4C8B64E36CCEBFB42AA4025DB07A232EA5
+940843188D522F2DC1E18009431A2466B9F5DF0BA85735257068DE21E97893098B8017CA
+FF59BB33325E98C8075D2729BDB3EEBB248E070312A158DDBC5F8781335377BE1F9A4D46
+08EC02CFF83D7D2C0CBE5EE3DF3A8D011AA2204D89051CBFFE3FF73793C116C8D143C569
+C04FADA0F8AB036202C4ADA2547CF472700A6CB6F9398678A247707E56A071592D681E0E
+1B7D3161AE15052258E9FA1E8FE0B898D71F8F01126DEBC69849A4A74631884F85DC8B10
+714E4D1E1956B81F1C6A1D2B686371FC3C1149A9BF24CC1517D0F91E6445E3175D623D7E
+8EAD5AFC6FE9471C6819CEAE1B54E4291357E4B4B0A727FB86661F1EA4D3F4619887CA5C
+CFBF0A7BE994EC0407C16A8AF8717F43E41A86DDC430CD2C994D6D8334B3787DF02F40A1
+E79CF18FEE729182E50F8ACFECEECC42975BC8E5F3CE308F3A9F69134264D5C1076F8B6E
+6C4EA6DC3C20C6E49391F273E535A26A7FC9EE50AE0FE832C46C05BB0EB4BE92C2137584
+E7110638D5EC824EC36ED32F1C91060A536F655C67BA76BDCBF1CB66116D0792032F000C
+85606DC9833581F4C1608D51B057317FC222680FEEAB0B39E8B35068A1AFAC8760880DAC
+57D3B55D4B1A1896D50C6D763E7F9D84AA3FAB44492E73EB3E58651B2F165545D812CC0E
+DE84339255EF752B634CCA91D3A1439FFF188ED53918FC5851DD87C737716DEF2EF6C51C
+ECE2208476B3E08C40A2784CA7AF19353C70C7B5EAEB58203D1467C7B4B70BED56E1ADA5
+69970A0D10311791ACEFB789C507E55703B486B7E99270C89D463767F8454637321B9372
+A328AF3909C4546C3410DA87CDC2BF68FA036E08A0EC5166D23403440814FE86C0D2E416
+6CD26C987EEB9697AEAD9766123084F5EC5D85DE26BAABC45BBD878E585C07CF65C95FAE
+0982B682A6B1CAD0CA3328603183E7F5DF27049D82D1AABCBE4BBEC41907FE324CDCF673
+92A65748DA5BED12559BB107ABD75A5A32B41AF45C1935C8855198E7E5CE55AC5E550424
+E55089A346F5F979506BB888AE30D1B7A2E6B1EFCAB878304F9A5C7D8646E1D556875092
+2F1F8659E6C6DB246BFB335BF9B0EE59951590891E58DE50973B2B9E75CA0722050457C1
+48A2B9C300D725495D5F05D770EBFA877CEAA1834C9F4F434F6175DD978B1DDEBA14E3C3
+5617411FB5F674A6268FB29DF3DE86B96CB9447D5277EA57925F7377FD6AB1DD03CA66E9
+6B596711F0071A87E01E623A47B3EA208D4C8E644BAA232941E5800CF2C0DC3C4B5C26D3
+4C38E37318ADF7F39CA908028FB22E858024A3905FC3FB12B298F5A44A11DF87FCD7EB15
+0C846266EA6CF4A2B6175E86CF6AFE500315B7C3AA86D1F604335F752C4047F296CBA798
+D3DBC9377C0D18529AD322C7AB69ECB3453DB53F695BE4CAA84F822F13BCFB78F03C6C27
+DB249DBEF37EAE3097C3EAAD54B9093139C8992DA550A5DD4CA7BA79CC58F10984F759A1
+8A3F9EF2B3CD8C4AA2D7DB6510EF0E86C9C1E876A7AC52551C42B4D33515637FD07C213F
+3B91A63E333F0276F7F44E1DD1D1F759D9E1495164D70266EA56A08DE62D0EDB09230885
+2D0BAA1D4CE4A6B115030D7B0046E9EB044E15FEB765FD515346B13B196227AA5AC9C76F
+272B6C2FB67DE3442032DD9812BE1181B4A35099239ABF44B2274BD7D057359C45DCEA84
+D8BC14C8D1D32BFD3ACBBFD120C24CDE608625C4BA3661E4038EDB5F45B7959C86643EA8
+FAC43E82B5600ACBDAC16A77E800507CD63399F452823BABB430E3E11B40B046E826296B
+C04B5F5755EBE54A5294BD473FF5E4ABC08AB729814F662B446F83203F1620DD8FED7AD0
+C86FC2E50AD277DD72EEF9406878F1A416F16A834EB4202094FBB08877ABB6AD51695BF5
+A60C7C44C5AC2DA5CCEE1A5FCE5AAE9C07BB8746F17ABE4787BEF37862F760944C1E85A9
+2D796850780F6DD44A5172F3D0A2A677F4CFA0E40C06B09776961568DA8EFB910DEFD453
+F20F9748F2F0FC1D5A17541238225B1AC8E22621B24F9A7CD333AD60B287C176EE71C3F1
+6282B327BEF2D375ACC762D18DC468A656E7F4BD033CAE3B231EA1B8DE994D62110A37A5
+D9314CC49579ACB4CF85A7F7B9C41409FCF9CE7247502322D0D3344A193C61A211C9907F
+242C2F0FF5EB017F1B77F2FD7B88C66246131BC5975966AC9E81A0396BEC796ECDA76CAE
+5BFABB1A0FBCEC6ED3466ADF3205BCF247366EA693C774D215486DB5EE25A6BA41032343
+9CC5F8244D9F5863C52CE2F0C8D99AC7C26D201E2511C4F470402FF7F2B4C093580059CA
+CF313F4E34481433F71206DB8579675BEF328E9011BFF3DE8D022338DDE02B66061F7088
+815988CB5C55224C08E67540610EA37D36D3841E78AA828F385EDFC3FDA57220D1988155
+80841533C9CF1DD3D0A1FCFDA06BB2F3A2B93978FEF0EDFD43CCFBA400301D8BAB8B9A57
+FCCD0CCDECF7FC72387D45722ABDF00E89AEADBE8A158729F64B74465C6AFCFBFA93149A
+C42CBA17C01C029E88974C944EE96557BEC1B0B3C8C3CAD0B1F013D590BCD448774AD3AF
+607F3AE1A0B9C8AB20CEFAE3B44F4DDA7AB0385906A3202D5BEF00E1EE3D7D746C16421B
+AA4B9E2B27070C84439DDE56F8A1B71A0CC0AF02FF9DCD8AC122B1C3BC87A0BC820A93C6
+A35B334770DC4DEA570B0CFB4701A2B84DEA09F5A37A4923259DED0280F188E13C57E6D2
+46D604578B97B72D73F2F1A10BE0B56CC1EC28147876D45B4E25EBB8ED2467EB7A482EB4
+CAF28AFEE76C9DD02C34CB329AF07630EBE2B6473C415B0FEA259E79CECF2713303F582D
+DF2B507D97FD832A25C4C0C8F531CA12C0E971DBA26F9C6903CD2662FC141EDF3B047103
+0B7B990435AE540AD4A9E8BF58B526A82E9DBB76DC2B12D7CAF24491B082D8383D925534
+C443CA3892D7213A768CB30DE5370A0B80B29A602002FA0DEFF2CEE7CA08F36C6588F4EC
+7F0C6129CA4CA71FA746B016F2179E2404D812357A770C7FC90763091EBE3FF724A019D4
+AF46CB7DBB1467D38132EF68D342A0BD675C58FFDB637540C36525B6C0A2E083CB180FCA
+C47985138372802E3C664951CAC4AD20C39A270F2E188EC9BABAF6EB85151F368C061A77
+E47E19246A5BF0E11C483865E3FF1B8FEBE7CD2D6E88A63856FAE1F9786A630EF2182327
+79A8AFB30B1795B3E2067FFD182768ACE773729479D8C88B6DCF70E0810B3888DC189F62
+8E0FB822842885123952A8476B6BB1E80FBFBAC64EEBC76063058A59F18BB79F01D157F0
+34C68463297C14F56582163520C5170DFFAB8E8C2289A0C7D98FEF9C6D3763D5BC2DEE13
+402B099AC4AFF19341D0B104F2EFF754D073B411BB4E5F8461D9E74E471638CE2F22460F
+4B17AFDB86525079E03F9D53FA1FAC798BA4B1E8934A94EA36644E335AA43E226A39CFA3
+520D1B38EC3A7660BCAF9428CBD29564DFBA6E588ECF65C8977C753FBA30D3C97AD33536
+34B3E8036CB25F49D7D326F7A4C465EFE9DCB3265DFE95D01EC47830A62D9111130685D9
+DAA06DAE163BF469DCADB9CEBF10A632D01352D426D732AA93042CE3F6312E6DEB456EF0
+78656751EF0D7C1F39CEAE7C27D4E55C35901C45547AAB8ECF631EE91A75B926A8EB877B
+B73253F7BF74EDABB131705E13BA733CA7CF88D3D6F59226D9C6EC5C9B0050BF104C0ED5
+333CB2B417DD1BE2BF416591F3B3D98C0E711111843D7537F3F8CDA6C9FDA7377794E11A
+34209562AE12078766488C00C8EBFF7312055FFD94D35B56933E39A77095206911AFE9D5
+C2F2898784E19E06297701AEA9272380F34B66C70730EF6AD704340CB739F721A749BD33
+28CC458CD29F363F3C7D767AA4087DB56607A875CA33E729D6974437479A70E3D1524045
+3B9E06DDBD5593FA8F894AA18AA673199D2DD71AF92FE8B869552FFA10E9855D64E352AB
+B37FD730FD30FFAF7B32FEE7869A78A035931977302369838F960F2C99B0EEA106E3A8E7
+BCEF05F2E34235BEBE41CF85B9DA4693985C7691B77BBC03DA6C3DA49512681DAA302AE2
+13863FCD1EE2C1AA2A9E02E073C10F25A9FD798892B60A79727D23EA39591B617E8B08D9
+77F2F7B60A371AC227D2EEE3B2094153B619A5AD541FCAB29F27015BBFAE6CCFB1CC2EAD
+0D6C1A4E28A67FC438E476109AAEB67956634812A0BF3E9257163A82B0A57459F1150C1A
+0F13AD982CB26FD01CCDF78C3C267B372D8E331129D4E83609FADD5DCBFA7D18D93D8367
+2F422874A6699DFC45E2A0B76A19935CD20A66CD278CA3A7AB9893685475E0F7E3D75C50
+22B8A9F17E1776B2960C31A972B19475BCFC90973CB642823E77E8455A363F66524BC0A9
+22A24A3D2DB5E71AF729A911BE97EDE5971612CED400BE5A2C961B2336F37B92512AB53E
+153434325BCCA89A56A9DCC8694BE02496F4BD2DAFE14ED9F9ACCA3807FE1ACF6B0E4D67
+0D5AA3340A2217EE7BA81379852965832A4DBD1C24025FDD3FA69D7299C7619344F7DDB0
+484CA724CEEFB12BC12456A1E025D4506BCB9D6DBA5E9FCE5B7333DDA2E4C2567CF6CAF3
+B4247A8B4724AD346CABF550B0048C3FE0CCF9972CCBC27DF540E8BF4CB21938731CAA4D
+95FC5E97DDA9572B4D80D4DAB8D1611045BD4D167AAC9CFCA24240CFCE5590CFF8292A6B
+BA2338FE074609B6E79447E9719C6E742AC8C70FD49F86799CDF01B6991F7AD227789AF9
+EEB32C33DFB91A6F5D0406560F8317D7FD29077F0247E018B8E3E17F9E45D81379031D9C
+1B0F488BDE49FC8A2EE6144858FA62385BBDC6B059E4DB9EBA87632108356196E0635846
+0A64BD1BD2C84B65D68CFF9C9F2FE26EDD945568DBFE2DA290A494C60B6518EB078BCA18
+4520D7A760473C1EEBB4D445DA7DB6B07CB64FB9DD54BE65CAB634DD2A84E9389EE0B802
+2B36DB3BE097C5B1BBC4730391B20177893535ACE5DD439EEC48BDEB1DC360841896BEA9
+48CFC8E52DBCD3395074C6A452E07CA86B48C403386B24BDCE0FA1AC0457E66555A37E6E
+B7F1E0C4DE61A8DFB64512F17C59A8146D8A696D9C78287348AD410C30C390346EB85479
+4A1B95FCA1A460486C75270009E9259DEBB8EA4DEA89C92A88E699B33BE47441D8531681
+2006CBC6A79BA334E32B9E8462FC79214050BF435FC8F761FEAD9C5BB2B43D478F2D9DF9
+8E852CBAB9D2027BA02249CF0D51A8E9E67FDB7216E1FB9AA19CFABFEE4FA7E750D51418
+82FFFEB96CDA1D70E30C522A46536000F848914EE4DB09E87C87D9D6A4139E380A8BB504
+DFAB13992E51643100EBAC3C643B0EDF6ED2221AB1AFA7CA0AA8638D487D46ADB2D87428
+3F5FBB88784F373B9382BF51B014B7BD5B1AB56E07708AB0F86BC92B19496DE0FA422436
+D58E13970762EC3F077B5A5D13F5D846F25EBEB1E5BA587957888E0C799991BC474FB65A
+0D8549E4C71979EF3EE15067F463605487328A1C0C43424ED2A8B2A708F882C1565370B1
+F34E3CDCFFD50B425A39D4D77E4462B211C18055E0C78468ED3EB67DD723E90565332C1A
+E2715A7C2280CE585A2C90C7ABC6498030690C6404042035E3409AE39DA7423922C05DF5
+89082510AE3C530C41B28346DFD3EA56DE3902D7628839573BA4A407A258630836526D27
+2EA67666F6DFCA7371964BD4A134D8C1636683C1541CA1EA1E3E0F21056BFCFFA1174DB4
+65D249623BC98DF5143D8BA83615803D8AC0331ED613FE6EBC2AA378AD31156CA35D3A64
+CE42EE3AA148C9D8AF84CC71C0C3D2903939962E4B8AE3599D65A430FC53FF8C861E6DB6
+3D40A050AD7DA591CF7022DAF4C39DDE990CBF87E5FF207682722E133B2ABBDEF737F861
+B8894BD16849E211B45863B0A04A081DEC99C417A1A868F10FC1FE5CD1CBF59E130989A9
+9A616B1E371E8E1EBA3798D93BFA918679C4F111ED67DFBDD654CEB0F013D051B5C638A0
+6A3D87E2D67A5B5778C85D591795CD3AF53C402497274ADFB41E82778862C8FBA2491348
+FE69F11A49E1530714290D270410C4176BF193FCB0B7A6A540E2E8DF659B55C31241A834
+2181080534AD74DB0D901E4AED75DC4947E76C6FFABB530216F365A8E15213E6CD93D442
+213AF03E5C31D88C13CA104CAC3AC8C61D7E013125A5ECB8F614F4C3D3119CAC6B5887F6
+6E0A3FBCDA41C9C70FC9CAD83AFBC5963BA0BE0359B116CAB3E22AAD48415912AB97DF85
+F1725B8CB130CDAA459C4B1160046DCBA8AB1492489A1BF0A78D6EE8856C3BF6675200FF
+01E4C1DF4DD6C5255EA056C4948ACCD662722BA288D24112584AA6FB8BB2556D3E387F84
+853E15C9BAF3A95D4538A77DCE6D87EFD432845C23BE92930E4C515524BF88FFAEA89627
+D063D9A0C33868D452E4C919E97A526833DAE1A520B4A73F799C0596B627F8D454F5D294
+3CCEB0F168701B3EE0372EC4F2053CAA10A03389D51FB0211E5A2BEC78960D9009C7F8A0
+1098E47636371CA07F63798C7D6D28F3D543B7F045C148151EE2875257505CC73F004DB0
+C80FA641966E382B93268367FE1A86E26A3A441987243402046C3A644F10604D63BBDB68
+102E44331F1289A2430C190F8D1C117915AA2EDA80DB1BF53034F5FE0381A8C86E91FD02
+C20FE7796311639A78A6354320109D59BD0644E07DC2D6E7828570FCEDD755634D808390
+DF3958672AE4430469FE4C749464393504B1DB4FF33A75FAB1A3900FB314E16B16E9EE54
+64FE7FCDB952C502C43EFB543538FBF7332CCCBDA721F15F0FFE3F8D07C3F21929FBDC94
+7585286FAAF20E85EEDA2F24FC7DD486448953BDA34005911B26C054F3F7DB8DFDB79FB0
+34467B2306B6B7C0DACC36605B902DEC41741AD0C8A8674A6EA9F084CAD9B8F5AB9C228D
+26A30D2072F564A9F686824684D6CAA6CE487EB1F180CAA1E0A05A22F09B2A652AAE3CCE
+14B0ABE95EA58FB109FA2D69F3E6888244F910104DF7849F2560C9641E290A2B58A90F62
+C6A712DA56D46787AA8B15E15E27BC88C3F597253A993E19D7150D4B5A4EF00B30912289
+2F912C9A985A2B467DF999F850068ED2BD6E601D8DC62DFC549EA79D707F964737043DD2
+71497FE7A62E6E17C4BBDC28D27E332A467C49B38D35FBBC078B755A1068BDCE06ED48B3
+CFE23FE250426E551F5081D8353BCA6F48C4D5E29C9134F728A77DC014CD81295E94ED5A
+3E4C5DE2E668051112C6D512E91B14001ED0B897F95D5D5CE152C743A34488E4EA5603E0
+8B500C5E8CD0F289CE321AC01262C00CDFE79EF7E5907106CC94B38B54998D648158BBBA
+896FF3ED5DB7D4A65567DE77202DADF99AE89B0A81E795AF26C989C0A268B7B3CFA38EC3
+E9F47CC72DE23783E0E98674871D632A80127EB72ACB44A32DDADD2826B7FD75DD34363A
+9802925456A9C75D1A63593D7C7A2CA85404C9AC5F17DA23D3B2FFA177740C9ABC114453
+9096CCCB278AD177AC129A12B05D1DB56B1C8B05F0232D28D33264692E4CE2C5F738AC0D
+DE16A2C22336CDC6836C63326BB6ADE37DFC0276440D4E77C8748915855D497E3E10B8DE
+5D1A6911242BCD1B0BA1E521359B5141DA815459BB250A85F1BABB939428B972367E96F8
+BFAD9A9A5DB65640FC2ECD1B8E012F437D156629605301F68A83022C66D55114E0A9E894
+0EC3A7D6C12574DC2F13C70C92B900560D3D2EA6271437F57ACFACD10998DD584134832B
+4DC51C207173824B4F907435F4579505CFCB0DE2710BBF9C562EA874BC4D1CD4443F367F
+80226AD929CD3CA7D903B0932EC58A6B577306F7AFAF505AE6ECF6204B7C22236ECC73AC
+87C5B84748ADC6DD20644B0F279AC21BCC70B0974B1E98B771203D6BA583EC68AE2428EE
+DB849E2FE9AB201D412779871E456021BF7735F59FD757D3B82A2D571D951774A231E9CE
+DB89DB0B00E57972FEC2BE1473464C965D9978BEBE027F4BA96B965C83C4642928F240C8
+C6E34605182C4D48239AD52DDEDB18715CC463E9DD9EAC3E423334E380B71D9E1EA2BC85
+6CA424B9289185505FB5230C10CC9AC1E7C527CB950F957168350E7A4690C52D4E994195
+36B5B2F662AED95029784FF3CAC75365449E8192103E85E5A5BBD9EA92BA1A33F5BF3C07
+F7E249904F35D98297A35761492FA533DFFC52AAB59C0603499710C9266FCE7AF71CCD17
+07EB519BF7561E6CC6CA964A091F944F1FEA70BADE12416C70CBCFDBFDECCFE17FC13DA3
+9B537FC4948C3EF99B33B5B77B575149A3B960717724D77B5A2EBC6FA7FBEAB74505EE9A
+120B384013684C4FC246E5DF1C72904C5CC46CD98C078E348C470C2D9FE80B26616BD146
+6AFF56EEF2BAE0409935CC85F9C0677DE18C304CD3D9D0C42E777920CCD17D3279923439
+734CD43F1CE70017603E8BC790B6536016436CCFFB47578936709527C3755581B365EEBD
+1E9DBBA2B305A64930C87E1F194378356E119B636D45F683604E22485328D19E2824DB1D
+129D57253A7589AB6AF57F56E9983CA2DCAB946D06863A9F85A860D1FA777212A8D2B8DB
+E7EDA1A901DB70F486BFF4695B3BA2EF0E443F87280BD82210335EA90A9018EEE52D9C3E
+26C08A82076F174B01DDA052C7BCF761E59CE04BFD12375D04392C73CF4110DF029F41C6
+2FB0C8D5275857B84E5F0C6EC2DB27679077CF1912AA522887A9D0DA75DDD0CDD726AAB6
+FDF02C2546D0721ACE715FF5904EE52F3B0469C6ECC767C1522C114B662857F05FB14890
+3E927D39BAF05D3D85F9D1E0CA8989D5AFA42F9088289998BD422E56C1556C5506D93351
+8A313AB966CA8AE369474E3C3E61ED6FCC1FD4E190E8DCDA65F4D6CBE86CD66955CB2DFE
+11BD578A277FC4CCD7C73B44029C4FCDBAE216863CB6735EDEAA35EB914EC8A6F57B0230
+AAFD580737C9DC91A39192FE58B98B0DADA0373E6F6EE30A66F664CA11F5E6D7BC221CDB
+E1039D67D317900574BCB27C5D8F3F84C5FDD49FFE5D8C1FF2FF160981BAF653FC44D19C
+33A2DD9B18497A3C1CC2A87AB080F39AA7B434360733F91D8815FE29A046F9C8EC1616AE
+1FFFCCFB9DE60E8AD1E2F9856F74CCAD5FA26A1A15D3B81613B2BECACE1A07F2A683FBED
+AB23D39A515FEB186715565F3732C663EABC8B0ABE2CEF70D9812DE0B8233DA1892D2F16
+E551650A097E6907331A6F06FDC0D159F08A8A1012FC9667DD421405B09BC488DBCD72B3
+2D15D54566B858C0CB14D7EB591EB58C4C61E4A89CCA95EA78BBF76BE3DE2FF49286F4A0
+41DCB403996B18FEF60A07220F6E0A3CD2EDD1492C93662398542BEC29453C3975C9E9B0
+FA0F5E3E5ACEDCE222D4D5A1A3DAAAD27DFBCC2EAD423D8D67A00C7F8B66682CEC168AF5
+52A639EC758C65DA1D296A4EA98BBEAA87358166BD3DEC7EF724B34A5BB440FA2CB36FDC
+163292CDF1BE9E828354CB8F9B28D17DBDBEDF4DB850126C4072CF9ED3C4D3A3BF7FA9BE
+5F6B6DBAD11DF57E6142122F9644C2915D4E915867F39A7BE786D1D2F1C9BF24ABA46D40
+E2DA32712FFBBB07529750B2FCFE14269DAAA3DCB17F88AF45048D16A54AEC645A87F7FE
+06A843E9D65921C63E7E9FD162ADCB84E0A46259A29E04734A447158A6501EEA3D40889B
+2DC9C945A3688F018C1BF849693A1ABBEDE397DF6E3DB71C1B4397E0A600E699B59F32AC
+9DF8C9AE80670204EF7BDC61F1AE4534E990DAA975A26F26B6E44AD026E5C4AF6AA8087E
+4F2A0BF2055B7B61C2C7F9140F301EC739252F755DC8572498FAB49F66D6C073C19593A4
+82155BEB06EE04D7950DFB2E67C6648C2AAAAC8727F83A5E195FE06244FDF8AC0334DCD9
+497AAA571DC490A3240F4CC4DC5F14BE0816E05356F75255072AA4EC6EF524E8A6206432
+3A268F4369290986496FB10FEA939AC4F6639286B6C46871AE21A24AFFF626774EA79961
+04E304E4AF97D4A154B151BEF4FEFC189B5C4A937B6AB0A16861C4FE37AE52A6FA70B1E5
+C3E72C69100EB33401E1C51BB985096BF3DE3229EE0ED44ED76C5338CEA2F39B405D4362
+AB8EF09A0648C835DACB5697B55FE97B699BC61F52229DDBE2673EDB704D7A48A323F63D
+121D25F4013609DD069FDEA816D1FD749098D2D9E16DB63BCE13DEBCD52DFBE3F062964B
+EDF5ECB154922C1E021DC13FA0ECE4629E6194BAD1DC165C96F7D764F6307AF084B2B293
+F353DC0900FE772A5A5F642C074B3D3BD52C5F1416F0B0D2365CA07A625AB7607F20C8B8
+AFB6B89AC456BB3C5196AC21E976438675FEB49AC93378048CBF69BDC0A028C5BAEF39E8
+C4B009B0CBEF2979033E55912FD8664E0116CD58213BED64359E5A68F01032FF733F8799
+258724D01A2E1B7953C19DAB829184601545011BD76FA53C55ADD11CF5568CFFF5A1CEAC
+8FE43EBE767045975029E210D481D6F0AB6E403546F1C72D4C17466DED4A0C8A071AA7F3
+C828FFEFAC73D46A1A461466CB132D0283DBB07271C0AE4E3917DE5FBB22A3C0CA6CDDAE
+A500192B7C7331EB1703A0020EECB68BFBDD927546068D107AEF60E2C9D7C77542D8806C
+C1BE2B954F0A7755A9BA1496D8C62076A5B49CC7B8B07CB10D966A223A7197B69D4CABD0
+64AD6E9AC671ED3A7BA87A3D605BA045A8AF1C3DE284B527CFFA9FC5213B2D185FD73E69
+9658DD7B97F479BF66710B13290CA72E16E8BF0C3E16222730C83706FDBFC39DE6B3876B
+C3AE08BB9CDC4A3F9904598F68F50375EFBB60E0E2BC63F20E4A133DC1A86DFA0875B3D4
+64DFAF465DD3DDD0323EBE52E5A7C6544CDBAC27B8001B0B7F0A219B99C547154302966F
+301E4BA8EF6A29D7B4F71CC91CEB83F567C4ED07F16308DEEAC5C10B906AEA5B308ADCEE
+93DD66850765EDEBE947EDD62749C9DD4C22D81D7310F6700F49D55AD6DA522A30D87088
+47B08459299C124E9C5446D5A01EFFFA7A1B9C4DA0184DF2F9C33E15092C9B94C6A1A152
+38BE2498B202534CADFFD96216B5BBF0A8C93F5FDEF9711A38AEFF2D2487944ADAEE7FD5
+1C4B1345D11030312AF66BE535150F3D944CA32B86B318713C4DBC8CC39C425E3D939C3A
+BF93F86FD924DFD1067C1A692A557DA5E2E12F7E620FFA9497353D0CF34824B467FDAF82
+63E4B2CCA0B3FE909D5C62A24733575FAEC6892CD7883F09B2476C1796D3D19D89AD2B5B
+6AD25BE6920947AC99CF196F77523D2E52D639107D5788AE985F9C59E56895317DC8E3C9
+44B05744201FFA75CEC2C0C1B88BC01AB444D0A63967C93CBB54DD6248D8A2ECDF906D65
+E03BD0C920DC424755EF7DBFCD9E75554D139FA38969E66CBF914AFBF161E24EFEB3D5D2
+3684BD113C1BFBC3DBDDA1DC334C79A4372D1B2943AA534393C0FA8BF6DAF9A89F6A941E
+A5234C56DC788AA8FADC705FDD87B6E47BB5C6A175CCDEC1E4C48DD6C8425103157ACCB2
+70D3E54D16E609280F511A5F7358B9EF8DF16E69C970F465EE188067C619BC80EA9504F9
+4C55667F7AFA8614C87514EF2BAE3F9A556607F1BD4E686D161E3B8F2ED6D7C056E7ACEE
+24D78CEACB7DC5A70AFD13D815612483409C6B3F4E736CDC0DB3AD2637905D49D3B18BC1
+531F98F22F268DCC658B4A6A263A984046D643EAA1BE3FA1A0AB42432D7214F2D67BF68E
+C36481229EF94AA4D99117E5DF72DEA397FB16F71E00AE1EE676545E647B2E5BA86D6C41
+0F0A54B270FA6F1C0970586F3FEC2C9F5FB23C6EFB6A7A982BAA45F50135BD1D46B3CA7B
+134C3CE39F195A447B23EB3532EE7C17A03CEAC710B45FA419D022EE4D59E3D03ABCABA2
+6D5854BF6FAB1494E0817D1A884DB4EE52A230BED371F18B2E8BCBD78AEF92D0EDA42497
+FD3278222FD696B07713A0383FE3C6A1485950B6402E43AFD1C293228E17CD9BF76788EB
+EA31D28DA718A19DBF5908DE8B9AE27F1F74A5EE23859901E47BDD323385C3412A2FA672
+8D542AE01690894A02FC14084E48389F7DCFA93AE87BBA8B77C766394C46F8BC3103A69A
+441D4BB7035003E242663D2E2DE99AA7CB51EB473C3F4DCFBA36F1FA0A6242736A73FBCF
+2DCD98BFD0031485641FAE1501B92680A347059ADA5526903E7B2EB28582010A0816A93F
+8A921674C87EE149D80820C859E8383D1E27B88665E1919D4CC63FB38A162581D08235E5
+99410FDB67D6113048EE02BA570DCA25FCDFD216D5E609BCEE6844506300BAA6B0249547
+C5B0EDEF6F01B97EC4996EA1E997211294B55779298AC81BDF612FED978BB6A82FCA144E
+455B41746D2CB7A468324DB1D179BDE9352ED8729488623F1F4F6B83609A425F12374F2D
+A058510E997DC7BCED1C4D00F1BEEE0D7CE92C99287B965112994FC2A0EAD8A6D48C8A3F
+37D09BEBD6BA74F344B4630FEA04951CC3D320094CFE066A9D1563984074A678701A51FC
+B379148165AC421D4FE67C2046F98DFC638366E55B958FF6753E24704BD9EDAB877CAEFB
+6C6CCA8B1753940EA08A3284DB2F831F5562F4BA152D94DB9B755AD4C61E482AA018D160
+020A03BB441DBF1A0158E19B38E85B3883AF7C8F4ACBA54A90ECEF5360819159F7B23A49
+7A6D75B0CD2A23E5F94718B45550EFF77318CD7E81BC64B67876867114340AF64CBEE039
+709FDD10EDD1D841F43724DD464501E523D09BFB6A6674DAC7AC4D7D8A7D4CC8DC41CE74
+5EFEAE2EBB03189D6B908195CF644E621E1417FFB8DB507DDE8121EA5CFA4F86FD1D4E2C
+032666342DE81F4B4A726D9C2E053BBBFA8E6EE04C30A9A38A6667AFA346458E8535E6CC
+D7D81614AE3828AE428BBA8272C1A3D3118AC00DD852B112AE85217F21BCCF879824764E
+5D70F17114F256D71D0E865CEDFCC39759962AA8FEDBA34AAC01DAD722BB4F0F26D69660
+A5886F0B58EEDE6FCED9DD72580EB3D345A3519FE4B20CC154FD4C9BDB92E9CF953B5108
+6097A5DA323B48124F004AB16035D5464B37C5C1F115DE6F9D67D42D179C70B42EF8AE2B
+533745B020D0C27E662446BA2E2704FADAB63CD2EA88895F06D6A65ECC9FA7AA0D904734
+66E3EBFB475B7DE4DFC639B3C1F24F1C8E15A6CA4C0B890EF2F848925EA54372F662A899
+F72A0E658C8812C076C1280C0321493AF73217F48C189F3D5B05D590518CB5BBABB38BAE
+7DD209BA73C47638BC2E125F686B01D0B69AAFD1579EC5EEFEED33365B0B389E48B5EFDF
+8480E6F60ADC2B291FBFDED2087ACB94658B3AC91DD89B27E46DF498C586E74E9639FE94
+3AFF60352BF9B9CBD6D747EE9EFAD079F13F362DB2B3B6BEE70D0769C2FAD11E578C753F
+AC2E13246D0C1EFD8DB91A72DCAFD2837288B2694B7F98D85189750A8ED83EFE24AE7DE3
+C1E6143CAEFDC3158A89432E6CD0D7CF76FD01A37FB632E75DE7E978A769A78FDCCF8DE7
+189C25EED67C42D17922B2E7E0ECD02A12148C847BBA0C7039F7641271048CF720B62657
+2C90A8E734EFF686CF8900A56CD1BAA4175FE1D956C8E384E8639B27C7DAB95EBB6D7621
+8E2F4FB19733E3D2B8453BA19542338BB677AD08AF33DF746BA3CE6145589106E8BD6402
+92DE977B8B647726A522ACFB9D608F3A2086BC0D571777CDD16B7C67D6DE8264400969B8
+4283A29AAAA9CB965CAD70F6AA8536F10CAFC0F011E6771A5D026203DB34BB67B643CD53
+3EFA2E2305C70B64C49BA305C99A861D4985510371FAABD574E293029616F056E690CE15
+996B9231BC5274AE3436797415A1CE9555B9CDDFA5B5B2CF1D52023D6B59F205050B413E
+D2835B8879EA5C14241C8D4157C05B863F02E7F53067CABC864508C3E4573EA3DDAFD85A
+6EEB9D9A4E4C20946F1CB9BDAB6FDC5BE017765A663673A7FA93212C4FC4A3A0A1D3DFD7
+536579D8A6AB08A3F62C4ED9902118938B3324EC14EE509465DBA5A7DB37BA6F461A9748
+82CB3F7F5AC826A622711A3DBBA6F9F6CCE8F9151E5B79AF081519224F9C7926249AD1AD
+E98017B2C724C5C4D2E2B43DF4A581CD906FA42F734E0F006D4E2FA48FB27DF408F8BF48
+0975F73FBE94ADCADEBDBDF934E8B079732BE957C5F64CB95368B6BCB0914C4C6C4B1343
+CC697E1D56C5C8B6396652754A621ADBB8F76215A0291176C92420502063A45F05A73227
+9CEE6B197E37062422C4715B195B06626F753F3441C83409193A43596A40B14B7A627D2E
+8E2DF6A3B6599BBF3E189C0975CBB8AAD384AD51A92B04DF688C7ED7F381A585793A661A
+C57A6FD17944B8F8AB511D4783F1256F598C23BF09EE63531F7802EB86AA57BBACD6B35E
+C0FEF97D7969F5B7FD1BAE7161D512815C7A99E6949B3DCB42604F2016EBD5A8ED4E65DF
+39B0BCE9F1468F0CC6F8803F3016A4C409B3C06688848D6BC42C5458B22954FDC9AC300E
+0CA3350A57E31D536BCD1B430B54939B1D9F6FA179470042555981891ECDDA2279273FC9
+09F7284A182219E9E488CF5BBAD809323DFB4F8BE7677771CD7915E46FE2D471A9BD0667
+7798BBFF9030135542A72ABF81B773F9B8CDA74427A947EDA4CBC79AB74B960E983C7AFB
+DC6ADA57F5284B278048D791F6BDA50367DF7093D763BA62BA5ACC0820BD593EC2C0FAA5
+7C698F2052CC1389F4449529C0BBB5885647D6B14845D59A91FB46E556D14882DC39146A
+FE98351D0D93486967B8FC121DCF5258CEA66C3A156CC055E60B2FCB147BCFCEC5E5D3B0
+1D5D4779B9C04F4F6C6C84EA66C9A3058FDD4F4D0D9BDC64E0667700A1FB54DC6949E547
+998A33320E0BF8739956DB6B6C1E79498CE81E3FC7666C8B63CB129172714628D1BCFFD9
+7302B93F7712FF9548E99043B89412D71903E6D339936295157B29C3CCC79FF43ABA8A7C
+3D118BFB3C6BB430BD0CE932751792EAE59A1E1452F44006DB57B741BF8E8FEBA824624E
+748C719D448B56D657DBDA89504C3C59B2A8F52D193472E004DE32E77DC04BEC1CBFD555
+141E7CF9968BAFC38CC322F734EC9D1A77BBCA1C7B0443F626FCEA4A1B000EA5250629F0
+30FE73ECD04A99D3FAB80CDB3B7E35B2D66EA563E8B552C0A3AD1A6080B91F4A72CE9437
+E23FC75D146BF9CD75908321C433E1D740CC7E4536F3C1B21786CD40EEFB1272421DA616
+40F2ABC43EFD01B9C8AD954B9223B0D58C5374AF7ECFCC8D92E729A78887BB4BF4B3AA5D
+FF0F0275523EE1A8C507E79A7E778575FB9BD2C68D573CF1FE4DD89B70CE0399B534E06B
+98D44CD700BDCA211B0A79CCA45FB7F6CB6DF389698B0279CFC9A686F84CD102B4CFF224
+B9712D26B8F6EB004413A729A03C13DB1793538113F314EA9A421957A71A623108717C09
+E231F3B418DA57E6B74F591B1AC8FF3135E87A2C0E17EBC0DBFEB9E060460528DAE4BD95
+D4199FF544176441856CF2162998BB9CAE3327BE0B0331B2DE7FCF6B8F1156B34754BD6F
+E668A096BD8762482D814CB5B66C98112FA8EF724C1A271D47A6043E588BC5F963172F39
+EE634F4D433C885FCDD395204ABF027C55210CB8B733E36B465359DBDD074F6ED7D917F8
+C2D8DBC8E7EFA564CB194ECBB5C03E60254143E15AE940670CC156A6C40F8F1937FB8697
+3AB99C97CB43E2FF36FAA721F2EA3C675E53FA12CB838E0A40921CDAE8593E466B7BDEC4
+F7777CE4B9A7A8522414BEC29E7EFCF6A4FCD8CF872D5825A8743841C0AA881B2F4D293A
+C2AB4CD36A780A58B20F4BF8557CA8DB5BE772B2790FDEEE20D30161FE5897DFDF2749B9
+018AAF5031017C9405EF04CA4F5FEB1C62F48A1536550F2D07625F84EAFC567FF88D0B9C
+BAD85C30AF56163470ED619CF33C32B032A0DAEF5BD0F3FCF08005AFD8251A0E8FC15ACD
+4D4D6CEA19F5BEE36E14FD91942E5284F635F6713043D4CEC1BF5E80703867B963DD0655
+179ED91BC2A94EDE291B2B34A1B53F7464D475CE3844F61B3AC34B258CA202B1BCDCCD76
+F81C170704E741156833A14E84120C10D4974D98F9A64967658236F3796A15F4715EE660
+F4356DAF786522D829D5F64AC39BA6FD4A5F9831A2B180DD76983D6B3510332A1350EF68
+DEE95CFF7E22D1DFA1B83790DEF05713733B2C98678810D1B863B2CF11AB0DBF62327741
+E4541051C333F43542367B4C0F581668AEDD2E5071436A4A50D07368F4AAC3F6FD25F903
+B11AC0D050CF88AE29928516A369C963116DC58E2984D7849E0F12F40E8807332DEE7642
+A44A4D1C9CF9E4CB01C819EDC63E7986AB3907C825886127E54D643F429E63EAA62C4655
+E12459DC40DA2216FA76ABC1F62206D6E26FD74240B67240F0A59325EAC5815493A5DC32
+2F936D086139C334BB102BABE70008D39BABAD2E8DFC7F6556E8916C8071F414A1468232
+7D430B20BFC0DCFF09A05DE9015F95CEAC2B33D3269977B04712AFAEAB6A0CF1DBF151A3
+C49FFD79DF318A96E7AB3BF9916F3B63DF6FFB63BF6B09637D02AA5DAA4DF410E37A52B4
+D24D93659CDD4F8D093E7DCB77A966B065991F5D858ABFD24E7CF353A29103BDCD78C5DA
+C279A5EF2E66AF66B0BC5705E0F445FDEE26037F5712BA69958866259B47D7A0C6163932
+4A519757D0DC2BB945F4D54F2A948268F023AC8AC93DE6CA49A8B69FAD310DA292BF34D6
+72A4F5987A948AF5B3077F9E3AD60772A97ABF83A28A7E9BB2F1C49DC533AE9F157FB9BD
+7F226B58103FDD5C38E599483DE93D923B8184453EFF9DC237BFC31417AD09117009FC8C
+87391FB0BE7E011336228D81198B2E23C51EBDB26CC8D976978BC2C3BAD7418504BD30AF
+AFA333E52B306B25E1CAC2D19482F4C08D57E68D8D6F152A6AF4A83FFB3DC6079CDC7D6C
+62D1625CCF55B0D84D1A381EFE53F6FC0A2D3060DC19B20BB71DF70598304E430FAA9735
+6FB0CD51F28FF859E07F859CC2DE30D9B0C61443A68341573857D03E3B17DD1DA6BFFF7A
+15DE805C05B6C8D0D38E105836BC590A233EE35C9035BB23384A48257D36A79A525CB7AC
+AC3DAC11B4C78ACE64F5148F0DF009C79D7272AC879D9647C9ABC2EABCA007E955CE3C80
+4EA43D8F81303D9C4DB7039D84A7214D1CAB1DE644575612CC4D96B6A12EB9FBC47223E9
+1EE4A38BEB3E44B70FC03A1AEF6D55EBCBAE8181F9FED9BC352DF768F5C1204D16C73B18
+612C48FB955DA7E1ECF9A38B13182D8782F55405299BFC1555CBC1C8B2D3187824572BAE
+2FD8B7D7A34FD5A2B31A108DB5908A94C6161F8109124E4210F38D53217A9362A384CB0D
+9EAA16DF6A30580E8CCAE71152F2A0441703175C90DDB9D3D4AB8886199B14B38E846DEE
+9397794CB3B0E709139EF09B4D1F39F406E46AB7780A496C04B1D058A7AA51D09F35F6EE
+DCC2720D34EC9F7003E4FDD48D09FA67A5244F461EF4D8B66970A990E992285CFD068C25
+F3C5734C6FFEFE7C9D1CA87E9829007FED4083A1FFC8025F8D14C270D95581A2F46D9869
+FEB681A8C199E8BF2C4D13525709FD0F0215B818FCE1E5BE59EC4C2B455283EC6A7BC5B0
+5ECFF4F4A80672776C20B8C09124D3E0D0A5B2079F7F2392397D7E0CADFA288391347454
+487F1EB52262C53F30D1D02F5C2D2B3B810A76BFFC4286408F772ADABF1277E19031703B
+676FBCE5DBEFB35E53D5B09CA9549E447EF6B5F917B080CCD466FE5AD1286A0982F6B04E
+8CC59378BA5F999CC7C1E0899E69F7629BFEA7D2642930F05385A7767AF2CCA54831D0E5
+3A78C373A52D8A4987265DC54BCCE9DD3F950B18E4B4C6BAA653BDCCAAD9654A64040C5F
+01B51F1C6E456259954739FA3E632CDCC78E1B7E5B364AFE33CAC76B56A8E68D260B8880
+7B15AB439AC1F9E379C6492257C0BDC14BFF623B2406EE4C0820E06D1498E862C69A60E2
+3333D7678120E8949F1552505F8D9234604CFCC2C0AE4361FE33C3C2792F33618099B296
+6EC69B58B589B11AB8F3678A797BBDB5D40754397873D41EF9DB3D26405D5D0AC64D4331
+31147C38F40512F63D63D21EE432D19C566A9FB62F7E1343990F5B6A1A45B0D90AA9276F
+35C1C7E2DD322A7B2BBC758B7748703BF28CE1E4943C3C956831147297D4D23446BFA194
+92BCEE0AC533F7A1776365299F1E8B9727687E1A0EB7942D8F20C402372B56D951CA9268
+5FA6931EE0CCC3C4D6DF269B0AA6A9969A86339482F9B7B20FC245CF284B6C1787F8712D
+1B7A5893E8E5B535F45321AB2882960A3A3D660E624BB68F5E453519F07B307408016AD2
+ED623A7931F3C25D16C55BC5FF05A37628B354B347FD0DAC5FC7088D20C777E86C51D541
+A8A73D729E43F798F473B36C1526A34179A34871626FBE64866A20247BCE6A0B8EC16CAF
+7F04892C3265CC2D2ED7122E3583AB662F3FA612643382A8B071B052BA7BDDD0D17F3787
+B73678342F7AC5CB452C24A1ED57CB976E3B0E0AE0E1F7BAF615024BD874E65AB8576885
+00D2113078A44D8FAA468FAA53C39330E480023E4D901645F2FF3DC69735CE5109EC5648
+A58BDFD166B5410B1C52A19AF5EAE5B335621FC6C3A636E63E808502BCBD39C1B18B3D78
+D53DFC209664485C2FE7078A4C1ED53DD25CA9E4AF287385DFEAF67180F66A7D924A1C1D
+A48309ADDBFD9EEDF2E0FDA513779C7D4E14BDF49DA3534A6F0CA66093CC884F778AA14A
+EA804C43C94E6609CB1BE12A2EE09C33FC455C10BBE8F1A86E37469FC84D3D36FA92BD45
+70C7F34664353C1E999D3C684A7F57A920FB1F3CB2C6154674217E37758B75FC3BDE0644
+6EB5DE501F7B33232783F18A0743EF63C6153BE284BB9CCDEB5EF3F74127F5157D997376
+31A4CF3706756E9C273BBC8FC91890A13736BF03B0965BAB474463EB51A222F20D4C0DF2
+7101ABAB804A6F2D1A2EBD713DF7787319A520F06942F0234D8B8F75039E8C18147590B0
+9895FB4AE19F8AB3CAA93D77ABBA7FBEF6450A5C32A5D2325D26C79BCB3A5021D4DAD6B0
+D998F7B05E8EEBDCD762E972126AC5A831E3F2840D1E276AB173580CCEA003D28332FB26
+CB301880CDA511510480FFFEE849CF496079757E89902141277143A0D534B1C43C77FCF7
+E07398191EEFADDED6A222577BB9BC144B0B9E4B3894DA1B1A8CED51BADD8EF33C12E7C4
+83A4B1A32E8154EC7DC52E935EEFAB25432330A5959A5FE0898B3C3729A953D54F31CD43
+488EB4A0C2BA351E00EB0F41733E1231DE089B5183E6611B6075639E3B221641B7C4FF3E
+B67EF531C9DD81FC4B1B98490C6B4050619CF6594E126D66BA0F2F187C229AAC7D69D8EA
+937DE324990F72E47B9DA3C90C05D8D0A1F08C5EDEC145436D9FEAF82D27051F8BBD5D5E
+249498A36AE396CB1D848B8250A8C005DE98907FF3B4BB16C62F4781A605EFE61B0757C9
+8FFE6F65450556C59F3D0E51ABF63DFBDD378BB94E12CD21BA4413FC05E717DFD54CC63D
+AD68396CDC334446B603C826B5CCA1A06959F355E54CCAD7118E492471C60ED383E02ED1
+D95CA17911FC3271B6088A3C09205C1A8B04B3DAC2C8E92199FCAE0D3F0BA09AB1CEB719
+004A936FEB0E35166591FF051461B8E19671216EF16AB67113878C3C5D6A3D7D810E2C1A
+988D519672C21E7D711389CDDB6DE03EEEC77A063E0FAB6893650DFC8D041B316711D922
+4B622FFF02FFA06545F5082BECDF430B69E2F839C9F1D3AB53E1FBE68F778F7EA0D4E68E
+1ABFAF43139BF00FA4A306BF5D6ED688702A3ACD7B6A8E607402D45EFEEF86E28272A142
+6A7953C2DA42605487328A313D3264191C127014A613FE97806901D12A94A7CC6437FCAF
+7DD14D33F2937C7AAEFCB2B07B45DE22D60C8ED4C0DAA5039803870A0CE4AF90AC3BB9B3
+248033B297B842044DAAF16C0479C8A3226A999EFD0FF6FDCF8BB331E27445F7B6B27EAF
+3AFE02A75318BEEFD57CABDCA3BBF53C734E489AED62313E29CBF47634E650D26F95F243
+56AB5F5A7BDC0C4ABBD0373FAB6056451D9F6863871D49019012FCF90BF30DE0CFF003C3
+37E21A9BB502F37F24E599C882AC03BC5805850E189AAD1BBD869A5C713A44B13D853403
+D7BE84885E9E3B8283D972FE7E891F3FA1C3D785EFA99186F0C4F2D6A71BEC5A4537C4AA
+0EE42126B49831684BCC2992316FB29E20EACB2AE0C0AA6AD22BEDE3394A19D1FBF0F899
+3C3AE559AC6E998BC28F148C9E4FFA70B343EA64C05A17587B4DB0D4E1450C3B55D35C0B
+BC0F9ED68B669176C5E110276E295D632B712925DEF6F46B6FEFC7DDAE8904EB2D890AE7
+F7E514330EEDBCD45616B620C6514529B426B8C2DC4B0F302330662112B3F41F2A7D6B08
+30C7FAA87E0A41B5B37A166A0ED59572A98FC99E7B79DE270DCCC068A284031D8975BA09
+C5B8865D24586EFD7669E012974B4B7FAE26ECBE5293BF8059C9D41616E5CDEED6774E9A
+9721BFD35178FB026A26DD2EC8B2A17B712129F18061B25BF34D75EBE8751EBD7F103464
+8FD62A60EE0BA9EF57C033DD35261DD3FF832F7759FCC67C5DE884D6A75087D1902CF681
+8241E6B1224B0515C5BA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
diff --git a/extlib/inconsolata/Inconsolata.sfd b/extlib/inconsolata/Inconsolata.sfd
new file mode 100644
index 00000000..3415c8b9
--- /dev/null
+++ b/extlib/inconsolata/Inconsolata.sfd
@@ -0,0 +1,5730 @@
+SplineFontDB: 3.0
+FontName: Inconsolata
+FullName: Inconsolata
+FamilyName: Inconsolata
+Weight: Medium
+Copyright: Created by Raph Levien using his own tools and FontForge. Copyright 2006 Raph Levien. Released under the SIL Open Font License, http://scripts.sil.org/OFL.
+UComments: "2005-8-26: Created."
+Version: 001.010
+ItalicAngle: 0
+UnderlinePosition: -100
+UnderlineWidth: 50
+Ascent: 820
+Descent: 180
+LayerCount: 2
+Layer: 0 0 "Back" 1
+Layer: 1 0 "Fore" 0
+XUID: [1021 77 1780377399 11264577]
+FSType: 8
+OS2Version: 0
+OS2_WeightWidthSlopeOnly: 0
+OS2_UseTypoMetrics: 0
+CreationTime: 1161020814
+ModificationTime: 1234036730
+PfmFamily: 17
+TTFWeight: 500
+TTFWidth: 5
+LineGap: 200
+VLineGap: 0
+Panose: 2 11 6 9 3 0 3 0 0 0
+OS2TypoAscent: 0
+OS2TypoAOffset: 1
+OS2TypoDescent: 0
+OS2TypoDOffset: 1
+OS2TypoLinegap: 0
+OS2WinAscent: 0
+OS2WinAOffset: 1
+OS2WinDescent: 0
+OS2WinDOffset: 1
+HheadAscent: 0
+HheadAOffset: 1
+HheadDescent: 0
+HheadDOffset: 1
+OS2Vendor: 'PfEd'
+DEI: 91125
+LangName: 1033
+Encoding: Custom
+UnicodeInterp: none
+NameList: Adobe Glyph List
+DisplaySize: -36
+AntiAlias: 1
+FitToEm: 1
+WinInfo: 64 16 14
+Grid
+168 917 m 25
+ 406.5 917 l 25
+EndSplineSet
+TeXData: 1 0 0 629145 314572 209715 554697 1048576 209715 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144
+BeginChars: 359 294
+
+StartChar: a
+Encoding: 97 97 0
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+SplineSet
+115 467 m 0
+ 164.456 518.083 232.512 541.055 303.925 541.055 c 0
+ 386.091 541.055 453.267 510.995 488.008 453.097 c 0
+ 512.442 412.375 514 371.39 514 328 c 0
+ 514 0 l 0
+ 435 0 l 0
+ 435 58 l 0
+ 377.24 10.665 309.94 -13.0023 244.918 -13.0023 c 0
+ 134.316 -13.0023 66.8187 59.1626 66.8187 136.825 c 0
+ 66.8187 195.507 104.707 257.379 188.205 288.065 c 0
+ 255.557 312.817 339.023 312 417 312 c 0
+ 434 312 l 0
+ 434 331 l 0
+ 434 359.055 434.409 393.114 416.772 422.078 c 0
+ 401.83 446.615 370.745 473.031 307.869 473.031 c 0
+ 258.955 473.031 199.358 459.393 156 414 c 0
+ 115 467 l 0
+437 248 m 0
+ 418 248 l 0
+ 362.991 248 292.114 251.465 244.035 239.987 c 0
+ 177.665 224.143 150.668 180.909 150.668 142.456 c 0
+ 150.668 95.137 191.681 50.8142 261.864 50.8142 c 0
+ 331.199 50.8142 381.823 92.8437 401.058 113.287 c 0
+ 436.77 151.242 437 185.578 437 213 c 0
+ 437 248 l 0
+EndSplineSet
+EndChar
+
+StartChar: c
+Encoding: 99 99 1
+Width: 600
+Flags: HMW
+TeX: 99 0
+LayerCount: 2
+Fore
+SplineSet
+539 442 m 4
+ 480 373 l 4
+ 470.825 379.924 477.126 390.809 472.703 399.753 c 4
+ 469.634 405.96 426.164 469.074 335.78 469.074 c 4
+ 238.504 469.074 160.969 393.768 160.969 273.126 c 4
+ 160.969 149.42 239.6 62.9789 342.756 62.9789 c 4
+ 395.811 62.9789 447.209 86.4429 483 127 c 4
+ 531 71 l 4
+ 480.516 16.5812 409.687 -13.0011 335.781 -13.0011 c 4
+ 186.048 -13.0011 74.9996 104.892 74.9996 264.509 c 4
+ 74.9996 423.38 185.476 540.028 341.051 540.028 c 4
+ 426.18 540.028 497.315 503.103 539 442 c 4
+EndSplineSet
+EndChar
+
+StartChar: m
+Encoding: 109 109 2
+Width: 600
+Flags: HMW
+TeX: 109 0
+LayerCount: 2
+Fore
+SplineSet
+54 0 m 0
+ 54 529 l 0
+ 131 529 l 0
+ 130 477 l 0
+ 154.337 514.017 194.92 542.056 238.342 542.056 c 0
+ 285.783 542.056 323.7 508.722 332 465 c 0
+ 352.564 511.823 399.84 542.002 450.616 542.002 c 0
+ 480.394 542.002 513.14 530.575 533.429 499.943 c 0
+ 556.856 464.574 555 419.808 555 376 c 0
+ 555 -1 l 0
+ 476 -1 l 0
+ 476 375 l 0
+ 476 399.068 478.585 429.361 468.835 451.652 c 0
+ 460.274 471.228 443.933 481.204 426.805 481.204 c 0
+ 394.659 481.204 374.014 448.262 365.249 433.479 c 0
+ 345.703 400.513 343 377.821 343 350 c 0
+ 343 0 l 0
+ 265 0 l 0
+ 265 368 l 0
+ 265 389.832 266.608 415.372 259.774 437.513 c 0
+ 250.804 466.572 229.599 478.297 210.74 478.297 c 0
+ 189.54 478.297 165.885 464.471 146.732 428.907 c 0
+ 131.729 401.049 130 377.928 130 353 c 0
+ 130 0 l 0
+ 54 0 l 0
+EndSplineSet
+EndChar
+
+StartChar: s
+Encoding: 115 115 3
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+Fore
+SplineSet
+511 459 m 0
+ 462 386 l 0
+ 459.954 386.487 455.921 388.387 455.967 395.318 c 0
+ 455.994 399.389 456.754 402.17 453.49 406.383 c 0
+ 433.342 432.386 382.005 479.074 306.539 479.074 c 0
+ 246.687 479.074 195 449.386 195 406.786 c 0
+ 195 389 204.202 363.327 247.446 342.429 c 0
+ 296.926 318.517 382.175 306.563 441.996 272.983 c 0
+ 504.635 237.822 519.699 189.926 519.699 153.285 c 0
+ 519.699 73.3785 444.137 -12.0003 299.462 -12.0003 c 0
+ 219.049 -12.0003 138.142 14.2177 76 72 c 0
+ 124 155 l 0
+ 129.709 152.331 129.203 145.694 129.13 144.104 c 0
+ 128.917 139.47 128.401 136.208 132.349 131.72 c 0
+ 149.099 112.681 207.222 58 297.964 58 c 0
+ 373.592 58 434.068 92.1676 434.068 141.757 c 0
+ 434.068 160.887 424.919 188.765 381.245 209.208 c 0
+ 342.194 227.486 283.74 241.548 238.968 257.732 c 0
+ 210.234 268.119 109.997 301.799 109.997 394.231 c 0
+ 109.997 473.3 190.548 542.004 313.496 542.004 c 0
+ 391.8 542.004 462.083 512.905 511 459 c 0
+EndSplineSet
+EndChar
+
+StartChar: I
+Encoding: 73 73 4
+Width: 600
+Flags: HMW
+TeX: 73 0
+LayerCount: 2
+Fore
+SplineSet
+112 722 m 0
+ 470 722 l 0
+ 470 654 l 0
+ 327 654 l 0
+ 327 66 l 0
+ 477 66 l 0
+ 477 -1 l 0
+ 104 -1 l 0
+ 104 67 l 0
+ 246 67 l 0
+ 246 654 l 0
+ 112 654 l 0
+ 112 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: o
+Encoding: 111 111 5
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+SplineSet
+543.113 262.304 m 0
+ 543.113 86.8043 430.326 -14 304.969 -14 c 0
+ 171.548 -14 56.8677 99.5323 56.8677 260.578 c 0
+ 56.8677 424.14 172.53 541.005 307.44 541.005 c 0
+ 427.751 541.005 543.113 445.084 543.113 262.304 c 0
+301.758 470.103 m 0
+ 220.795 470.103 144.985 397.575 144.985 267.806 c 0
+ 144.985 137.225 221.249 57.9927 305.614 57.9927 c 0
+ 382.884 57.9927 459.167 125.6 459.167 258.844 c 0
+ 459.167 404.202 378.128 470.103 301.758 470.103 c 0
+EndSplineSet
+EndChar
+
+StartChar: n
+Encoding: 110 110 6
+Width: 600
+Flags: HMW
+TeX: 110 0
+LayerCount: 2
+Fore
+SplineSet
+89 0 m 0
+ 89 529 l 0
+ 174 529 l 0
+ 174 436 l 0
+ 212.871 495.002 278.12 542.003 349.957 542.003 c 0
+ 410.281 542.003 464.544 508.129 490.899 448.568 c 0
+ 509.729 406.014 510 362.334 510 321 c 0
+ 510 321 l 0
+ 510 0 l 0
+ 428 0 l 0
+ 428 319 l 0
+ 428 356.393 427.762 401.823 399.11 436.061 c 0
+ 380.097 458.781 353.908 469.58 327.341 469.58 c 0
+ 271.362 469.58 220.49 422.787 200.308 395.893 c 0
+ 178.287 366.55 174 340.651 174 305 c 0
+ 174 0 l 0
+ 89 0 l 0
+EndSplineSet
+EndChar
+
+StartChar: l
+Encoding: 108 108 7
+Width: 600
+Flags: HMW
+TeX: 108 0
+LayerCount: 2
+Fore
+SplineSet
+108 770 m 0
+ 342 770 l 0
+ 342 67 l 0
+ 498 67 l 0
+ 498 0 l 0
+ 101 0 l 0
+ 101 67 l 0
+ 258 67 l 0
+ 258 703 l 0
+ 108 703 l 0
+ 108 770 l 0
+EndSplineSet
+EndChar
+
+StartChar: t
+Encoding: 116 116 8
+Width: 600
+Flags: HMW
+TeX: 116 0
+LayerCount: 2
+Fore
+SplineSet
+228 671 m 0
+ 319 686 l 0
+ 323.069 674.25 314.74 667.101 312.438 654.7 c 0
+ 306.99 625.35 299 530 299 530 c 0
+ 472 530 l 0
+ 472 461 l 0
+ 298 461 l 0
+ 291.31 392.178 287.955 323.066 287.955 253.871 c 0
+ 287.955 177.138 290.735 156.77 291.356 152.111 c 0
+ 299.829 88.539 340.908 66.6734 380.424 66.6734 c 0
+ 413.027 66.6734 454.079 81.5989 499 115 c 0
+ 525 49 l 0
+ 480.23 16.2302 418.815 -10.1214 355.783 -10.1214 c 0
+ 301.714 -10.1214 260.342 10.8883 235.238 46.2593 c 0
+ 204.429 89.6687 204 142.866 204 190.358 c 0
+ 204 280.259 207.611 370.358 215 461 c 0
+ 91 461 l 0
+ 92 529 l 0
+ 218 529 l 0
+ 228 671 l 0
+EndSplineSet
+EndChar
+
+StartChar: e
+Encoding: 101 101 9
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+SplineSet
+309.698 542.272 m 0
+ 396.487 542.272 495.286 496.221 519.331 354.102 c 0
+ 524.53 323.371 526.211 289.371 523 253 c 1
+ 147.298 253 l 1
+ 153.598 94.4857 256.131 55.4411 326.953 55.4411 c 0
+ 379.589 55.4411 429.496 76.3575 464 115 c 1
+ 510 70 l 1
+ 464.675 15.507 396.045 -12.143 320.487 -12.143 c 0
+ 176.7 -12.143 66.2985 82.2264 66.2985 258.611 c 0
+ 66.2985 451.856 183.262 542.272 309.698 542.272 c 0
+150.008 317 m 1
+ 441 317 l 1
+ 450.942 402.839 389.68 478.169 303.883 478.169 c 0
+ 247.072 478.169 166.495 441.85 150.008 317 c 1
+EndSplineSet
+EndChar
+
+StartChar: space
+Encoding: 32 32 10
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+EndChar
+
+StartChar: b
+Encoding: 98 98 11
+Width: 600
+Flags: HMW
+TeX: 98 0
+LayerCount: 2
+Fore
+SplineSet
+79 771 m 0
+ 177 771 l 0
+ 178.976 764.036 172.638 759.556 170.696 758.012 c 0
+ 165.256 753.69 164 751.156 164 745 c 0
+ 164 448 l 0
+ 197.57 506.183 259.707 542.07 327.128 542.07 c 0
+ 431.167 542.07 540.005 456.138 540.005 271.2 c 0
+ 540.005 79.1558 427.245 -13.0764 318.695 -13.0764 c 0
+ 255.173 -13.0764 196.766 18.3503 162 70 c 0
+ 133 0 l 0
+ 79 0 l 0
+ 79 771 l 0
+298.069 470.353 m 0
+ 245.668 470.353 197.567 440.714 177.844 392.983 c 0
+ 165.809 363.856 163.969 329.782 163.969 281.904 c 0
+ 163.969 236.092 163.584 204.899 167.224 177.364 c 0
+ 180.563 76.4436 260.537 61.9726 296.744 61.9726 c 0
+ 348.522 61.9726 453.238 91.5609 453.238 253.679 c 0
+ 453.238 440.584 347.817 470.353 298.069 470.353 c 0
+EndSplineSet
+EndChar
+
+StartChar: H
+Encoding: 72 72 12
+Width: 600
+Flags: HMW
+TeX: 72 0
+LayerCount: 2
+Fore
+SplineSet
+73 722 m 0
+ 163 722 l 0
+ 163.822 720.356 164.252 718.529 164.252 716.663 c 0
+ 164.252 707.549 157 706.38 157 694 c 0
+ 157 413 l 0
+ 440 413 l 0
+ 440 722 l 0
+ 528 722 l 0
+ 528.872 720.545 529.336 718.865 529.336 717.137 c 0
+ 529.336 708.364 521 708.006 521 696 c 0
+ 521 -1 l 0
+ 439 -1 l 0
+ 439 344 l 0
+ 157 344 l 0
+ 157 0 l 0
+ 73 0 l 0
+ 73 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: g
+Encoding: 103 103 13
+Width: 600
+Flags: HMW
+TeX: 103 0
+LayerCount: 2
+Fore
+SplineSet
+155.954 364.263 m 0
+ 155.954 300.152 208.143 247.999 272.491 247.999 c 0
+ 336.833 247.999 389.059 300.157 389.059 364.307 c 0
+ 389.059 428.413 336.878 480.571 272.536 480.571 c 0
+ 208.19 480.571 155.954 428.416 155.954 364.263 c 0
+277.609 546.548 m 0
+ 325.887 546.548 370.362 528.527 403 496 c 1
+ 443.962 530.332 496.755 547.196 550 543 c 1
+ 560 475 l 1
+ 549.913 476.74 539.695 477.615 529.459 477.615 c 0
+ 496.841 477.615 464.884 468.735 437 452 c 1
+ 454.566 425.561 464.002 394.366 464.002 362.278 c 0
+ 464.002 264.564 378.096 180.942 273.257 180.942 c 0
+ 250.3 180.942 227.525 185.021 206 193 c 1
+ 200.797 188.707 168.184 161.819 168.184 133.805 c 0
+ 168.184 117.119 179.985 104.638 200.262 99.0661 c 0
+ 211.549 95.9645 236.341 92.4042 275.863 92.4042 c 0
+ 335.853 92.4042 399.797 99.8481 455.06 77.4073 c 0
+ 511.29 54.5739 537.372 8.31551 537.372 -37.512 c 0
+ 537.372 -108.516 473.087 -199.384 293.795 -199.384 c 0
+ 108.265 -199.384 54.4288 -131.698 54.4288 -73.9838 c 0
+ 54.4288 -31.9211 83.7043 7.00723 140.521 43.2787 c 1
+ 107.075 60.8546 98.0562 91.7838 98.0562 113.827 c 0
+ 98.0562 147.839 119.806 183.618 158 216 c 1
+ 109.489 247.565 79.7405 301.443 79.7405 359.36 c 0
+ 79.7405 462.8 172.219 546.548 277.609 546.548 c 0
+196.923 28.2968 m 1
+ 166.505 11.5929 130.974 -16.2077 130.974 -54.2593 c 0
+ 130.974 -72.7564 140.35 -101.884 183.142 -118.899 c 0
+ 223.159 -134.81 268.208 -136.199 292.38 -136.199 c 0
+ 327.814 -136.199 372.581 -133.958 411.372 -113.024 c 0
+ 447.725 -93.4056 460.904 -65.7032 460.904 -42.7611 c 0
+ 460.904 -19.4526 446.825 11.4411 397.736 18.8405 c 0
+ 367.367 23.4181 324.656 20.4798 285.59 21.9264 c 0
+ 245.08 23.4265 216.987 25.7017 196.923 28.2968 c 1
+EndSplineSet
+EndChar
+
+StartChar: h
+Encoding: 104 104 14
+Width: 600
+Flags: HMW
+TeX: 104 0
+LayerCount: 2
+Fore
+SplineSet
+91 0 m 4
+ 91 770 l 4
+ 187 770 l 4
+ 187.379 768.886 187.572 767.712 187.572 766.526 c 4
+ 187.572 760.484 182.866 756.916 180.206 754.11 c 4
+ 176.27 749.956 176 746.931 176 743 c 4
+ 176 436 l 4
+ 214.871 495.002 280.12 542.003 351.957 542.003 c 4
+ 412.281 542.003 466.544 508.129 492.899 448.568 c 4
+ 511.729 406.014 512 362.334 512 321 c 4
+ 512 321 l 4
+ 512 0 l 4
+ 430 0 l 4
+ 430 319 l 4
+ 430 356.393 429.762 401.823 401.11 436.061 c 4
+ 382.097 458.781 355.908 469.58 329.341 469.58 c 4
+ 273.362 469.58 222.49 422.787 202.308 395.893 c 4
+ 180.287 366.55 176 340.651 176 305 c 4
+ 176 0 l 4
+ 91 0 l 4
+EndSplineSet
+EndChar
+
+StartChar: u
+Encoding: 117 117 15
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+SplineSet
+83 529 m 0
+ 167 529 l 0
+ 167 234 l 0
+ 167 198.5 166.87 157.109 185.678 119.763 c 0
+ 206.758 77.9067 245.414 54.9999 286.847 54.9999 c 0
+ 337.84 54.9999 384.893 89.1882 409.153 133.494 c 0
+ 426.843 165.8 430 197.247 430 238 c 0
+ 430 529 l 0
+ 514 529 l 0
+ 514 48 l 0
+ 514 32.4901 514.914 15.8204 520 0 c 0
+ 432 0 l 0
+ 429.806 13.6499 429.662 27.494 430 41 c 0
+ 431 81 l 0
+ 396.509 22.5849 333.904 -13.0167 267.52 -13.0167 c 0
+ 198.648 -13.0167 133.916 25.4335 102.995 94.9656 c 0
+ 82.3165 141.466 81.8438 187.899 82 234 c 0
+ 83 529 l 0
+EndSplineSet
+EndChar
+
+StartChar: r
+Encoding: 114 114 16
+Width: 600
+Flags: HMW
+TeX: 114 0
+LayerCount: 2
+Fore
+SplineSet
+125 529 m 0
+ 212 529 l 0
+ 209 427 l 0
+ 243.671 502.684 322.168 541.803 399.502 541.803 c 0
+ 458.959 541.803 507.697 518.114 541 484 c 0
+ 502 404 l 0
+ 493.106 412.505 489.308 421.668 482.352 430.554 c 0
+ 467.489 449.542 439.485 470.205 394.944 470.205 c 0
+ 357.514 470.205 294.325 457.033 246.222 380.981 c 0
+ 210.237 324.088 209 288.944 209 257 c 0
+ 209 -1 l 0
+ 125 -1 l 0
+ 125 529 l 0
+EndSplineSet
+EndChar
+
+StartChar: i
+Encoding: 105 105 17
+Width: 600
+Flags: HMW
+TeX: 105 0
+LayerCount: 2
+Fore
+SplineSet
+133 530 m 4
+ 345 530 l 4
+ 345 67 l 4
+ 469 67 l 4
+ 469 0 l 4
+ 126 0 l 4
+ 126 67 l 4
+ 261 67 l 4
+ 261 462 l 4
+ 133 462 l 4
+ 133 530 l 4
+305.003 760 m 4
+ 338.171 760 365.019 733.28 365.019 700.493 c 4
+ 365.019 667.727 338.182 640.992 304.99 640.992 c 4
+ 271.818 640.992 244.981 667.716 244.981 700.486 c 4
+ 244.981 733.264 271.822 760 305.003 760 c 4
+EndSplineSet
+EndChar
+
+StartChar: f
+Encoding: 102 102 18
+Width: 600
+Flags: HMW
+TeX: 102 0
+LayerCount: 2
+Fore
+SplineSet
+408.022 777.453 m 0
+ 474.61 777.453 532.121 750.586 570 705 c 1
+ 532 628 l 1
+ 528.434 627.638 523.23 629.721 522.592 637.659 c 0
+ 522.194 642.608 523.122 645.776 519.403 651.402 c 0
+ 497.139 685.077 454.727 711.981 403.749 711.981 c 0
+ 359.969 711.981 319.106 692.476 297.273 653.356 c 0
+ 277.495 617.916 278 577.346 278 539 c 2
+ 278 498 l 1
+ 451 498 l 1
+ 451 432 l 1
+ 278 432 l 1
+ 278 0 l 1
+ 198 0 l 1
+ 198 432 l 1
+ 83 432 l 1
+ 83 498 l 1
+ 198 498 l 1
+ 198 550 l 2
+ 198 596.99 199.926 641.1 227.059 685.226 c 0
+ 264.056 745.394 333.642 777.453 408.022 777.453 c 0
+EndSplineSet
+EndChar
+
+StartChar: v
+Encoding: 118 118 19
+Width: 600
+Flags: HMW
+TeX: 118 0
+LayerCount: 2
+Fore
+SplineSet
+56 530 m 0
+ 156 530 l 0
+ 158 520.53 152.295 514.363 152.295 507.316 c 0
+ 152.295 504.529 153.032 502.45 154 500 c 0
+ 307 113 l 0
+ 392 310 l 0
+ 421.967 379.454 449.99 452.863 464 530 c 0
+ 539 530 l 0
+ 521.386 449.313 491.663 372.127 460 298 c 0
+ 331 -4 l 0
+ 266 -4 l 0
+ 56 530 l 0
+EndSplineSet
+EndChar
+
+StartChar: d
+Encoding: 100 100 20
+Width: 600
+Flags: HMW
+TeX: 100 0
+LayerCount: 2
+Fore
+SplineSet
+440 452 m 0
+ 440 771 l 0
+ 529 771 l 0
+ 529.429 763.115 525.033 757.358 522.644 753.665 c 0
+ 518.515 747.282 517.991 744.04 518 738 c 0
+ 519 49 l 0
+ 519.023 32.976 519.825 16.2095 524 0 c 0
+ 441 0 l 0
+ 436.758 12.8474 436 26.4226 436 39 c 0
+ 436 85 l 0
+ 402.754 25.5822 340.198 -11.7426 272.502 -11.7426 c 0
+ 170.172 -11.7426 61.9989 73.6686 61.9989 269.088 c 0
+ 61.9989 471.408 183.85 543.089 284.756 543.089 c 0
+ 357.905 543.089 414.551 506.411 440 452 c 0
+288.638 475.041 m 0
+ 227.729 475.041 142.873 433.439 142.873 282.731 c 0
+ 142.873 108.363 231.935 61.8091 291.87 61.8091 c 0
+ 347.081 61.8091 401.871 98.7178 422.26 162.214 c 0
+ 430.843 188.943 433.29 218.613 433.29 258.526 c 0
+ 433.29 317.62 430.953 347.168 424.391 371.787 c 0
+ 403.443 450.383 335.053 475.041 288.638 475.041 c 0
+EndSplineSet
+EndChar
+
+StartChar: p
+Encoding: 112 112 21
+Width: 600
+Flags: HMW
+TeX: 112 0
+LayerCount: 2
+Fore
+SplineSet
+79 529 m 0
+ 164 529 l 0
+ 164 448 l 0
+ 199.965 505.862 263.255 541 331.196 541 c 0
+ 435.346 541 546.008 457.517 546.008 270.69 c 0
+ 546.008 76.5707 432.1 -14.1497 323.885 -14.1497 c 0
+ 259.582 -14.1497 200.339 17.6548 165 70 c 0
+ 165 -193 l 0
+ 80 -193 l 0
+ 79 529 l 0
+300.599 469.911 m 0
+ 247.269 469.911 198.023 440.745 177.865 393.197 c 0
+ 166.21 365.704 163.875 333.505 163.875 288.853 c 0
+ 163.875 212.177 163.543 168.56 179.045 132.849 c 0
+ 199.943 84.7085 249.872 59.8372 300.077 59.8372 c 0
+ 349.666 59.8372 459.207 86.5412 459.207 253.487 c 0
+ 459.207 445.62 347.069 469.911 300.599 469.911 c 0
+EndSplineSet
+EndChar
+
+StartChar: q
+Encoding: 113 113 22
+Width: 600
+Flags: HMW
+TeX: 113 0
+LayerCount: 2
+Fore
+SplineSet
+443 452 m 0
+ 443 529 l 0
+ 522 529 l 0
+ 522 -193 l 0
+ 439 -193 l 0
+ 439 85 l 0
+ 405.898 26.0553 344.027 -11.6567 276.61 -11.6567 c 0
+ 159.718 -11.6567 58.9968 98.0805 58.9968 269.638 c 0
+ 58.9968 449.541 172.706 543.066 288.684 543.066 c 0
+ 406.139 543.066 443 451.618 443 452 c 0
+291.949 475.034 m 0
+ 220.924 475.034 142.881 419.676 142.881 281.575 c 0
+ 142.881 131.999 219.654 61.7898 295.168 61.7898 c 0
+ 350.366 61.7898 404.936 99.0666 425.25 162.164 c 0
+ 433.889 188.997 436.294 218.713 436.294 258.291 c 0
+ 436.294 322.298 433.787 355.626 423.349 384.853 c 0
+ 400.165 449.771 339.214 475.034 291.949 475.034 c 0
+EndSplineSet
+EndChar
+
+StartChar: y
+Encoding: 121 121 23
+Width: 600
+Flags: HMW
+TeX: 121 0
+LayerCount: 2
+Fore
+SplineSet
+63 529 m 0
+ 167 529 l 0
+ 167.651 518.579 161.833 512.755 161.833 504.226 c 0
+ 161.833 500.853 162.694 498.287 164 495 c 0
+ 319 105 l 0
+ 420 389 l 0
+ 436.209 434.578 451.255 481.532 460 530 c 0
+ 547 530 l 0
+ 531.434 478.243 513.035 427.412 494 377 c 0
+ 329 -60 l 0
+ 317.685 -89.9672 306.505 -117.887 283.381 -143.905 c 0
+ 248.107 -183.593 198.508 -201.18 150.696 -201.18 c 0
+ 107.172 -201.18 66.5488 -186.251 36 -157 c 0
+ 79 -82 l 0
+ 85.8372 -87.3566 85.2476 -95.0835 88.2407 -100.819 c 0
+ 91.1874 -106.465 111.21 -132.772 150.447 -132.772 c 0
+ 175.241 -132.772 202.436 -121.95 224.474 -98.4823 c 0
+ 241.247 -80.621 251.822 -58.0558 261 -37 c 0
+ 278 2 l 0
+ 63 529 l 0
+EndSplineSet
+EndChar
+
+StartChar: period
+Encoding: 46 46 24
+Width: 600
+Flags: HMW
+TeX: 112 0
+LayerCount: 2
+Fore
+SplineSet
+355.002 53.4929 m 0
+ 355.002 17.0088 324.552 -13.046 286.441 -13.046 c 0
+ 248.415 -13.046 217.952 16.9803 217.952 53.509 c 0
+ 217.952 89.9628 248.383 120.002 286.462 120.002 c 0
+ 324.556 120.002 355.002 89.961 355.002 53.4929 c 0
+EndSplineSet
+EndChar
+
+StartChar: comma
+Encoding: 44 44 25
+Width: 600
+Flags: HMW
+TeX: 99 0
+LayerCount: 2
+Fore
+SplineSet
+364.152 22.8349 m 0
+ 364.152 -37.4943 321.706 -113.057 241 -195 c 0
+ 201 -160 l 0
+ 228.481 -134.726 247.951 -106.529 259.27 -87.9335 c 0
+ 264.928 -78.6381 276.427 -58.8335 276.427 -39.6582 c 0
+ 276.427 -15.8026 259.351 -5.13308 249.284 1.56253 c 0
+ 239.047 8.37111 216.973 21.6939 216.973 52.8528 c 0
+ 216.973 87.8494 245.536 118.93 283.672 118.93 c 0
+ 324.887 118.93 364.152 82.133 364.152 22.8349 c 0
+EndSplineSet
+EndChar
+
+StartChar: colon
+Encoding: 58 58 26
+Width: 600
+Flags: HMW
+TeX: 99 0
+LayerCount: 2
+Fore
+Refer: 24 46 S 1 0 0 1 0 370 2
+Refer: 24 46 S 1 0 0 1 0 0 2
+EndChar
+
+StartChar: semicolon
+Encoding: 59 59 27
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+Fore
+Refer: 25 44 N 1 0 0 1 0 0 2
+Refer: 24 46 S 1 0 0 1 0 370 2
+EndChar
+
+StartChar: plus
+Encoding: 43 43 28
+Width: 600
+Flags: HMW
+TeX: 112 0
+LayerCount: 2
+Fore
+SplineSet
+267 606 m 5
+ 340 606 l 5
+ 340 408 l 5
+ 538 408 l 5
+ 538 337 l 5
+ 340 337 l 5
+ 340 120 l 5
+ 267 120 l 5
+ 267 337 l 5
+ 62 337 l 5
+ 62 408 l 5
+ 267 408 l 5
+ 267 606 l 5
+EndSplineSet
+EndChar
+
+StartChar: minus
+Encoding: 256 8722 29
+Width: 600
+Flags: HMW
+TeX: 104 0
+LayerCount: 2
+Fore
+SplineSet
+62 398 m 29
+ 538 398 l 29
+ 538 327 l 29
+ 62 327 l 29
+ 62 398 l 29
+EndSplineSet
+EndChar
+
+StartChar: equal
+Encoding: 61 61 30
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+Refer: 29 8722 N 1 0 0 1 0 110 2
+Refer: 29 8722 N 1 0 0 1 0 -130 2
+EndChar
+
+StartChar: underscore
+Encoding: 95 95 31
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+SplineSet
+50 -22 m 29
+ 550 -22 l 29
+ 550 -93 l 29
+ 50 -93 l 29
+ 50 -22 l 29
+EndSplineSet
+EndChar
+
+StartChar: less
+Encoding: 60 60 32
+Width: 600
+Flags: HMW
+TeX: 108 0
+LayerCount: 2
+Fore
+SplineSet
+541 575 m 29
+ 541 657 l 29
+ 50 399 l 29
+ 50 343 l 29
+ 544 55 l 29
+ 544 142 l 29
+ 139 370 l 29
+ 541 575 l 29
+EndSplineSet
+EndChar
+
+StartChar: greater
+Encoding: 62 62 33
+Width: 600
+Flags: HMW
+TeX: 103 0
+LayerCount: 2
+Fore
+Refer: 32 60 S -1 0 0 1 600 0 2
+EndChar
+
+StartChar: quotesingle
+Encoding: 39 39 34
+Width: 600
+Flags: HMWO
+TeX: 113 0
+LayerCount: 2
+Fore
+SplineSet
+379.671 700.649 m 0
+ 379.671 670.206 369.816 633.244 341 554 c 0
+ 313 477 l 0
+ 249 493 l 0
+ 274 571 l 0
+ 280.25 590.5 285.304 612.364 285.304 635.105 c 0
+ 285.304 660.263 278.044 683.429 278.044 708.518 c 0
+ 278.044 754.3 305.162 772.143 327.505 772.143 c 0
+ 350.267 772.143 379.671 753.082 379.671 700.649 c 0
+EndSplineSet
+EndChar
+
+StartChar: grave
+Encoding: 96 96 35
+Width: 600
+Flags: HMW
+TeX: 103 0
+LayerCount: 2
+Fore
+Refer: 34 39 S -0.766045 -0.642788 0.642788 -0.766045 104.985 1311.87 2
+EndChar
+
+StartChar: slash
+Encoding: 47 47 36
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+Fore
+SplineSet
+84 -15 m 25
+ 447 770 l 25
+ 516 735 l 25
+ 152 -49 l 25
+ 84 -15 l 25
+EndSplineSet
+EndChar
+
+StartChar: backslash
+Encoding: 92 92 37
+Width: 600
+Flags: HMW
+TeX: 98 0
+LayerCount: 2
+Fore
+Refer: 36 47 N -1 0 0 1 600 0 2
+EndChar
+
+StartChar: micro
+Encoding: 181 181 38
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+SplineSet
+38 -193 m 0
+ 38.9384 -58.9867 61 87.3183 61 234 c 0
+ 61 529 l 0
+ 137 529 l 0
+ 137 215 l 0
+ 137 180.23 138.185 147.14 154.248 114.565 c 0
+ 174.86 72.7648 211.805 49.9847 248.66 49.9847 c 0
+ 290.595 49.9847 331.561 78.8859 352.027 125.633 c 0
+ 365.243 155.818 367 186.455 367 222 c 0
+ 367 529 l 0
+ 441 529 l 0
+ 441 134 l 0
+ 441 116.206 440.844 95.0245 450.744 77.6249 c 0
+ 459.417 62.3819 473.241 54.8661 487.238 54.8661 c 0
+ 526.513 54.8661 551 111 551 111 c 0
+ 582 52 l 0
+ 559.818 18.1186 523.188 -12.1017 480.237 -12.1017 c 0
+ 431.193 -12.1017 391.479 28.1352 385 78 c 0
+ 358.195 22.6019 302.55 -13.0043 242.87 -13.0043 c 0
+ 186.505 -13.0043 135.089 18.999 111 70 c 0
+ 111.199 -18.023 110.861 -105.668 110 -193 c 0
+ 38 -193 l 0
+EndSplineSet
+EndChar
+
+StartChar: braceleft
+Encoding: 123 123 39
+Width: 600
+Flags: HMW
+TeX: 98 0
+LayerCount: 2
+Fore
+SplineSet
+71 329 m 0
+ 94 329 l 0
+ 114.58 329 146.235 328.585 171.534 355.122 c 0
+ 198.692 383.608 201.554 425.157 201.554 453.492 c 0
+ 201.554 481.497 198.598 507.731 198.598 536.425 c 0
+ 198.598 580.04 204.818 645.199 255.772 691.645 c 0
+ 311.368 742.324 385.82 738 448 738 c 0
+ 483 738 l 0
+ 483 672 l 0
+ 443 672 l 0
+ 392.342 672 357.045 676.742 325.874 657.279 c 0
+ 281.263 629.425 279.43 573.026 279.43 549.494 c 0
+ 279.43 521.751 282.855 496.368 282.855 468.063 c 0
+ 282.855 440.501 279.771 406.244 264.439 374.889 c 0
+ 247.328 339.898 217.845 312.378 182 297 c 0
+ 225.958 281.72 279.876 237.615 279.876 116.516 c 0
+ 279.876 80.6922 276.205 50.3097 276.205 19.6336 c 0
+ 276.205 -20.2481 282.098 -70.9759 323.519 -99.512 c 0
+ 355.221 -121.352 391.356 -119 439 -119 c 0
+ 482 -119 l 0
+ 482 -184 l 0
+ 440 -184 l 0
+ 368.421 -184 309.076 -187.506 259.023 -149.094 c 0
+ 197.979 -102.247 194.437 -23.0053 194.437 19.058 c 0
+ 194.437 64.2177 198.784 98.7588 198.784 134.884 c 0
+ 198.784 184.919 190.964 218.659 168.219 240.946 c 0
+ 144.453 264.235 114.606 264 95 264 c 0
+ 71 264 l 0
+ 71 329 l 0
+EndSplineSet
+EndChar
+
+StartChar: braceright
+Encoding: 125 125 40
+Width: 600
+Flags: HMW
+TeX: 98 0
+LayerCount: 2
+Fore
+Refer: 39 123 S -1 0 0 1 600 0 2
+EndChar
+
+StartChar: asterisk
+Encoding: 42 42 41
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+SplineSet
+257 601 m 0
+ 351 601 l 0
+ 349.036 587.217 345.49 584.406 344 570 c 0
+ 326 396 l 0
+ 510 480 l 0
+ 541 409 l 0
+ 342 349 l 0
+ 488 174 l 0
+ 425 124 l 0
+ 300 316 l 0
+ 170 123 l 0
+ 107 174 l 0
+ 258 348 l 0
+ 58 409 l 0
+ 88 484 l 0
+ 275 396 l 0
+ 257 601 l 0
+EndSplineSet
+EndChar
+
+StartChar: O
+Encoding: 79 79 42
+Width: 600
+Flags: HMW
+TeX: 79 0
+LayerCount: 2
+Fore
+SplineSet
+556.008 359.504 m 0
+ 556.008 296.095 551.428 206.273 513.069 128.645 c 0
+ 465.538 32.4568 382.426 -11.0151 304.485 -11.0151 c 0
+ 193.976 -11.0151 43.9996 78.3988 43.9996 362.113 c 0
+ 43.9996 645.884 196.081 730 303.761 730 c 0
+ 382.353 730 464.443 686.67 511.792 593.902 c 0
+ 551.172 516.748 556.008 427.05 556.008 359.504 c 0
+300.361 654.01 m 0
+ 224.496 654.01 123.971 587.911 123.971 372.659 c 0
+ 123.971 143.053 223.619 67.987 304.834 67.987 c 0
+ 353.415 67.987 409.355 95.4454 442.765 165.717 c 0
+ 472.355 227.951 475.085 301.614 475.085 348.897 c 0
+ 475.085 410.01 471.386 479.154 446.984 539.849 c 0
+ 413.335 623.543 351.591 654.01 300.361 654.01 c 0
+EndSplineSet
+EndChar
+
+StartChar: zero
+Encoding: 48 48 43
+Width: 600
+Flags: HMWO
+TeX: 122 0
+LayerCount: 2
+Fore
+SplineSet
+301.249 727 m 0
+ 412.345 727 531.007 595.219 531.007 348.788 c 0
+ 531.007 100.694 407.312 -13.0219 302.525 -13.0219 c 0
+ 188.358 -13.0219 67.9924 121.658 67.9924 355.222 c 0
+ 67.9924 586.285 186.665 727 301.249 727 c 0
+414.067 561.958 m 1
+ 383.092 625.695 339.657 656 300.157 656 c 0
+ 228.597 656 143.795 554.031 143.795 369.311 c 0
+ 143.795 318.267 149.725 272.506 159.907 232.842 c 1
+ 414.067 561.958 l 1
+440.863 484.525 m 1
+ 186.653 159.413 l 1
+ 218.03 96.0835 262.445 60.8848 305.327 60.8848 c 0
+ 369.033 60.8848 456.099 137.611 456.099 339.376 c 0
+ 456.099 395.528 450.46 443.805 440.863 484.525 c 1
+EndSplineSet
+EndChar
+
+StartChar: one
+Encoding: 49 49 44
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+SplineSet
+357 723 m 0
+ 357 -1 l 0
+ 276 -1 l 0
+ 276 622 l 0
+ 131 579 l 0
+ 112 624 l 0
+ 301 723 l 0
+ 357 723 l 0
+EndSplineSet
+EndChar
+
+StartChar: two
+Encoding: 50 50 45
+Width: 600
+Flags: HMW
+TeX: 116 0
+LayerCount: 2
+Fore
+SplineSet
+100 610 m 0
+ 142.552 682.72 220.175 727.008 302.107 727.008 c 0
+ 419.975 727.008 511.536 636.692 511.536 524.194 c 0
+ 511.536 420.356 437.434 346.096 384.502 296.506 c 0
+ 332.446 247.737 248.223 175.987 188 71 c 0
+ 491 71 l 0
+ 496.284 71 498.692 71.7409 503.392 75.7939 c 0
+ 505.8 77.8706 511.479 83.4955 519 81 c 0
+ 519 0 l 0
+ 95 0 l 0
+ 95 51 l 0
+ 155.807 170.93 222.305 245.442 304.763 319.728 c 0
+ 357.118 366.894 431.226 430.278 431.226 518.244 c 0
+ 431.226 595.847 369.481 655.449 292.555 655.449 c 0
+ 229.497 655.449 186.147 616.16 169.108 589.668 c 0
+ 162.928 580.06 165.889 572.819 159 563 c 0
+ 100 610 l 0
+EndSplineSet
+EndChar
+
+StartChar: N
+Encoding: 78 78 46
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+68 0 m 0
+ 68 722 l 0
+ 147 722 l 0
+ 450 187 l 0
+ 450 723 l 0
+ 536 723 l 0
+ 536.929 716.255 533.916 710.683 532.621 708.22 c 0
+ 529.844 702.938 528 700.058 528 692 c 0
+ 528 -1 l 0
+ 464 -1 l 0
+ 146 568 l 0
+ 146 0 l 0
+ 68 0 l 0
+EndSplineSet
+EndChar
+
+StartChar: four
+Encoding: 52 52 47
+Width: 600
+Flags: HMW
+TeX: 102 0
+LayerCount: 2
+Fore
+SplineSet
+373 723 m 0
+ 441 723 l 0
+ 441 271 l 0
+ 534 271 l 0
+ 534 199 l 0
+ 441 199 l 0
+ 441 0 l 0
+ 357 0 l 0
+ 357 200 l 0
+ 66 200 l 0
+ 66 260 l 0
+ 373 723 l 0
+358 594 m 0
+ 146 271 l 0
+ 358 271 l 0
+ 358 594 l 0
+EndSplineSet
+EndChar
+
+StartChar: eight
+Encoding: 56 56 48
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+SplineSet
+309.222 731.061 m 0
+ 415.174 731.061 497.201 655.222 497.201 560.081 c 0
+ 497.201 490.519 451.989 422.756 382 386 c 0
+ 463.398 348.449 521.364 271.387 521.364 186.38 c 0
+ 521.364 76.38 425.926 -12.0638 299.122 -12.0638 c 0
+ 174.777 -12.0638 79.845 73.9895 79.845 181.557 c 0
+ 79.845 264.873 138.311 343.716 224 384 c 0
+ 158.829 417.286 113.953 482.052 113.953 553.066 c 0
+ 113.953 650.336 198.716 731.061 309.222 731.061 c 0
+285 351 m 0
+ 216.282 322.472 162.993 260.535 162.993 192.304 c 0
+ 162.993 119.655 224.278 60.9956 302.825 60.9956 c 0
+ 380.01 60.9956 439.255 117.609 439.255 187.223 c 0
+ 439.255 257.778 377.894 321.691 285 351 c 0
+303.003 663.016 m 0
+ 239.989 663.016 191.919 616.894 191.919 559.982 c 0
+ 191.919 464.568 319 415 319 415 c 0
+ 375.248 445.252 418 499.154 418 554.724 c 0
+ 418 615.015 367.541 663.016 303.003 663.016 c 0
+EndSplineSet
+EndChar
+
+StartChar: five
+Encoding: 53 53 49
+Width: 600
+Flags: HMW
+TeX: 102 0
+LayerCount: 2
+Fore
+SplineSet
+133 722 m 0
+ 499 722 l 0
+ 499 649 l 0
+ 201 649 l 0
+ 190 441 l 0
+ 227.409 459.661 267.74 469.014 307.613 469.014 c 0
+ 428.503 469.014 526.046 382.829 526.046 228.267 c 0
+ 526.046 71.7703 422.799 -13.0166 297.988 -13.0166 c 0
+ 212.187 -13.0166 131.88 27.3246 84 98 c 0
+ 156 152 l 0
+ 165.915 144.928 159.968 133.516 164.636 124.688 c 0
+ 168.652 117.094 219.025 57.9865 296.99 57.9865 c 0
+ 374.5 57.9865 443.032 118.764 443.032 229.807 c 0
+ 443.032 344.87 371.274 402.108 295.262 402.108 c 0
+ 245.957 402.108 194.845 377.882 160 334 c 0
+ 108 355 l 0
+ 133 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: S
+Encoding: 83 83 50
+Width: 600
+Flags: HMW
+TeX: 83 0
+LayerCount: 2
+Fore
+SplineSet
+514 636 m 0
+ 463 567 l 0
+ 460.467 567.77 457.129 570.059 456.897 576.479 c 0
+ 456.744 580.739 457.326 583.155 454.259 587.627 c 0
+ 426.295 628.402 374.583 659.139 307.322 659.139 c 0
+ 224.667 659.139 176.928 608.659 176.928 553.304 c 0
+ 176.928 523.788 190.278 480.959 250.701 445.621 c 0
+ 316.767 406.982 418.491 386.478 481.296 327.335 c 0
+ 526.491 284.776 537.39 234.352 537.39 196.567 c 0
+ 537.39 105.698 472.479 -12.0688 296.743 -12.0688 c 0
+ 207.646 -12.0688 126.78 19.1667 70 81 c 0
+ 118 164 l 0
+ 123.54 161.188 123.285 154.812 123.259 152.899 c 0
+ 123.193 148.118 122.894 145.188 126.519 140.598 c 0
+ 158.801 99.712 219.842 60.9499 299.1 60.9499 c 0
+ 403.921 60.9499 456.763 129.108 456.763 191.929 c 0
+ 456.763 224.218 443.541 261.931 396.186 291.612 c 0
+ 341.618 325.813 237.401 350.797 170.523 400.177 c 0
+ 110.323 444.627 93.8001 498.906 93.8001 541.004 c 0
+ 93.8001 639.749 183.363 726.008 313.761 726.008 c 0
+ 392.466 726.008 465.102 694.099 514 636 c 0
+EndSplineSet
+EndChar
+
+StartChar: M
+Encoding: 77 77 51
+Width: 600
+Flags: HMW
+TeX: 77 0
+LayerCount: 2
+Fore
+SplineSet
+57 722 m 0
+ 121 722 l 0
+ 300 369 l 0
+ 482 723 l 0
+ 543 723 l 0
+ 543 -1 l 0
+ 466 -1 l 0
+ 466 545 l 0
+ 310 254 l 0
+ 279 254 l 0
+ 133 541 l 0
+ 133 -1 l 0
+ 57 -1 l 0
+ 57 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: L
+Encoding: 76 76 52
+Width: 600
+Flags: HMW
+TeX: 76 0
+LayerCount: 2
+Fore
+SplineSet
+87 722 m 0
+ 181 722 l 0
+ 182.252 713.763 178.671 707.037 176.957 703.776 c 0
+ 173.543 697.278 171 693.469 171 683 c 0
+ 171 69 l 0
+ 519 69 l 0
+ 519 -1 l 0
+ 87 -1 l 0
+ 87 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: ampersand
+Encoding: 38 38 53
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+275.219 729.113 m 0
+ 362.09 729.113 430.049 664.093 430.049 574.842 c 0
+ 430.049 499.041 380.587 423.321 305 382 c 0
+ 435 201 l 0
+ 462.526 232.964 478.373 266.737 487.03 294.093 c 0
+ 487.898 296.839 488.581 299.921 488.581 303.138 c 0
+ 488.581 307.706 486.98 312.21 486.98 316.938 c 0
+ 486.98 322.596 489.256 326.511 492 329 c 0
+ 567 277 l 0
+ 540.906 230.061 511.512 184.947 479 142 c 0
+ 560 37 l 0
+ 492 -14 l 0
+ 428 88 l 0
+ 382.006 30.9903 310.65 -12.0313 232.619 -12.0313 c 0
+ 128.337 -12.0313 51.7317 66.2734 51.7317 169.432 c 0
+ 51.7317 258.731 108.958 348.313 198 397 c 0
+ 155.129 448.798 115.988 513.456 115.988 577.085 c 0
+ 115.988 663.563 187.113 729.113 275.219 729.113 c 0
+195.898 575.613 m 0
+ 195.898 545.141 208.5 503.946 266 432 c 0
+ 319.757 461.715 354.165 516.513 354.165 569.305 c 0
+ 354.165 624.184 316.438 660.403 273.735 660.403 c 0
+ 232.647 660.403 195.898 626.428 195.898 575.613 c 0
+238 343 m 0
+ 176.427 303.101 139.365 237.448 139.365 177.45 c 0
+ 139.365 110.152 186.019 62.8265 245.174 62.8265 c 0
+ 322.406 62.8265 386 143 386 143 c 0
+ 238 343 l 0
+EndSplineSet
+EndChar
+
+StartChar: F
+Encoding: 70 70 54
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+100 723 m 0
+ 516 723 l 0
+ 516 652 l 0
+ 182 652 l 0
+ 182 425 l 0
+ 452 425 l 0
+ 452 355 l 0
+ 182 355 l 0
+ 182 0 l 0
+ 100 0 l 0
+ 100 723 l 0
+EndSplineSet
+EndChar
+
+StartChar: w
+Encoding: 119 119 55
+Width: 600
+Flags: HMW
+TeX: 119 0
+LayerCount: 2
+Fore
+SplineSet
+28 530 m 0
+ 113 530 l 0
+ 116.047 520.997 112.999 513.233 111.087 507.077 c 0
+ 108.216 497.832 108.458 493.651 110 486 c 0
+ 187 104 l 0
+ 278 480 l 0
+ 329 480 l 0
+ 441 105 l 0
+ 486.611 406.209 492.089 465.021 490 529 c 0
+ 567 529 l 0
+ 544.196 351.317 514.841 174.519 479 -1 c 0
+ 401 -1 l 0
+ 303 342 l 0
+ 210 -1 l 0
+ 135 -1 l 0
+ 28 530 l 0
+EndSplineSet
+EndChar
+
+StartChar: quoteright
+Encoding: 257 8217 56
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 25 44 S 1 0 0 1 0 620 2
+EndChar
+
+StartChar: quoteleft
+Encoding: 258 8216 57
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 56 8217 N -1 0 0 -1 565.146 1163.92 2
+EndChar
+
+StartChar: quotedbl
+Encoding: 34 34 58
+Width: 600
+Flags: HMW
+TeX: 113 0
+LayerCount: 2
+Fore
+Refer: 34 39 S 1 0 0 1 90 0 2
+Refer: 34 39 S 1 0 0 1 -110 0 2
+EndChar
+
+StartChar: T
+Encoding: 84 84 59
+Width: 600
+Flags: HMW
+TeX: 84 0
+LayerCount: 2
+Fore
+SplineSet
+46 723 m 0
+ 546 723 l 0
+ 546 650 l 0
+ 333 650 l 0
+ 333 -1 l 0
+ 251 -1 l 0
+ 251 650 l 0
+ 46 650 l 0
+ 46 723 l 0
+EndSplineSet
+EndChar
+
+StartChar: hyphen
+Encoding: 45 45 60
+Width: 600
+Flags: HMW
+TeX: 104 0
+LayerCount: 2
+Fore
+SplineSet
+92 403 m 0
+ 509 403 l 0
+ 509 326 l 0
+ 92 326 l 0
+ 92 403 l 0
+EndSplineSet
+EndChar
+
+StartChar: exclam
+Encoding: 33 33 61
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+SplineSet
+356.002 55.4912 m 0
+ 356.002 17.7 325.296 -13.0169 287.479 -13.0169 c 0
+ 249.672 -13.0169 218.954 17.6866 218.954 55.4935 c 0
+ 218.954 93.2861 249.66 124.002 287.478 124.002 c 0
+ 325.284 124.002 356.002 93.2972 356.002 55.4912 c 0
+289.272 774.001 m 0
+ 311.02 774.001 335.403 759.407 344.346 724.32 c 0
+ 346.091 717.475 348.76 704.489 348.76 677.25 c 0
+ 348.76 632.978 340.895 589.116 338 545 c 0
+ 317 225 l 0
+ 259 225 l 0
+ 242 545 l 0
+ 237.955 621.137 230.565 649.274 230.565 686.67 c 0
+ 230.565 708.378 233.144 724.012 238.462 736.818 c 0
+ 248.803 761.721 269.202 774.001 289.272 774.001 c 0
+EndSplineSet
+EndChar
+
+StartChar: exclamdown
+Encoding: 161 161 62
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+Refer: 61 33 N -1 0 0 -1 574.958 760.985 2
+EndChar
+
+StartChar: U
+Encoding: 85 85 63
+Width: 600
+Flags: HMW
+TeX: 85 0
+LayerCount: 2
+Fore
+SplineSet
+68 722 m 0
+ 159 722 l 0
+ 159.791 720.163 160.2 718.172 160.2 716.15 c 0
+ 160.2 709.235 155.631 704.498 152.571 700.195 c 0
+ 148.296 694.182 148 690.266 148 685 c 0
+ 148 248 l 0
+ 148 212.142 148.701 177.155 165.336 141.578 c 0
+ 191.299 86.0528 245.805 55.9211 303.067 55.9211 c 0
+ 359.414 55.9211 413.783 85.3437 440.467 140.549 c 0
+ 458.225 177.288 459 213.693 459 251 c 0
+ 459 722 l 0
+ 536 722 l 0
+ 536 253 l 0
+ 536 200.192 534.408 150.173 507.085 99.8136 c 0
+ 466.018 24.1247 384.91 -13.0732 301.461 -13.0732 c 0
+ 216.265 -13.0732 136.155 24.9771 96.1412 99.2172 c 0
+ 69.4091 148.814 68 197.96 68 249 c 0
+ 68 249 l 0
+ 68 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: numbersign
+Encoding: 35 35 64
+Width: 600
+Flags: HMW
+TeX: 110 0
+LayerCount: 2
+Fore
+SplineSet
+211 723 m 5
+ 281 726 l 5
+ 256.94 527.366 l 5
+ 384.587 528.891 l 5
+ 407 717 l 5
+ 479 720 l 5
+ 455.758 529.742 l 5
+ 561 531 l 5
+ 555 475 l 5
+ 448.941 473.939 l 5
+ 425.118 278.915 l 5
+ 540 281 l 5
+ 534 227 l 5
+ 418.548 225.134 l 5
+ 393 16 l 5
+ 323 12 l 5
+ 348.259 223.998 l 5
+ 219.943 221.924 l 5
+ 195 16 l 5
+ 127 13 l 5
+ 151.587 220.82 l 5
+ 39 219 l 5
+ 44 272 l 5
+ 157.887 274.066 l 5
+ 181.217 471.262 l 5
+ 55 470 l 5
+ 59 525 l 5
+ 187.757 526.539 l 5
+ 211 723 l 5
+250.228 471.952 m 5
+ 226.409 275.31 l 5
+ 354.65 277.637 l 5
+ 377.955 473.23 l 5
+ 250.228 471.952 l 5
+EndSplineSet
+EndChar
+
+StartChar: j
+Encoding: 106 106 65
+Width: 600
+Flags: HMW
+TeX: 106 0
+LayerCount: 2
+Fore
+SplineSet
+156 530 m 4
+ 437 530 l 4
+ 437 37 l 4
+ 437 -8.68478 435.772 -52.1052 413.163 -96.3812 c 4
+ 377.277 -166.657 303.238 -202.181 227.699 -202.181 c 4
+ 162.017 -202.181 103.902 -175.027 66 -128 c 4
+ 120 -56 l 4
+ 127.204 -61.9473 125.358 -69.4816 130.11 -77.2483 c 4
+ 134.378 -84.2222 169.009 -130.016 233.016 -130.016 c 4
+ 277.791 -130.016 319.506 -106.298 339.459 -63.2398 c 4
+ 352.497 -35.1019 353 -7.27543 353 21 c 4
+ 353 461 l 4
+ 156 461 l 4
+ 156 530 l 4
+396.003 760 m 4
+ 429.171 760 456.019 733.28 456.019 700.493 c 4
+ 456.019 667.727 429.182 640.992 395.99 640.992 c 4
+ 362.818 640.992 335.981 667.716 335.981 700.486 c 4
+ 335.981 733.264 362.822 760 396.003 760 c 4
+EndSplineSet
+EndChar
+
+StartChar: x
+Encoding: 120 120 66
+Width: 600
+Flags: HMW
+TeX: 120 0
+LayerCount: 2
+Fore
+SplineSet
+430 530 m 1
+ 515 530 l 1
+ 343.447 272.196 l 1
+ 538 0 l 1
+ 443 0 l 1
+ 297.06 205.835 l 1
+ 159 0 l 1
+ 65 0 l 1
+ 250.856 269.049 l 1
+ 68 530 l 1
+ 159 530 l 1
+ 297.737 333.918 l 1
+ 430 530 l 1
+EndSplineSet
+EndChar
+
+StartChar: G
+Encoding: 71 71 67
+Width: 600
+Flags: HMW
+TeX: 71 0
+LayerCount: 2
+Fore
+SplineSet
+331.256 729.021 m 0
+ 420.211 729.021 499.721 682.82 541 608 c 0
+ 484 550 l 0
+ 474.934 555.815 472.124 564.988 468.568 572.778 c 0
+ 446.485 621.163 395.191 658.068 330.753 658.068 c 0
+ 269.931 658.068 205.563 624.733 168.312 554.634 c 0
+ 140.066 501.479 131.993 436.71 131.993 369.475 c 0
+ 131.993 293.213 140.467 191.911 200.744 123.216 c 0
+ 240.013 78.4622 291.335 59.9971 338.046 59.9971 c 0
+ 381.069 59.9971 427.485 75.1275 468 104 c 0
+ 468 276 l 0
+ 337 276 l 0
+ 337 346 l 0
+ 543 346 l 0
+ 543 64 l 0
+ 474.935 13.8821 397.763 -11.0487 330.884 -11.0487 c 0
+ 204.891 -11.0487 51.8871 79.1096 51.8871 352.371 c 0
+ 51.8871 669.165 235.235 729.021 331.256 729.021 c 0
+EndSplineSet
+EndChar
+
+StartChar: k
+Encoding: 107 107 68
+Width: 600
+Flags: HMW
+TeX: 107 0
+LayerCount: 2
+Fore
+SplineSet
+87 770 m 0
+ 182 770 l 0
+ 183.286 762.176 178.153 756.852 175.466 753.359 c 0
+ 171.419 748.094 171 745.015 171 740 c 0
+ 171 286 l 0
+ 436 532 l 0
+ 456.53 526.949 477.704 526 498 526 c 0
+ 528 526 l 0
+ 305 316 l 0
+ 565 -1 l 0
+ 562.299 -0.982364 559.597 -0.973546 556.896 -0.973546 c 0
+ 501.401 -0.973546 457 -5 457 -5 c 0
+ 241 265 l 0
+ 171 200 l 0
+ 171 -1 l 0
+ 87 -1 l 0
+ 87 770 l 0
+EndSplineSet
+EndChar
+
+StartChar: z
+Encoding: 122 122 69
+Width: 600
+Flags: HMW
+TeX: 122 0
+LayerCount: 2
+Fore
+SplineSet
+92 530 m 0
+ 504 530 l 0
+ 504 473 l 0
+ 181 71 l 0
+ 496 71 l 0
+ 512.142 71 516.579 80.1398 531 78 c 0
+ 531 -1 l 0
+ 68 -1 l 0
+ 68 56 l 0
+ 396 457 l 0
+ 92 457 l 0
+ 92 530 l 0
+EndSplineSet
+EndChar
+
+StartChar: dollar
+Encoding: 36 36 70
+Width: 600
+Flags: HMW
+TeX: 100 0
+LayerCount: 2
+Fore
+SplineSet
+282 754 m 1
+ 357 754 l 1
+ 357.544 752.762 357.825 751.416 357.825 750.046 c 0
+ 357.825 741.462 350 741.128 350 730 c 2
+ 350 685.53 l 1
+ 418.468 678.631 479.448 647.798 522 597 c 1
+ 472 534 l 1
+ 469.529 534.647 466.405 536.859 465.998 542.031 c 0
+ 465.734 545.385 466.586 548.59 464.873 552.132 c 0
+ 464.366 553.181 463.571 554.432 459.966 558.804 c 0
+ 435.884 588.015 400.197 609.606 350 617.169 c 1
+ 350 394.007 l 1
+ 376.209 385.213 402.685 376.233 426.693 365.906 c 0
+ 451.098 355.408 542.789 316.114 542.789 210.306 c 0
+ 542.789 127.201 481.207 35.8962 350 18.7898 c 1
+ 350 -54 l 1
+ 282 -54 l 1
+ 282 16.6512 l 1
+ 202.131 21.6382 130.573 53.0648 79 109 c 1
+ 129 178 l 1
+ 134.731 175.387 134.178 168.719 134.1 167.269 c 0
+ 133.829 162.202 133.224 159.078 137.667 154.35 c 0
+ 170.199 119.732 221.081 90.2105 282 83.4419 c 1
+ 282 338.141 l 1
+ 260.848 345.221 239.279 353.278 218.422 363.137 c 0
+ 121.008 409.184 101.838 474.448 101.838 516.644 c 0
+ 101.838 600.059 175.207 670.816 282 684.586 c 1
+ 282 754 l 1
+350 316.849 m 1
+ 350 85.8432 l 1
+ 424.317 100.222 467.128 152.561 467.128 204.903 c 0
+ 467.128 228.695 458.246 267.247 409.599 293.705 c 0
+ 393.686 302.36 373.118 309.563 350 316.849 c 1
+282 418.096 m 1
+ 282 618.618 l 1
+ 209.129 610.103 178.407 566.678 178.407 526.615 c 0
+ 178.407 501.336 190.349 466.609 241.42 437.196 c 0
+ 253.404 430.294 267.16 424.024 282 418.096 c 1
+EndSplineSet
+EndChar
+
+StartChar: A
+Encoding: 65 65 71
+Width: 600
+Flags: HMW
+TeX: 65 0
+LayerCount: 2
+Fore
+SplineSet
+27 -1 m 0
+ 282 735 l 0
+ 291 735 l 0
+ 570 0 l 0
+ 486 0 l 0
+ 406 211 l 0
+ 177 211 l 0
+ 107 -1 l 0
+ 27 -1 l 0
+388 274 m 0
+ 286 549 l 0
+ 193 274 l 0
+ 388 274 l 0
+EndSplineSet
+EndChar
+
+StartChar: C
+Encoding: 67 67 72
+Width: 600
+Flags: HMW
+TeX: 67 0
+LayerCount: 2
+Fore
+SplineSet
+331.618 728 m 0
+ 427.542 728 514.176 672.042 553 585 c 0
+ 476 547 l 0
+ 470.67 550.736 470.716 557.019 470.716 558.375 c 0
+ 470.716 561.257 471.207 564.142 471.207 567.016 c 0
+ 471.207 572.403 469.516 575.396 467.216 579.368 c 0
+ 438.075 629.699 385.397 663.168 328.882 663.168 c 0
+ 226.816 663.168 135.987 555.779 135.987 363.969 c 0
+ 135.987 168.839 229.418 57.9939 335.655 57.9939 c 0
+ 392.317 57.9939 449.702 90.8843 483 146 c 0
+ 543 107 l 0
+ 497.694 32.979 417.217 -12.0016 331.109 -12.0016 c 0
+ 212.178 -12.0016 56.9666 77.8506 56.9666 356.807 c 0
+ 56.9666 645.838 219.327 728 331.618 728 c 0
+EndSplineSet
+EndChar
+
+StartChar: B
+Encoding: 66 66 73
+Width: 600
+Flags: HMW
+TeX: 66 0
+LayerCount: 2
+Fore
+SplineSet
+66 722 m 0
+ 271 722 l 0
+ 315.399 722 360.704 721.5 405.879 701.856 c 0
+ 473.724 672.354 511 610.49 511 545.61 c 0
+ 511 476.391 468.788 413.433 404 387 c 0
+ 484.894 359.735 539.123 283.98 539.123 199.903 c 0
+ 539.123 125.489 496.411 54.7898 418.712 21.7722 c 0
+ 368.818 0.569996 319.11 0 270 0 c 0
+ 66 0 l 0
+ 66 722 l 0
+146 653 m 0
+ 146 423 l 0
+ 259 423 l 0
+ 291.145 423 325.727 423.132 358.963 437.515 c 0
+ 404.424 457.189 429.169 496.927 429.169 538.138 c 0
+ 429.169 579.684 403.799 620.586 355.923 639.925 c 0
+ 323.833 652.887 290.834 653 260 653 c 0
+ 146 653 l 0
+146 355 m 0
+ 146 71 l 0
+ 284 71 l 0
+ 315.204 71 345.804 71.5467 376.985 85.5968 c 0
+ 426.877 108.078 454.347 156.379 454.347 208.01 c 0
+ 454.347 260.227 425.928 311.754 372.336 337.19 c 0
+ 336.297 354.296 300.473 355 264 355 c 0
+ 146 355 l 0
+EndSplineSet
+EndChar
+
+StartChar: bracketleft
+Encoding: 91 91 74
+Width: 600
+Flags: HMW
+TeX: 98 0
+LayerCount: 2
+Fore
+SplineSet
+162 776 m 0
+ 493 776 l 0
+ 493 707 l 0
+ 236 707 l 0
+ 236 -37 l 0
+ 494 -37 l 0
+ 494 -103 l 0
+ 162 -103 l 0
+ 162 776 l 0
+EndSplineSet
+EndChar
+
+StartChar: bracketright
+Encoding: 93 93 75
+Width: 600
+Flags: HMW
+TeX: 98 0
+LayerCount: 2
+Fore
+Refer: 74 91 S -1 0 0 1 600 0 2
+EndChar
+
+StartChar: parenleft
+Encoding: 40 40 76
+Width: 600
+Flags: HMW
+TeX: 112 0
+LayerCount: 2
+Fore
+SplineSet
+464 772 m 4
+ 499 701 l 4
+ 495.074 698.763 491.329 698.611 489.669 698.611 c 4
+ 485.073 698.611 481.395 699.932 477.323 699.932 c 4
+ 472.717 699.932 469.928 698.14 466.835 696.315 c 4
+ 331.453 616.467 251.273 468.859 251.273 303.345 c 4
+ 251.273 123.314 344.63 -46.9685 503 -139 c 4
+ 465 -200 l 4
+ 281.456 -103.658 170.68 88.9922 170.68 299.462 c 4
+ 170.68 511.567 284.678 693.118 464 772 c 4
+EndSplineSet
+EndChar
+
+StartChar: parenright
+Encoding: 41 41 77
+Width: 600
+Flags: HMW
+TeX: 112 0
+LayerCount: 2
+Fore
+SplineSet
+100 699 m 0
+ 122 771 l 0
+ 310.266 684.352 432 496.633 432 290.289 c 0
+ 432 82.1043 308.169 -110.384 116 -202 c 0
+ 94 -132 l 0
+ 250.594 -49.1168 350.028 112.597 350.028 286.978 c 0
+ 350.028 458.955 253.152 617.58 100 699 c 0
+EndSplineSet
+EndChar
+
+StartChar: three
+Encoding: 51 51 78
+Width: 600
+Flags: HMW
+TeX: 116 0
+LayerCount: 2
+Fore
+SplineSet
+486.039 541.353 m 0
+ 486.039 471.159 442.787 409.132 378 385 c 0
+ 452.906 357.628 502.026 284.533 502.026 198.625 c 0
+ 502.026 86.4453 418.041 -12.1905 279.723 -12.1905 c 0
+ 207.414 -12.1905 138.424 16.1652 90 70 c 0
+ 151 143 l 0
+ 161.292 132.464 156.135 121.234 165.975 110.147 c 0
+ 171.105 104.367 211.734 61.2614 278.997 61.2614 c 0
+ 363.525 61.2614 424.303 129.155 424.303 208.449 c 0
+ 424.303 294.507 352.456 345.579 254.688 345.579 c 0
+ 242.418 345.579 230.159 344.711 218 343 c 0
+ 218 408 l 0
+ 286.501 408.15 319.346 420.748 332.04 426.323 c 0
+ 382.02 448.274 409.043 495.946 409.043 539.93 c 0
+ 409.043 600.917 357.627 652.425 283.533 652.425 c 0
+ 238.887 652.425 192.677 633.092 159 597 c 0
+ 114 647 l 0
+ 159.315 696.504 222.364 724.29 287.492 724.29 c 0
+ 401.687 724.29 486.039 639.912 486.039 541.353 c 0
+EndSplineSet
+EndChar
+
+StartChar: D
+Encoding: 68 68 79
+Width: 600
+Flags: HMW
+TeX: 68 0
+LayerCount: 2
+Fore
+SplineSet
+72 722 m 0
+ 241 722 l 0
+ 304.677 722 356.645 717.434 409.104 683.3 c 0
+ 501.966 622.876 543.181 501.213 543.181 362.199 c 0
+ 543.181 204.202 486.7 81.1929 383.192 27.9784 c 0
+ 332.292 1.81019 284.391 -1 227 -1 c 0
+ 72 -1 l 0
+ 72 722 l 0
+149 653 m 0
+ 149 63 l 0
+ 223 63 l 0
+ 268.397 63 312.737 65.0195 358.002 95.5625 c 0
+ 415.69 134.488 461.352 213.696 461.352 351.331 c 0
+ 461.352 455.017 438.945 557.739 371.85 613.352 c 0
+ 327.165 650.39 281.491 653 236 653 c 0
+ 149 653 l 0
+EndSplineSet
+EndChar
+
+StartChar: E
+Encoding: 69 69 80
+Width: 600
+Flags: HMW
+TeX: 69 0
+LayerCount: 2
+Fore
+SplineSet
+78 723 m 0
+ 521 723 l 0
+ 521 651 l 0
+ 155 651 l 0
+ 155 414 l 0
+ 457 414 l 0
+ 457 340 l 0
+ 155 340 l 0
+ 155 72 l 0
+ 518 72 l 0
+ 518 0 l 0
+ 78 0 l 0
+ 78 723 l 0
+EndSplineSet
+EndChar
+
+StartChar: V
+Encoding: 86 86 81
+Width: 600
+Flags: HMW
+TeX: 86 0
+LayerCount: 2
+Fore
+SplineSet
+39 723 m 0
+ 124 723 l 0
+ 309 168 l 0
+ 484 722 l 0
+ 564 722 l 0
+ 322 -5 l 0
+ 285 -5 l 0
+ 39 723 l 0
+EndSplineSet
+EndChar
+
+StartChar: percent
+Encoding: 37 37 82
+Width: 600
+Flags: HMW
+TeX: 112 0
+LayerCount: 2
+Fore
+SplineSet
+463 722 m 0
+ 541 722 l 0
+ 137 0 l 0
+ 63 0 l 0
+ 463 722 l 0
+171.904 735.106 m 0
+ 242.474 735.106 302.16 670.55 302.16 582.187 c 0
+ 302.16 496.123 243.528 431.982 172.952 431.982 c 0
+ 101.84 431.982 42.8516 496.911 42.8516 583.448 c 0
+ 42.8516 672.526 103.042 735.106 171.904 735.106 c 0
+170.33 674.005 m 0
+ 147.48 674.005 112.978 656.124 112.978 587.43 c 0
+ 112.978 508.953 151.261 493.911 172.149 493.911 c 0
+ 195.202 493.911 229.092 512.141 229.092 579.148 c 0
+ 229.092 661.667 189.098 674.005 170.33 674.005 c 0
+569.018 138.593 m 0
+ 569.018 51.7449 509.983 -12.1238 439.695 -12.1238 c 0
+ 369.049 -12.1238 309.98 52.0529 309.98 138.262 c 0
+ 309.98 225.089 369.219 289.001 439.589 289.001 c 0
+ 510.127 289.001 569.018 224.871 569.018 138.593 c 0
+439.32 229.005 m 0
+ 414.436 229.005 378.994 208.941 378.994 138.34 c 0
+ 378.994 69.8907 413.149 46.7696 440.303 46.7696 c 0
+ 465.114 46.7696 500.009 66.7942 500.009 135.903 c 0
+ 500.009 210.33 463.157 229.005 439.32 229.005 c 0
+EndSplineSet
+EndChar
+
+StartChar: J
+Encoding: 74 74 83
+Width: 600
+Flags: HMW
+TeX: 74 0
+LayerCount: 2
+Fore
+SplineSet
+209 722 m 0
+ 539 722 l 0
+ 539 654 l 0
+ 428 654 l 0
+ 428 242 l 0
+ 428 189.714 427.529 134.891 399.871 83.1312 c 0
+ 366.41 20.5134 303.824 -13.1014 235.465 -13.1014 c 0
+ 171.621 -13.1014 109.768 15.8267 67 67 c 0
+ 121 133 l 0
+ 127.875 126.68 123.023 118.695 128.162 112.068 c 0
+ 130.663 108.842 176.362 58.6812 236.758 58.6812 c 0
+ 271.444 58.6812 302.787 75.9435 322.107 104.722 c 0
+ 348.989 144.764 348 196.3 348 241 c 0
+ 348 654 l 0
+ 209 654 l 0
+ 209 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: K
+Encoding: 75 75 84
+Width: 600
+Flags: HMW
+TeX: 75 0
+LayerCount: 2
+Fore
+SplineSet
+59 723 m 0
+ 156 723 l 0
+ 157.286 715.176 152.153 709.852 149.466 706.359 c 0
+ 145.419 701.094 145 698.015 145 693 c 0
+ 145 389 l 0
+ 447 728 l 0
+ 466.858 722.945 487.384 722 507 722 c 0
+ 537 722 l 0
+ 264 410 l 0
+ 556 -1 l 0
+ 498.81 -0.826198 453 -5 453 -5 c 0
+ 202 361 l 0
+ 145 299 l 0
+ 145 0 l 0
+ 59 0 l 0
+ 59 723 l 0
+EndSplineSet
+EndChar
+
+StartChar: P
+Encoding: 80 80 85
+Width: 600
+Flags: HMW
+TeX: 80 0
+LayerCount: 2
+Fore
+SplineSet
+78 722 m 0
+ 298 722 l 0
+ 344.56 722 389.35 720.81 434.624 697.494 c 0
+ 502.828 662.37 538.016 591.718 538.016 518.699 c 0
+ 538.016 445.503 502.883 376.352 436.114 342.409 c 0
+ 392.262 320.116 348.977 319 304 319 c 0
+ 304 319 l 0
+ 162 319 l 0
+ 162 0 l 0
+ 78 0 l 0
+ 78 722 l 0
+162 646 m 0
+ 161 390 l 0
+ 307 390 l 0
+ 335.466 390 362.993 390.678 390.831 404.763 c 0
+ 432.659 425.926 455.003 468.944 455.003 514.986 c 0
+ 455.003 561.985 431.629 607.921 386.619 630.5 c 0
+ 357.19 645.263 328.165 646 298 646 c 0
+ 162 646 l 0
+EndSplineSet
+EndChar
+
+StartChar: question
+Encoding: 63 63 86
+Width: 600
+Flags: HMW
+TeX: 113 0
+LayerCount: 2
+Fore
+SplineSet
+381.002 51.4929 m 0
+ 381.002 15.0088 350.552 -15.046 312.441 -15.046 c 0
+ 274.415 -15.046 243.952 14.9803 243.952 51.509 c 0
+ 243.952 87.9628 274.383 118.002 312.462 118.002 c 0
+ 350.556 118.002 381.002 87.961 381.002 51.4929 c 0
+84 650 m 0
+ 134.425 727.691 220.637 771.06 307.402 771.06 c 0
+ 438.699 771.06 513.24 674.633 513.24 566.639 c 0
+ 513.24 457.756 436.646 413.666 398.404 379.676 c 0
+ 350.692 337.269 348 302.835 348 262 c 0
+ 348 214 l 0
+ 272 214 l 0
+ 272 262 l 0
+ 272 314.014 275.26 354.806 326.449 411.013 c 0
+ 361.471 449.468 421.576 496.796 421.576 572.709 c 0
+ 421.576 641.182 368.948 695.153 299.634 695.153 c 0
+ 241.046 695.153 179.542 656.112 143 595 c 0
+ 84 650 l 0
+EndSplineSet
+EndChar
+
+StartChar: at
+Encoding: 64 64 87
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+SplineSet
+514 35 m 0
+ 465.464 3.64213 409.094 -13.0048 351.681 -13.0048 c 0
+ 207.208 -13.0048 45.979 94.7502 45.979 363.717 c 0
+ 45.979 626.559 197.939 733 324.448 733 c 0
+ 408.454 733 485.773 686.98 523.017 604.767 c 0
+ 548.262 549.038 549 493.218 549 438 c 0
+ 549 203 l 0
+ 479 203 l 0
+ 479 247 l 0
+ 450.306 212.734 407.914 192.94 363.251 192.94 c 0
+ 280.295 192.94 212.67 260.162 212.67 343.965 c 0
+ 212.67 406.432 250.973 468.115 322.793 496.582 c 0
+ 368.543 514.716 414.747 515 459 515 c 0
+ 476 515 l 0
+ 475.939 600.733 407.704 671.014 321.098 671.014 c 0
+ 220.711 671.014 112.988 575.649 112.988 367.243 c 0
+ 112.988 141.221 246.229 52.9323 358.489 52.9323 c 0
+ 402.842 52.9323 446.203 66.182 483 91 c 0
+ 514 35 l 0
+479 457 m 0
+ 460 457 l 0
+ 418.559 457 369.9 456.608 330.805 429.771 c 0
+ 299.601 408.352 284.927 377.014 284.927 347.37 c 0
+ 284.927 297.233 325.741 256.964 376.598 256.964 c 0
+ 410.056 256.964 444.081 274.841 462.01 309.68 c 0
+ 480.087 344.808 479 389.066 479 435 c 0
+ 479 457 l 0
+EndSplineSet
+EndChar
+
+StartChar: bar
+Encoding: 124 124 88
+Width: 600
+Flags: HMW
+TeX: 98 0
+LayerCount: 2
+Fore
+SplineSet
+261 756 m 0
+ 339 756 l 0
+ 339 -175 l 0
+ 261 -175 l 0
+ 261 756 l 0
+EndSplineSet
+EndChar
+
+StartChar: asciitilde
+Encoding: 126 126 89
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+SplineSet
+116 396 m 4
+ 58 434 l 4
+ 92.198 492.034 151.499 538.051 217.153 538.051 c 4
+ 312.781 538.051 343.146 450.999 409.264 450.999 c 4
+ 447.27 450.999 474.649 480.653 508 526 c 4
+ 561 482 l 4
+ 530.811 436.285 473.381 375.377 400.536 375.377 c 4
+ 306.617 375.377 282.907 467.595 212.175 467.595 c 4
+ 179.423 467.595 145.323 443.982 116 396 c 4
+EndSplineSet
+EndChar
+
+StartChar: asciicircum
+Encoding: 94 94 90
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+SplineSet
+118 425 m 0
+ 295 722 l 0
+ 320 722 l 0
+ 477 426 l 0
+ 415 397 l 0
+ 303 600 l 0
+ 176 397 l 0
+ 118 425 l 0
+EndSplineSet
+EndChar
+
+StartChar: cent
+Encoding: 162 162 91
+Width: 600
+Flags: HMW
+TeX: 99 0
+LayerCount: 2
+Fore
+SplineSet
+340 723 m 1
+ 418 715 l 1
+ 418.775 707.498 415.212 701.298 413.826 698.827 c 0
+ 410.853 693.526 409.047 690.934 408 683 c 2
+ 395.457 587.822 l 1
+ 458.442 575.242 504.754 541.294 533 498 c 1
+ 482 432 l 1
+ 476.607 435.758 476.706 442.016 476.706 443.549 c 0
+ 476.706 450.099 478.707 455.066 472.749 462.134 c 0
+ 457.796 479.871 428.657 504.643 386.192 517.517 c 1
+ 332.752 112 l 1
+ 333.469 111.999 l 2
+ 389.462 111.999 444.705 135.589 485 177 c 1
+ 527 121 l 1
+ 477.291 66.4244 406.711 37.9886 331.604 37.9886 c 0
+ 328.725 37.9886 325.862 38.0286 323.014 38.1081 c 1
+ 306 -91 l 1
+ 239 -83 l 1
+ 255.422 48.0539 l 1
+ 141.433 79.5748 66 182.291 66 315.836 c 0
+ 66 471.215 168.407 585.207 323.673 592.709 c 1
+ 340 723 l 1
+265.044 124.836 m 1
+ 315.274 525.684 l 1
+ 219.938 519.993 147.95 447.755 147.95 326.544 c 0
+ 147.95 225.647 194.972 152.96 265.044 124.836 c 1
+EndSplineSet
+EndChar
+
+StartChar: euro
+Encoding: 164 8364 92
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+548 665 m 5
+ 519 586 l 5
+ 510.733 592.758 515.379 602.068 509.042 609.779 c 4
+ 507.922 611.142 464.815 661.167 386.755 661.167 c 4
+ 317.566 661.167 233.594 620.979 199.483 502.334 c 4
+ 197.686 496.082 195.746 488.698 193.828 480 c 5
+ 480 480 l 5
+ 455 413 l 5
+ 184.084 413 l 5
+ 182.441 393.403 181.417 370.757 181.417 344.613 c 4
+ 181.417 336.225 181.561 328.021 181.852 320 c 5
+ 420 320 l 5
+ 394 253 l 5
+ 188.48 253 l 5
+ 196.603 205.904 211.936 166.8 235.532 134.868 c 4
+ 276.315 79.6765 335.261 56.791 388.936 56.791 c 4
+ 435.098 56.791 479.134 73.5085 513 104 c 5
+ 546 46 l 5
+ 501.68 7.4161 444.786 -13.1265 384.233 -13.1265 c 4
+ 290.458 -13.1265 145.304 38.4687 114.986 253 c 5
+ 48 253 l 5
+ 63 320 l 5
+ 109.56 320 l 5
+ 109.4 326.06 109.319 332.225 109.319 338.496 c 4
+ 109.319 363.479 110.295 388.448 112.538 413 c 5
+ 48 413 l 5
+ 63 480 l 5
+ 122.297 480 l 5
+ 130.798 521.099 144.028 559.766 163.557 593.831 c 4
+ 222.805 697.179 318.974 727.394 391.356 727.394 c 4
+ 452.52 727.394 507.764 705.737 548 665 c 5
+EndSplineSet
+EndChar
+
+StartChar: sterling
+Encoding: 163 163 93
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+Fore
+SplineSet
+494 663 m 1
+ 443 599 l 1
+ 433.543 605.934 434.27 615.246 427.512 622.673 c 0
+ 422.593 628.078 390.006 656.128 341.348 656.128 c 0
+ 279.173 656.128 217.781 609.4 217.781 512.955 c 0
+ 217.781 488.175 221.729 463.315 227.168 438 c 1
+ 342 438 l 1
+ 342 372 l 1
+ 242.811 372 l 1
+ 251.234 336.143 258.537 298.852 258.537 259.182 c 0
+ 258.537 201.957 243.517 148.5 216 104 c 1
+ 226.25 105.791 236.644 106.675 247.063 106.675 c 0
+ 324.103 106.675 372.006 58.9164 438.359 58.9164 c 0
+ 470.325 58.9164 500.468 70.8547 524 91 c 1
+ 555 31 l 1
+ 528.906 10.2532 484.714 -17.1633 434.141 -17.1633 c 0
+ 360.259 -17.1633 311.803 34.666 227.673 34.666 c 0
+ 203.994 34.666 159.283 30.2658 85 -9 c 1
+ 55 57 l 1
+ 108.912 81.9053 122.949 87.4528 141.287 115.98 c 0
+ 167.053 156.062 181.214 204.698 181.214 256.851 c 0
+ 181.214 296.572 172.952 334.482 163.82 372 c 1
+ 88 372 l 1
+ 88 438 l 1
+ 148.325 438 l 1
+ 143.399 462.328 139.93 486.842 139.93 511.928 c 0
+ 139.93 641.884 235.856 722.006 343.371 722.006 c 0
+ 398.585 722.006 452.418 701.138 494 663 c 1
+EndSplineSet
+EndChar
+
+StartChar: Y
+Encoding: 89 89 94
+Width: 600
+Flags: HMW
+TeX: 89 0
+LayerCount: 2
+Fore
+SplineSet
+43 723 m 0
+ 135 723 l 0
+ 312 372 l 0
+ 472 722 l 0
+ 558 722 l 0
+ 353 285 l 0
+ 353 0 l 0
+ 265 0 l 0
+ 265 285 l 0
+ 43 723 l 0
+EndSplineSet
+EndChar
+
+StartChar: yen
+Encoding: 165 165 95
+Width: 600
+Flags: HMW
+TeX: 121 0
+LayerCount: 2
+Fore
+SplineSet
+52 723 m 1
+ 142 723 l 1
+ 310 421 l 1
+ 464 722 l 1
+ 550 722 l 1
+ 348 342 l 1
+ 348 318 l 1
+ 504 318 l 1
+ 504 252 l 1
+ 348 252 l 1
+ 348 179 l 1
+ 504 179 l 1
+ 504 114 l 1
+ 348 114 l 1
+ 348 0 l 1
+ 269 0 l 1
+ 269 114 l 1
+ 107 114 l 1
+ 107 179 l 1
+ 269 179 l 1
+ 269 252 l 1
+ 107 252 l 1
+ 107 318 l 1
+ 269 318 l 1
+ 269 342 l 1
+ 52 723 l 1
+EndSplineSet
+EndChar
+
+StartChar: Z
+Encoding: 90 90 96
+Width: 600
+Flags: HMW
+TeX: 90 0
+LayerCount: 2
+Fore
+SplineSet
+82 722 m 0
+ 528 722 l 0
+ 527 665 l 0
+ 170 71 l 0
+ 511 71 l 0
+ 527.142 71 531.579 80.1398 546 78 c 0
+ 546 -1 l 0
+ 68 -1 l 0
+ 68 56 l 0
+ 432 649 l 0
+ 82 649 l 0
+ 82 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: Q
+Encoding: 81 81 97
+Width: 600
+Flags: HMW
+TeX: 81 0
+LayerCount: 2
+Fore
+SplineSet
+300.491 656.024 m 0
+ 221.775 656.024 122.96 585.888 122.96 373.877 c 0
+ 122.96 144.877 220.551 63.9921 305.427 63.9921 c 0
+ 366.012 63.9921 478.121 108.342 478.121 348.259 c 0
+ 478.121 408.965 473.721 479.175 448.587 540.782 c 0
+ 413.795 626.06 351.323 656.024 300.491 656.024 c 0
+556.015 357.88 m 0
+ 556.015 294.497 551.45 205.023 513.096 127.795 c 0
+ 473.396 47.8558 408.806 4.43529 343.02 -7.54866 c 1
+ 344.367 -47.6073 355.333 -95.0859 427.899 -95.0859 c 0
+ 453.816 -95.0859 485.178 -90.5919 522 -89 c 1
+ 520 -168 l 1
+ 436.632 -167.285 386.166 -172.61 341.235 -150.307 c 0
+ 288.619 -124.19 270.811 -74.3879 271.79 -8.40479 c 1
+ 166.776 8.0711 43.9994 105.441 43.9994 361.966 c 0
+ 43.9994 646.356 196.451 730 303.805 730 c 0
+ 383.023 730 465.547 686.019 512.626 592.269 c 0
+ 551.227 515.402 556.015 426.335 556.015 357.88 c 0
+EndSplineSet
+EndChar
+
+StartChar: thorn
+Encoding: 254 254 98
+Width: 600
+Flags: HMW
+TeX: 116 0
+LayerCount: 2
+Fore
+SplineSet
+80 770 m 0
+ 172 770 l 0
+ 172.534 754.226 164 750.539 164 732 c 0
+ 164 448 l 0
+ 199.965 505.862 263.255 541 331.196 541 c 0
+ 435.346 541 546.008 457.517 546.008 270.69 c 0
+ 546.008 76.5707 432.1 -14.1497 323.885 -14.1497 c 0
+ 259.582 -14.1497 200.339 17.6548 165 70 c 0
+ 165 -193 l 0
+ 80 -193 l 0
+ 80 770 l 0
+300.599 469.911 m 0
+ 247.269 469.911 198.023 440.745 177.865 393.197 c 0
+ 166.21 365.704 163.875 333.505 163.875 288.853 c 0
+ 163.875 212.177 163.543 168.56 179.045 132.849 c 0
+ 199.943 84.7085 249.872 59.8372 300.077 59.8372 c 0
+ 349.666 59.8372 459.207 86.5412 459.207 253.487 c 0
+ 459.207 445.62 347.069 469.911 300.599 469.911 c 0
+EndSplineSet
+EndChar
+
+StartChar: questiondown
+Encoding: 191 191 99
+Width: 600
+Flags: HMW
+TeX: 113 0
+LayerCount: 2
+Fore
+Refer: 86 63 N -1 0 0 -1 601.159 755.969 2
+EndChar
+
+StartChar: plusminus
+Encoding: 177 177 100
+Width: 600
+Flags: HMW
+TeX: 112 0
+LayerCount: 2
+Fore
+SplineSet
+63 93 m 4
+ 540 93 l 4
+ 540 20 l 4
+ 63 20 l 4
+ 63 93 l 4
+EndSplineSet
+Refer: 28 43 N 1 0 0 1 0 60 2
+EndChar
+
+StartChar: R
+Encoding: 82 82 101
+Width: 600
+Flags: HMW
+TeX: 82 0
+LayerCount: 2
+Fore
+SplineSet
+75 722 m 0
+ 288 722 l 0
+ 334.667 722 380.248 720.95 425.988 697.719 c 0
+ 492.448 663.965 528.143 596.481 528.143 523.978 c 0
+ 528.143 428.394 468.499 345.903 381 322 c 0
+ 548 0 l 0
+ 457 0 l 0
+ 297 319 l 0
+ 157 319 l 0
+ 157 0 l 0
+ 75 0 l 0
+ 75 722 l 0
+157 646 m 0
+ 157 390 l 0
+ 297 390 l 0
+ 325.466 390 352.993 390.678 380.831 404.763 c 0
+ 422.659 425.926 445.003 468.944 445.003 514.986 c 0
+ 445.003 561.985 421.629 607.921 376.619 630.5 c 0
+ 347.19 645.263 318.165 646 288 646 c 0
+ 157 646 l 0
+EndSplineSet
+EndChar
+
+StartChar: X
+Encoding: 88 88 102
+Width: 600
+Flags: HMW
+TeX: 88 0
+LayerCount: 2
+Fore
+SplineSet
+449 723 m 1
+ 530 723 l 1
+ 347.292 370.084 l 1
+ 552 0 l 1
+ 461 0 l 1
+ 300.474 286.156 l 1
+ 146 0 l 1
+ 57 0 l 1
+ 254.441 368.201 l 1
+ 61 723 l 1
+ 148 723 l 1
+ 300.153 448.564 l 1
+ 449 723 l 1
+EndSplineSet
+EndChar
+
+StartChar: six
+Encoding: 54 54 103
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+Fore
+SplineSet
+342.659 730.138 m 0
+ 401.412 730.138 458.584 705.809 501 664 c 0
+ 445 602 l 0
+ 434.368 609.82 434.59 620.671 427.517 628.077 c 0
+ 423.092 632.711 391.165 658.246 343.16 658.246 c 0
+ 291.254 658.246 172.411 625.987 168 379 c 0
+ 199.898 432.999 258.013 466.137 321.005 466.137 c 0
+ 423.075 466.137 519.08 379.808 519.08 229.538 c 0
+ 519.08 80.8581 422.752 -12.0026 312.997 -12.0026 c 0
+ 248.704 -12.0026 184.458 20.3794 142.414 83.8806 c 0
+ 96.0423 153.919 87.8103 244.182 87.8103 328.725 c 0
+ 87.8103 398.015 94.4787 482.075 118.688 550.855 c 0
+ 163.122 677.091 256.592 730.138 342.659 730.138 c 0
+313.429 395.091 m 0
+ 259.837 395.091 204.549 357.227 172 298 c 0
+ 162.434 163.097 228.337 59.9447 316.419 59.9447 c 0
+ 377.654 59.9447 440.168 112.511 440.168 225.41 c 0
+ 440.168 349.842 371.467 395.091 313.429 395.091 c 0
+EndSplineSet
+EndChar
+
+StartChar: nine
+Encoding: 57 57 104
+Width: 600
+Flags: HMW
+TeX: 110 0
+LayerCount: 2
+Fore
+SplineSet
+261.675 -12.1561 m 0
+ 202.075 -12.1561 144.572 11.7985 102 54 c 0
+ 158 116 l 0
+ 170.321 108.179 167.108 95.6999 176.888 88.125 c 0
+ 177.128 87.939 212.027 61.8787 263.838 61.8787 c 0
+ 315.736 61.8787 375.697 88.07 406.577 161.072 c 0
+ 414.19 179.068 432.572 227.741 436 340 c 0
+ 402.346 291.195 346.701 261.958 287.116 261.958 c 0
+ 182.228 261.958 88.9944 351.151 88.9944 489.856 c 0
+ 88.9944 629.773 183.329 729 295.648 729 c 0
+ 371.017 729 454.143 682.757 491.757 572.33 c 0
+ 508.564 522.989 516.664 460.639 516.664 370.261 c 0
+ 516.664 252.09 498.421 189.45 485.749 156.035 c 0
+ 442.004 40.6809 349.796 -12.1561 261.675 -12.1561 c 0
+294.989 332.729 m 0
+ 346.985 332.729 400.082 367.207 432 421 c 0
+ 444.812 566.747 376.145 657.043 293.961 657.043 c 0
+ 228.457 657.043 167.969 598.264 167.969 493.195 c 0
+ 167.969 385.709 230.618 332.729 294.989 332.729 c 0
+EndSplineSet
+EndChar
+
+StartChar: seven
+Encoding: 55 55 105
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+Fore
+SplineSet
+101 722 m 0
+ 510 722 l 0
+ 510 677 l 0
+ 461.138 565.327 415.446 452.266 373 338 c 0
+ 331.553 226.425 293.2 113.7 258 0 c 0
+ 167 0 l 0
+ 209.792 129.784 255.811 258.503 305 386 c 0
+ 338.534 472.918 373.54 559.268 410 645 c 0
+ 101 645 l 0
+ 101 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: W
+Encoding: 87 87 106
+Width: 600
+Flags: HMW
+TeX: 87 0
+LayerCount: 2
+Fore
+SplineSet
+30 722 m 0
+ 105 722 l 0
+ 183 234 l 0
+ 299 669 l 0
+ 324 669 l 0
+ 441 232 l 0
+ 507 722 l 0
+ 575 722 l 0
+ 461 -5 l 0
+ 429 -5 l 0
+ 305 472 l 0
+ 179 -5 l 0
+ 146 -5 l 0
+ 30 722 l 0
+EndSplineSet
+EndChar
+
+StartChar: acute
+Encoding: 260 180 107
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+348 810 m 4
+ 421 761 l 4
+ 304 605 l 4
+ 246 640 l 4
+ 348 810 l 4
+EndSplineSet
+EndChar
+
+StartChar: aacute
+Encoding: 225 225 108
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 0 97 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: agrave
+Encoding: 224 224 109
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+Refer: 130 715 S 1 0 0 1 0 0 2
+Refer: 0 97 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: acircumflex
+Encoding: 226 226 110
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+Refer: 137 710 S 1 0 0 1 8 0 2
+Refer: 0 97 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: atilde
+Encoding: 227 227 111
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+Refer: 138 732 S 1 0 0 1 11 0 2
+Refer: 0 97 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: adieresis
+Encoding: 228 228 112
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 15 0 2
+Refer: 0 97 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: aring
+Encoding: 229 229 113
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+Refer: 161 730 S 1 0 0 1 0 0 2
+Refer: 0 97 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: egrave
+Encoding: 232 232 114
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+Refer: 130 715 S 1 0 0 1 0 0 2
+Refer: 9 101 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: eacute
+Encoding: 233 233 115
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 9 101 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ecircumflex
+Encoding: 234 234 116
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+Refer: 137 710 S 1 0 0 1 0 0 2
+Refer: 9 101 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: edieresis
+Encoding: 235 235 117
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 2 0 2
+Refer: 9 101 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ograve
+Encoding: 242 242 118
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+Refer: 130 715 S 1 0 0 1 0 0 2
+Refer: 5 111 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: oacute
+Encoding: 243 243 119
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 5 111 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ocircumflex
+Encoding: 244 244 120
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+Refer: 137 710 S 1 0 0 1 0 0 2
+Refer: 5 111 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: otilde
+Encoding: 245 245 121
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+Refer: 138 732 S 1 0 0 1 0 0 2
+Refer: 5 111 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: odieresis
+Encoding: 246 246 122
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 0 0 2
+Refer: 5 111 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: oslash
+Encoding: 248 248 123
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+SplineSet
+301.758 470.103 m 0
+ 220.795 470.103 144.985 397.575 144.985 267.806 c 0
+ 144.985 210.232 159.811 162.64 183.62 127.42 c 1
+ 362.111 455.844 l 1
+ 342.74 465.435 322.083 470.103 301.758 470.103 c 0
+543.113 262.304 m 0
+ 543.113 86.8043 430.326 -14 304.969 -14 c 0
+ 267.109 -14 230.757 -4.85803 198.107 11.9174 c 1
+ 151 -74 l 1
+ 91 -43 l 1
+ 142.317 51.4236 l 1
+ 90.4093 100.283 56.8677 173.482 56.8677 260.578 c 0
+ 56.8677 424.14 172.53 541.005 307.44 541.005 c 0
+ 338.595 541.005 369.418 534.573 397.992 521.866 c 1
+ 441 601 l 1
+ 503 568 l 1
+ 456.732 483.613 l 1
+ 508.189 437.145 543.113 362.872 543.113 262.304 c 0
+416.343 409.949 m 1
+ 234.443 78.1878 l 1
+ 256.267 64.9671 280.584 57.9927 305.614 57.9927 c 0
+ 382.884 57.9927 459.167 125.6 459.167 258.844 c 0
+ 459.167 325.471 442.141 375.404 416.343 409.949 c 1
+EndSplineSet
+EndChar
+
+StartChar: ugrave
+Encoding: 249 249 124
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+Refer: 130 715 S 1 0 0 1 0 0 2
+Refer: 15 117 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: uacute
+Encoding: 250 250 125
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 15 117 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ucircumflex
+Encoding: 251 251 126
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+Refer: 137 710 S 1 0 0 1 0 0 2
+Refer: 15 117 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: udieresis
+Encoding: 252 252 127
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 0 0 2
+Refer: 15 117 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: yacute
+Encoding: 253 253 128
+Width: 600
+Flags: HMW
+TeX: 121 0
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 23 121 S 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ydieresis
+Encoding: 255 255 129
+Width: 600
+Flags: HMW
+TeX: 121 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 0 0 2
+Refer: 23 121 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: uni02CB
+Encoding: 259 715 130
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 107 180 S -1 0 0 1 640 0 2
+EndChar
+
+StartChar: igrave
+Encoding: 236 236 131
+Width: 600
+Flags: HMW
+TeX: 105 0
+LayerCount: 2
+Fore
+Refer: 130 715 S 1 0 0 1 -50 0 2
+Refer: 136 305 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: iacute
+Encoding: 237 237 132
+Width: 600
+Flags: HMW
+TeX: 105 0
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 136 305 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: icircumflex
+Encoding: 238 238 133
+Width: 600
+Flags: HMW
+TeX: 105 0
+LayerCount: 2
+Fore
+Refer: 137 710 S 1 0 0 1 -14 0 2
+Refer: 136 305 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: idieresis
+Encoding: 239 239 134
+Width: 600
+Flags: HMW
+TeX: 105 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 -2 0 2
+Refer: 136 305 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ntilde
+Encoding: 241 241 135
+Width: 600
+Flags: HMW
+TeX: 110 0
+LayerCount: 2
+Fore
+Refer: 138 732 S 1 0 0 1 -6 0 2
+Refer: 6 110 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: dotlessi
+Encoding: 272 305 136
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+133 530 m 0
+ 345 530 l 0
+ 345 67 l 0
+ 469 67 l 0
+ 469 0 l 0
+ 126 0 l 0
+ 126 67 l 0
+ 261 67 l 0
+ 261 462 l 0
+ 133 462 l 0
+ 133 530 l 0
+EndSplineSet
+EndChar
+
+StartChar: circumflex
+Encoding: 261 710 137
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+165 631 m 0
+ 294 794 l 0
+ 319 794 l 0
+ 447 630 l 0
+ 393 590 l 0
+ 303 709 l 0
+ 209 591 l 0
+ 165 631 l 0
+EndSplineSet
+EndChar
+
+StartChar: tilde
+Encoding: 262 732 138
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+167 646 m 0
+ 115 683 l 0
+ 157.86 750.837 200.854 783.268 246.029 783.268 c 0
+ 292.862 783.268 323.97 749.067 338.861 733.55 c 0
+ 357.642 713.979 375.041 696.93 396.658 696.93 c 0
+ 425.237 696.93 438.799 723.991 464 758 c 0
+ 507 712 l 0
+ 466.944 662.14 435.39 629.754 392.65 629.754 c 0
+ 325.264 629.754 293.884 717.432 242.844 717.432 c 0
+ 212.153 717.432 194.763 690.786 167 646 c 0
+EndSplineSet
+EndChar
+
+StartChar: dieresis
+Encoding: 266 168 139
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+257.019 711.498 m 0
+ 257.019 679.211 230.789 652.981 198.502 652.981 c 0
+ 166.212 652.981 139.981 679.209 139.981 711.499 c 0
+ 139.981 743.789 166.21 770.019 198.5 770.019 c 0
+ 230.79 770.019 257.019 743.789 257.019 711.498 c 0
+463.002 711.512 m 0
+ 463.002 679.168 436.956 652.991 405.005 652.991 c 0
+ 373.061 652.991 346.998 679.155 346.998 711.514 c 0
+ 346.998 743.862 373.052 770.035 405.008 770.035 c 0
+ 436.936 770.035 463.002 743.877 463.002 711.512 c 0
+EndSplineSet
+EndChar
+
+StartChar: scaron
+Encoding: 168 353 140
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+Fore
+Refer: 143 711 S 1 0 0 1 0 0 2
+Refer: 3 115 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: zcaron
+Encoding: 184 382 141
+Width: 600
+Flags: HMW
+TeX: 122 0
+LayerCount: 2
+Fore
+Refer: 143 711 S 1 0 0 1 0 0 2
+Refer: 69 122 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: periodcentered
+Encoding: 183 183 142
+Width: 600
+Flags: HMW
+TeX: 112 0
+LayerCount: 2
+Fore
+Refer: 24 46 S 1 0 0 1 0 330 2
+EndChar
+
+StartChar: caron
+Encoding: 271 711 143
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 137 710 S -1 0 0 -1 612 1394 2
+EndChar
+
+StartChar: germandbls
+Encoding: 223 223 144
+Width: 600
+Flags: HMW
+TeX: 103 0
+LayerCount: 2
+Fore
+SplineSet
+74 0 m 4
+ 74 490 l 4
+ 74 542.807 74.667 596.235 98.2086 649.711 c 4
+ 133.73 730.4 208.298 775.004 287.299 775.004 c 4
+ 402.905 775.004 497.21 681.294 497.21 571.108 c 4
+ 497.21 504.487 461.9 445.294 405 416 c 4
+ 491.891 389.079 548.006 305.6 548.006 209.32 c 4
+ 548.006 83.4294 454.191 -12.0295 335.412 -12.0295 c 4
+ 292.776 -12.0295 250.921 0.470711 215 24 c 4
+ 256 89 l 4
+ 278.149 71.5086 305.639 61.9655 334.044 61.9655 c 4
+ 407.901 61.9655 471.132 125.491 471.132 209.399 c 4
+ 471.132 270.281 438.461 323.526 394.789 350.882 c 4
+ 362.072 371.375 330.752 374 293 374 c 4
+ 258 374 l 4
+ 258 440 l 4
+ 291 440 l 4
+ 308.302 440 324.828 440.514 344.201 449.183 c 4
+ 387.876 468.726 418.115 518.564 418.115 573.125 c 4
+ 418.115 649.497 360.647 708.194 291.766 708.194 c 4
+ 253.833 708.194 213.869 689.799 186.719 650.367 c 4
+ 153.729 602.454 153 543.204 153 492 c 4
+ 153 0 l 4
+ 74 0 l 4
+EndSplineSet
+EndChar
+
+StartChar: paragraph
+Encoding: 182 182 145
+Width: 600
+Flags: HMW
+TeX: 112 0
+LayerCount: 2
+Fore
+SplineSet
+515 771 m 0
+ 515 -79 l 0
+ 448 -79 l 0
+ 448 705 l 0
+ 360 705 l 0
+ 360 -79 l 0
+ 291 -79 l 0
+ 291 373 l 0
+ 173.556 380.691 83.9422 470.146 83.9422 574.545 c 0
+ 83.9422 645.65 125.968 713.383 202.879 746.684 c 0
+ 258.505 770.77 316.231 771 370 771 c 0
+ 515 771 l 0
+EndSplineSet
+EndChar
+
+StartChar: section
+Encoding: 167 167 146
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+Fore
+SplineSet
+488 676 m 1
+ 423 618 l 1
+ 414.502 624.421 416.792 633.708 413.888 641.763 c 0
+ 404.459 667.917 369.872 709.915 308.352 709.915 c 0
+ 247.31 709.915 202.994 669.159 202.994 620.922 c 0
+ 202.994 597.432 213.725 561.524 264.348 534.753 c 0
+ 297.607 517.164 341.067 507.397 387.737 485.112 c 0
+ 468.614 446.493 494.176 395.665 494.176 353.922 c 0
+ 494.176 305.481 458.969 262.529 408.539 241.879 c 1
+ 459.313 207.384 483.175 156.542 483.175 107.276 c 0
+ 483.175 16.9904 402.922 -63.0207 285.774 -63.0207 c 0
+ 208.624 -63.0207 133.499 -27.5045 85 36 c 1
+ 146 107 l 1
+ 154.994 103.32 153.114 93.2219 155.624 86.7075 c 0
+ 159.14 77.5825 198.684 13.7598 286.023 13.7598 c 0
+ 356.942 13.7598 400.23 57.0391 400.23 105.026 c 0
+ 400.23 132.111 386.388 163.982 346.982 187.299 c 0
+ 298.949 215.721 233.162 219.874 175.365 254.027 c 0
+ 123.913 284.431 101.679 326.186 101.679 366.086 c 0
+ 101.679 418.429 140.913 463.115 196.205 482.822 c 1
+ 140.944 517.145 118.9 567.71 118.9 613.632 c 0
+ 118.9 701.981 199.381 778.269 307.936 778.269 c 0
+ 384.595 778.269 452.277 738.832 488 676 c 1
+238.744 461.796 m 1
+ 207.924 451.724 185.96 423.141 185.96 389.457 c 0
+ 185.96 363.602 199.372 327.898 248.47 303.876 c 0
+ 283.42 286.776 323.54 281.479 365.239 264.586 c 1
+ 390.576 277.358 407.453 303.587 407.453 333.72 c 0
+ 407.453 360.138 394.181 398.165 340.303 424.753 c 0
+ 310.54 439.44 274.629 447.456 238.744 461.796 c 1
+EndSplineSet
+EndChar
+
+StartChar: copyright
+Encoding: 169 169 147
+Width: 600
+Flags: HMW
+TeX: 99 0
+LayerCount: 2
+Fore
+SplineSet
+313.62 491.091 m 0
+ 386.544 491.091 443.024 445.507 458 384 c 0
+ 398 361 l 0
+ 391.517 368.856 395.372 377.023 393.506 384.631 c 0
+ 391.425 393.116 373.381 433.152 316.115 433.152 c 0
+ 261.422 433.152 207.997 399.047 207.997 326.991 c 0
+ 207.997 256.911 256.399 201.947 317.234 201.947 c 0
+ 353.531 201.947 386.837 222.046 404 254 c 0
+ 455 220 l 0
+ 422.956 171.427 369.074 140.974 312.13 140.974 c 0
+ 217.884 140.974 142.846 222.734 142.846 319.43 c 0
+ 142.846 418.338 220.235 491.091 313.62 491.091 c 0
+306.307 21.8879 m 0
+ 152.945 21.8879 25.7487 152.286 25.7487 317.375 c 0
+ 25.7487 483.34 153.371 614.02 306.766 614.02 c 0
+ 459.736 614.02 587.017 483.767 587.017 318.262 c 0
+ 587.017 152.432 459.471 21.8879 306.307 21.8879 c 0
+78.726 317.799 m 0
+ 78.726 179.711 182.936 71.9098 307.826 71.9098 c 0
+ 432.331 71.9098 537.005 179.647 537.005 318.685 c 0
+ 537.005 457.352 432.659 565 308.142 565 c 0
+ 183.437 565 78.726 457.059 78.726 317.799 c 0
+EndSplineSet
+EndChar
+
+StartChar: registered
+Encoding: 174 174 148
+Width: 600
+Flags: HMW
+TeX: 114 0
+LayerCount: 2
+Fore
+SplineSet
+306.307 21.8879 m 4
+ 152.945 21.8879 25.7487 152.286 25.7487 317.375 c 4
+ 25.7487 483.34 153.371 614.02 306.766 614.02 c 4
+ 459.736 614.02 587.017 483.767 587.017 318.262 c 4
+ 587.017 152.432 459.471 21.8879 306.307 21.8879 c 4
+78.726 317.799 m 4
+ 78.726 179.711 182.936 71.9098 307.826 71.9098 c 4
+ 432.331 71.9098 537.005 179.647 537.005 318.685 c 4
+ 537.005 457.352 432.659 565 308.142 565 c 4
+ 183.437 565 78.726 457.059 78.726 317.799 c 4
+190 154 m 4
+ 190 492 l 4
+ 299 492 l 4
+ 324.843 492 351.991 491.821 378.649 480.542 c 4
+ 417.745 464 439 429.492 439 393.729 c 4
+ 439 352.65 411.132 316.256 371 305 c 4
+ 446 160 l 4
+ 391 152 l 4
+ 319 297 l 4
+ 243 297 l 4
+ 243 154 l 4
+ 190 154 l 4
+243 445 m 4
+ 243 343 l 4
+ 303 343 l 4
+ 322.021 343 344.797 342.906 363.189 354.544 c 4
+ 378.83 364.441 386.001 379.476 386.001 393.691 c 4
+ 386.001 408.753 377.925 424.775 360.288 434.695 c 4
+ 341.595 445.21 319.037 445 300 445 c 4
+ 243 445 l 4
+EndSplineSet
+EndChar
+
+StartChar: uni00B9
+Encoding: 185 185 149
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+SplineSet
+356 733 m 0
+ 356 293 l 0
+ 282 293 l 0
+ 282 641 l 0
+ 170 612 l 0
+ 151 648 l 0
+ 306 733 l 0
+ 356 733 l 0
+EndSplineSet
+EndChar
+
+StartChar: guilsinglleft
+Encoding: 273 8249 150
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+178 293 m 0
+ 354 464 l 0
+ 399 416 l 0
+ 259 279 l 0
+ 407 117 l 0
+ 361 71 l 0
+ 178 266 l 0
+ 178 293 l 0
+EndSplineSet
+EndChar
+
+StartChar: guillemotleft
+Encoding: 171 171 151
+Width: 600
+Flags: HMW
+TeX: 103 0
+LayerCount: 2
+Fore
+Refer: 150 8249 S 1 0 0 1 120 0 2
+Refer: 150 8249 S 1 0 0 1 -90 0 2
+EndChar
+
+StartChar: guilsinglright
+Encoding: 274 8250 152
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 150 8249 N -1 0 0 1 585 0 2
+EndChar
+
+StartChar: guillemotright
+Encoding: 187 187 153
+Width: 600
+Flags: HMW
+TeX: 103 0
+LayerCount: 2
+Fore
+Refer: 151 171 N -1 0 0 1 615 0 2
+EndChar
+
+StartChar: logicalnot
+Encoding: 172 172 154
+Width: 600
+Flags: HMW
+TeX: 108 0
+LayerCount: 2
+Fore
+SplineSet
+116 402 m 0
+ 490 402 l 0
+ 490 182 l 0
+ 416 182 l 0
+ 416 329 l 0
+ 116 329 l 0
+ 116 402 l 0
+EndSplineSet
+EndChar
+
+StartChar: softhyphen
+Encoding: 173 173 155
+Width: 600
+Flags: HMW
+TeX: 115 0
+LayerCount: 2
+Fore
+Refer: 60 45 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: degree
+Encoding: 176 176 156
+Width: 600
+Flags: HMW
+TeX: 100 0
+LayerCount: 2
+Fore
+SplineSet
+463.001 584.452 m 0
+ 463.001 498.746 392.958 428.902 306.439 428.902 c 0
+ 219.963 428.902 149.901 498.735 149.901 584.477 c 0
+ 149.901 670.167 219.932 740.008 306.436 740.008 c 0
+ 392.955 740.008 463.001 670.157 463.001 584.452 c 0
+307.636 679.001 m 0
+ 260.52 679.001 220.977 638.292 220.977 585.822 c 0
+ 220.977 533.609 260.369 492.878 307.592 492.878 c 0
+ 354.564 492.878 394.083 533.556 394.083 586.131 c 0
+ 394.083 638.327 354.712 679.001 307.636 679.001 c 0
+EndSplineSet
+EndChar
+
+StartChar: uni00B2
+Encoding: 178 178 157
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+SplineSet
+139 642 m 0
+ 173.775 702.486 238.827 738.288 309.097 738.288 c 0
+ 401.336 738.288 464.001 678.771 464.001 608.561 c 0
+ 464.001 553.7 426.301 516.004 409.841 500.834 c 0
+ 363.816 458.417 299.741 428.352 235 356 c 0
+ 446 356 l 0
+ 451.284 356 453.692 356.741 458.392 360.794 c 0
+ 460.8 362.871 466.479 368.496 474 366 c 0
+ 474 293 l 0
+ 150 293 l 0
+ 150 344 l 0
+ 214.555 433.275 299.669 489.778 334.371 517.996 c 0
+ 367.994 545.338 394.114 573.311 394.114 608.166 c 0
+ 394.114 644.932 362.276 678.917 306.876 678.917 c 0
+ 262.373 678.917 224.551 655.762 204.174 629.982 c 0
+ 197.924 622.076 198.745 616.904 193 606 c 0
+ 139 642 l 0
+EndSplineSet
+EndChar
+
+StartChar: eth
+Encoding: 240 240 158
+Width: 600
+Flags: HMW
+TeX: 101 0
+LayerCount: 2
+Fore
+SplineSet
+305.228 470.011 m 0
+ 226.957 470.011 144.996 405.543 144.996 269.224 c 0
+ 144.996 134.476 222.952 57.9969 306.097 57.9969 c 0
+ 371.358 57.9969 459.002 107.826 459.002 268.758 c 0
+ 459.002 429.627 365.393 470.011 305.228 470.011 c 0
+411.85 660.892 m 1
+ 482.806 580.388 543.317 462.269 543.317 293.321 c 0
+ 543.317 230.904 536.102 156.905 498.489 94.5252 c 0
+ 455.932 23.9469 383.677 -14.0061 306.684 -14.0061 c 0
+ 172.735 -14.0061 56.7783 98.7597 56.7783 258.02 c 0
+ 56.7783 417.046 169.434 541.31 298.018 541.31 c 0
+ 351.944 541.31 401.981 518.882 437 481 c 1
+ 413.678 540.162 379.782 593.873 337.517 639.819 c 1
+ 190 598 l 1
+ 169 653 l 1
+ 289.257 685.865 l 1
+ 253.708 715.612 213.989 740.637 171 760 c 1
+ 265 779 l 1
+ 294.809 762.216 330.445 738.683 366.105 706.867 c 1
+ 491 741 l 1
+ 511 689 l 1
+ 411.85 660.892 l 1
+EndSplineSet
+EndChar
+
+StartChar: Eth
+Encoding: 208 208 159
+Width: 600
+Flags: HMW
+TeX: 69 0
+LayerCount: 2
+Fore
+SplineSet
+101 722 m 0
+ 263 722 l 0
+ 325.631 722 375.745 716.402 426.079 679.13 c 0
+ 512.98 614.782 550.114 487.96 550.114 365.114 c 0
+ 550.114 211.219 490.967 72.9828 379.857 21.249 c 0
+ 338.865 2.16283 300.228 -1 249 -1 c 0
+ 101 -1 l 0
+ 101 722 l 0
+176 654 m 0
+ 176 66 l 0
+ 245 66 l 0
+ 286.258 66 324.723 68.2387 365.552 95.7969 c 0
+ 435.377 142.927 472.256 240.81 472.256 355.09 c 0
+ 472.256 435.567 454.827 524.974 411.342 584.517 c 0
+ 362.022 652.05 302.634 654 258 654 c 0
+ 176 654 l 0
+45 416 m 0
+ 297 416 l 0
+ 297 349 l 0
+ 45 349 l 0
+ 45 416 l 0
+EndSplineSet
+EndChar
+
+StartChar: Thorn
+Encoding: 222 222 160
+Width: 600
+Flags: HMW
+TeX: 84 0
+LayerCount: 2
+Fore
+SplineSet
+78 722 m 0
+ 169 722 l 0
+ 169.521 720.466 169.785 718.85 169.785 717.216 c 0
+ 169.785 710.792 165.82 706.356 163.318 702.38 c 0
+ 160.184 697.398 160 694.17 160 690 c 0
+ 160 586 l 0
+ 298 586 l 0
+ 344.584 586 389.359 584.805 434.624 561.494 c 0
+ 502.828 526.371 538.016 455.718 538.016 382.699 c 0
+ 538.016 309.503 502.883 240.352 436.114 206.409 c 0
+ 392.262 184.116 348.977 183 304 183 c 0
+ 160 183 l 0
+ 160 0 l 0
+ 78 0 l 0
+ 78 722 l 0
+160 510 m 0
+ 160 254 l 0
+ 307 254 l 0
+ 335.466 254 362.993 254.678 390.831 268.763 c 0
+ 432.659 289.926 455.003 332.944 455.003 378.986 c 0
+ 455.003 425.985 431.629 471.921 386.619 494.5 c 0
+ 357.19 509.263 328.165 510 298 510 c 0
+ 160 510 l 0
+EndSplineSet
+EndChar
+
+StartChar: ring
+Encoding: 268 730 161
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+413.005 700.997 m 0
+ 413.005 645.145 366.039 598.958 306.924 598.958 c 0
+ 247.95 598.958 200.921 645.101 200.921 701.065 c 0
+ 200.921 756.856 247.86 803.005 306.911 803.005 c 0
+ 366.013 803.005 413.005 756.837 413.005 700.997 c 0
+259.914 701.774 m 0
+ 259.914 672.11 281.627 648.896 307.995 648.896 c 0
+ 334.032 648.896 356.035 671.837 356.035 702.068 c 0
+ 356.035 731.828 334.332 755.012 308.022 755.012 c 0
+ 282 755.012 259.914 732.072 259.914 701.774 c 0
+EndSplineSet
+EndChar
+
+StartChar: Aring
+Encoding: 197 197 162
+Width: 600
+Flags: HMW
+TeX: 65 0
+LayerCount: 2
+Fore
+Refer: 161 730 S 1 0 0 1 -19 118 2
+Refer: 71 65 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Agrave
+Encoding: 192 192 163
+Width: 600
+Flags: HMW
+TeX: 65 0
+LayerCount: 2
+Fore
+Refer: 195 -1 S 1 0 0 1 -30 138 2
+Refer: 71 65 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Aacute
+Encoding: 193 193 164
+Width: 600
+Flags: HMW
+TeX: 65 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 -20 138 2
+Refer: 71 65 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Acircumflex
+Encoding: 194 194 165
+Width: 600
+Flags: HMW
+TeX: 65 0
+LayerCount: 2
+Fore
+Refer: 190 -1 N 1 0 0 1 -14 143 2
+Refer: 71 65 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Atilde
+Encoding: 195 195 166
+Width: 600
+Flags: HMW
+TeX: 65 0
+LayerCount: 2
+Fore
+Refer: 138 732 S 1 0 0 1 -5 146 2
+Refer: 71 65 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Adieresis
+Encoding: 196 196 167
+Width: 600
+Flags: HMW
+TeX: 65 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 -13 144 2
+Refer: 71 65 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Egrave
+Encoding: 200 200 168
+Width: 600
+Flags: HMW
+TeX: 69 0
+LayerCount: 2
+Fore
+Refer: 195 -1 S 1 0 0 1 -30 138 2
+Refer: 80 69 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Eacute
+Encoding: 201 201 169
+Width: 600
+Flags: HMW
+TeX: 69 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 0 138 2
+Refer: 80 69 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ecircumflex
+Encoding: 202 202 170
+Width: 600
+Flags: HMW
+TeX: 69 0
+LayerCount: 2
+Fore
+Refer: 190 -1 S 1 0 0 1 -4 143 2
+Refer: 80 69 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Edieresis
+Encoding: 203 203 171
+Width: 600
+Flags: HMW
+TeX: 69 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 -5 144 2
+Refer: 80 69 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Igrave
+Encoding: 204 204 172
+Width: 600
+Flags: HMW
+TeX: 73 0
+LayerCount: 2
+Fore
+Refer: 195 -1 S 1 0 0 1 -30 138 2
+Refer: 4 73 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Iacute
+Encoding: 205 205 173
+Width: 600
+Flags: HMW
+TeX: 73 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 0 138 2
+Refer: 4 73 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Icircumflex
+Encoding: 206 206 174
+Width: 600
+Flags: HMW
+TeX: 73 0
+LayerCount: 2
+Fore
+Refer: 190 -1 S 1 0 0 1 -15 143 2
+Refer: 4 73 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Idieresis
+Encoding: 207 207 175
+Width: 600
+Flags: HMW
+TeX: 73 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 -9 144 2
+Refer: 4 73 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ograve
+Encoding: 210 210 176
+Width: 600
+Flags: HMW
+TeX: 79 0
+LayerCount: 2
+Fore
+Refer: 195 -1 S 1 0 0 1 -30 138 2
+Refer: 42 79 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Oacute
+Encoding: 211 211 177
+Width: 600
+Flags: HMW
+TeX: 79 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 0 138 2
+Refer: 42 79 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ocircumflex
+Encoding: 212 212 178
+Width: 600
+Flags: HMW
+TeX: 79 0
+LayerCount: 2
+Fore
+Refer: 190 -1 S 1 0 0 1 -1 143 2
+Refer: 42 79 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Otilde
+Encoding: 213 213 179
+Width: 600
+Flags: HMW
+TeX: 79 0
+LayerCount: 2
+Fore
+Refer: 138 732 S 1 0 0 1 0 146 2
+Refer: 42 79 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Odieresis
+Encoding: 214 214 180
+Width: 600
+Flags: HMW
+TeX: 79 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 -5 144 2
+Refer: 42 79 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ugrave
+Encoding: 217 217 181
+Width: 600
+Flags: HMW
+TeX: 85 0
+LayerCount: 2
+Fore
+Refer: 195 -1 S 1 0 0 1 -30 138 2
+Refer: 63 85 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Uacute
+Encoding: 218 218 182
+Width: 600
+Flags: HMW
+TeX: 85 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 0 138 2
+Refer: 63 85 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ucircumflex
+Encoding: 219 219 183
+Width: 600
+Flags: HMW
+TeX: 85 0
+LayerCount: 2
+Fore
+Refer: 190 -1 S 1 0 0 1 -1 143 2
+Refer: 63 85 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Udieresis
+Encoding: 220 220 184
+Width: 600
+Flags: HMW
+TeX: 85 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 5 144 2
+Refer: 63 85 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Yacute
+Encoding: 221 221 185
+Width: 600
+Flags: HMW
+TeX: 89 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 0 138 2
+Refer: 94 89 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Scaron
+Encoding: 166 352 186
+Width: 600
+Flags: HMW
+TeX: 83 0
+LayerCount: 2
+Fore
+Refer: 191 -1 S 1 0 0 1 14 143 2
+Refer: 50 83 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Zcaron
+Encoding: 180 381 187
+Width: 600
+Flags: HMW
+TeX: 90 0
+LayerCount: 2
+Fore
+Refer: 191 -1 S 1 0 0 1 8 143 2
+Refer: 96 90 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ntilde
+Encoding: 209 209 188
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 138 732 S 1 0 0 1 0 146 2
+Refer: 46 78 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ydieresis
+Encoding: 190 376 189
+Width: 600
+Flags: HMW
+TeX: 89 0
+LayerCount: 2
+Fore
+Refer: 139 168 S 1 0 0 1 -5 144 2
+Refer: 94 89 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: circumflex.cap
+Encoding: 275 -1 190
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+142 659 m 0
+ 294 774 l 0
+ 319 774 l 0
+ 462 661 l 0
+ 424 617 l 0
+ 304 699 l 0
+ 175 620 l 0
+ 142 659 l 0
+EndSplineSet
+EndChar
+
+StartChar: caron.cap
+Encoding: 276 -1 191
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 190 -1 N -1 0 0 -1 604 1391 2
+EndChar
+
+StartChar: ae
+Encoding: 230 230 192
+Width: 600
+Flags: HMW
+TeX: 97 0
+LayerCount: 2
+Fore
+SplineSet
+46 477 m 0
+ 78.8401 518.176 128.534 541.042 179.797 541.042 c 0
+ 236.11 541.042 284.02 513.302 309 469 c 0
+ 334.856 513.703 382.031 541.063 431.036 541.063 c 0
+ 472.731 541.063 518.654 520.729 547.495 473.472 c 0
+ 578.346 422.921 578 363.164 578 311 c 0
+ 578 267 l 0
+ 337 257 l 0
+ 337 203 l 0
+ 337 175.493 338.021 151.766 349.064 126.614 c 0
+ 368.654 81.9912 411.522 54.9866 456.731 54.9866 c 0
+ 490.681 54.9866 522.098 70.3702 542 97 c 0
+ 583 49 l 0
+ 550.251 9.72841 501.736 -13.0005 450.565 -13.0005 c 0
+ 391.56 -13.0005 336.63 17.1888 305 67 c 0
+ 280.108 17.8701 229.631 -13.1551 174.237 -13.1551 c 0
+ 90.7707 -13.1551 21.8352 56.2141 21.8352 143.282 c 0
+ 21.8352 202.576 54.9902 266.973 127.653 299.766 c 0
+ 170.84 319.256 212.144 320.928 240 322 c 0
+ 266 323 l 0
+ 266 353 l 0
+ 266 374.299 265.203 393.531 258.429 412.515 c 0
+ 244.402 451.823 210.556 476.08 174.377 476.08 c 0
+ 141.829 476.08 108.382 456.741 87 426 c 0
+ 46 477 l 0
+266 254 m 0
+ 241 253 l 0
+ 211.382 251.816 180.822 251.083 151.425 236.018 c 0
+ 113.557 216.612 95.9804 181.173 95.9804 148.063 c 0
+ 95.9804 97.6227 135.259 57.9703 182.206 57.9703 c 0
+ 213.618 57.9703 245.532 76.2592 258.599 111.796 c 0
+ 268.711 139.296 266 169.723 266 210 c 0
+ 266 254 l 0
+337 323 m 0
+ 511 330 l 0
+ 511 353 l 0
+ 511 376.887 510.557 401.019 500.259 424.945 c 0
+ 486.37 457.213 459.423 476.188 430.019 476.188 c 0
+ 401.442 476.188 375.8 458.055 358.925 432.777 c 0
+ 338.424 402.068 337 371.27 337 343 c 0
+ 337 323 l 0
+EndSplineSet
+EndChar
+
+StartChar: oe
+Encoding: 189 339 193
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+SplineSet
+197.072 540.057 m 0
+ 240.284 540.057 279.952 520.667 305 487 c 0
+ 334.471 520.96 377.351 540.072 422.223 540.072 c 0
+ 475.912 540.072 535.759 511.906 562.005 440.15 c 0
+ 580.682 389.088 578 326.96 578 269 c 0
+ 578 256 l 0
+ 314 256 l 0
+ 314.609 182.929 318.122 148.32 330.688 119.841 c 0
+ 351.232 73.2809 394.067 53.9506 437.272 53.9506 c 0
+ 470.728 53.9506 512.336 65.2296 542 99 c 0
+ 583 49 l 0
+ 544.141 8.97946 490.715 -13.6292 434.895 -13.6292 c 0
+ 386.721 -13.6292 340.059 3.2209 303 34 c 0
+ 271.715 5.40179 230.291 -13.0256 188.332 -13.0256 c 0
+ 142.262 -13.0256 83.7901 10.4289 49.2458 81.4235 c 0
+ 21.2947 138.868 16.9924 213.135 16.9924 274.024 c 0
+ 16.9924 327.287 21.0077 390.061 49.5869 444.004 c 0
+ 83.9791 508.918 142.432 540.057 197.072 540.057 c 0
+315 322 m 0
+ 509 322 l 0
+ 509 332 l 0
+ 509 366.277 509.724 402.65 491.454 433.147 c 0
+ 473.764 462.676 442.71 476.791 412.738 476.791 c 0
+ 382.558 476.791 345.109 462.072 327.261 414.077 c 0
+ 324.697 407.181 313.856 377.196 315 322 c 0
+86.9292 285.092 m 0
+ 86.9292 245.957 89.3121 188.587 103.747 142.737 c 0
+ 123.421 80.2444 163.532 57.8299 198.359 57.8299 c 0
+ 227.31 57.8299 256.518 74.2456 256.518 103.197 c 0
+ 256.518 118.213 241.952 172.81 241.952 273.514 c 0
+ 241.952 359.739 252.376 403.185 252.376 419.746 c 0
+ 252.376 450.246 226.518 470.076 196.284 470.076 c 0
+ 163.481 470.076 128.259 447.486 107.574 402.839 c 0
+ 89.1704 363.117 86.9292 317.746 86.9292 285.092 c 0
+EndSplineSet
+EndChar
+
+StartChar: acute.cap
+Encoding: 278 -1 194
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+387 779 m 0
+ 433 698 l 0
+ 237 627 l 0
+ 210 675 l 0
+ 387 779 l 0
+EndSplineSet
+EndChar
+
+StartChar: grave.cap
+Encoding: 277 -1 195
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 194 -1 N -1 0 0 1 637 0 2
+EndChar
+
+StartChar: ordfeminine
+Encoding: 170 170 196
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+SplineSet
+152 656 m 0
+ 193.633 703.845 253.099 721.283 307.799 721.283 c 0
+ 370.636 721.283 423.692 696.264 447.562 644.964 c 0
+ 459.785 618.695 461 592.461 461 562 c 0
+ 461 309 l 0
+ 388 309 l 0
+ 388 348 l 0
+ 353.62 315.567 309.294 297.999 264.37 297.999 c 0
+ 184.05 297.999 127.995 354.534 127.995 418.965 c 0
+ 127.995 457.362 148.672 500.379 196.972 526.099 c 0
+ 248.841 553.719 312.645 551 370 551 c 0
+ 387 551 l 0
+ 387 565 l 0
+ 387 584.588 386.635 605.218 374.201 624.596 c 0
+ 361.1 645.014 336.794 659.022 300.518 659.022 c 0
+ 260.387 659.022 218.034 643.693 192 608 c 0
+ 152 656 l 0
+390 491 m 0
+ 371 491 l 0
+ 340.994 491 302.242 493.162 271.69 487.742 c 0
+ 220.555 478.672 202.865 447.25 202.865 422.155 c 0
+ 202.865 389.707 231.214 360.688 275.85 360.688 c 0
+ 311.446 360.688 343.688 377.899 364.269 397.046 c 0
+ 389.322 420.354 390 444.06 390 471 c 0
+ 390 491 l 0
+98 239 m 0
+ 503 239 l 0
+ 503 176 l 0
+ 98 176 l 0
+ 98 239 l 0
+EndSplineSet
+EndChar
+
+StartChar: ordmasculine
+Encoding: 186 186 197
+Width: 600
+Flags: HMW
+TeX: 111 0
+LayerCount: 2
+Fore
+SplineSet
+301.826 721.011 m 0
+ 385.223 721.011 470.107 653.808 470.107 514.756 c 0
+ 470.107 364.793 379.364 296.94 294.598 296.94 c 0
+ 202.824 296.94 120.827 374.446 120.827 500.869 c 0
+ 120.827 633.779 205.502 721.011 301.826 721.011 c 0
+190.986 506.214 m 0
+ 190.986 409.196 244.9 363.925 296.394 363.925 c 0
+ 345.93 363.925 401 406.473 401 506.207 c 0
+ 401 605.509 349.544 656 296.205 656 c 0
+ 243.333 656 190.986 606.057 190.986 506.214 c 0
+98 239 m 0
+ 503 239 l 0
+ 503 176 l 0
+ 98 176 l 0
+ 98 239 l 0
+EndSplineSet
+EndChar
+
+StartChar: uni02C9
+Encoding: 263 713 198
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+153 720 m 0
+ 447 720 l 0
+ 447 655 l 0
+ 153 655 l 0
+ 153 720 l 0
+EndSplineSet
+EndChar
+
+StartChar: macron
+Encoding: 175 175 199
+Width: 600
+Flags: HMW
+TeX: 109 0
+LayerCount: 2
+Fore
+Refer: 198 713 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: omacron
+Encoding: 279 333 200
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 198 713 S 1 0 0 1 0 0 2
+Refer: 5 111 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: cedilla
+Encoding: 269 184 201
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+313 0 m 0
+ 363 0 l 0
+ 357 -55 l 0
+ 376 -56 l 0
+ 390.785 -56.7788 405.994 -57.7164 420.883 -64.9414 c 0
+ 442.973 -75.6606 455.07 -96.4917 455.07 -118.956 c 0
+ 455.07 -160.352 414.433 -205.092 329.389 -205.092 c 0
+ 284.871 -205.092 235.296 -192.447 192 -162 c 0
+ 221 -114 l 0
+ 257.397 -143.353 301.031 -155.011 336.064 -155.011 c 0
+ 381.118 -155.011 389.002 -136.826 389.002 -126.739 c 0
+ 389.002 -119.915 385.46 -112.176 376.38 -106.611 c 0
+ 363.902 -98.9638 347.2 -99 334 -99 c 0
+ 300 -99 l 0
+ 313 0 l 0
+EndSplineSet
+EndChar
+
+StartChar: ccedilla
+Encoding: 231 231 202
+Width: 600
+Flags: HMW
+TeX: 99 0
+LayerCount: 2
+Fore
+Refer: 201 184 S 1 0 0 1 0 0 2
+Refer: 1 99 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ccedilla
+Encoding: 199 199 203
+Width: 600
+Flags: HMW
+TeX: 67 0
+LayerCount: 2
+Fore
+Refer: 201 184 S 1 0 0 1 0 0 2
+Refer: 72 67 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: uni00B3
+Encoding: 179 179 204
+Width: 600
+Flags: HMW
+TeX: 117 0
+LayerCount: 2
+Fore
+SplineSet
+308.545 739.11 m 0
+ 394.884 739.11 460.209 681.247 460.209 614.55 c 0
+ 460.209 572.151 433.428 536.235 395 524 c 0
+ 444.061 515.328 480.001 473.423 480.001 424.669 c 0
+ 480.001 348.943 397.312 290.99 304.904 290.99 c 0
+ 241.699 290.99 181.599 318.471 140 366 c 0
+ 194 426 l 0
+ 204.212 415.153 199.361 404.247 210.154 393.714 c 0
+ 216.257 387.757 251.225 355.987 306.079 355.987 c 0
+ 362.89 355.987 408.454 389.769 408.454 431.009 c 0
+ 408.454 452.324 395.326 495.101 306.637 495.101 c 0
+ 294.627 495.101 283.183 494.368 272 493 c 0
+ 272 551 l 0
+ 279.636 550.27 287.301 549.894 294.972 549.894 c 0
+ 370.889 549.894 391.54 582.897 391.54 609.502 c 0
+ 391.54 644.172 357.159 678.038 305.041 678.038 c 0
+ 265.85 678.038 224.827 658.777 197 624 c 0
+ 155 667 l 0
+ 193.931 713.015 250.216 739.11 308.545 739.11 c 0
+EndSplineSet
+EndChar
+
+StartChar: divide
+Encoding: 247 247 205
+Width: 600
+Flags: HMW
+TeX: 100 0
+LayerCount: 2
+Fore
+SplineSet
+92 403 m 0
+ 509 403 l 0
+ 509 326 l 0
+ 92 326 l 0
+ 92 403 l 0
+358 540.992 m 0
+ 358 512.297 334.695 488.972 305.98 488.972 c 0
+ 277.279 488.972 253.962 512.289 253.962 540.99 c 0
+ 253.962 569.692 277.277 593.01 305.98 593.01 c 0
+ 334.693 593.01 358 569.686 358 540.992 c 0
+358.01 183.993 m 0
+ 358.01 155.275 334.682 131.943 305.964 131.943 c 0
+ 277.243 131.943 253.913 155.271 253.913 183.992 c 0
+ 253.913 212.712 277.242 236.04 305.963 236.04 c 0
+ 334.68 236.04 358.01 212.71 358.01 183.993 c 0
+EndSplineSet
+EndChar
+
+StartChar: Oslash
+Encoding: 216 216 206
+Width: 600
+Flags: HMW
+TeX: 79 0
+LayerCount: 2
+Fore
+SplineSet
+300.361 654.01 m 0
+ 224.496 654.01 123.971 587.911 123.971 372.659 c 0
+ 123.971 281.791 139.578 215.128 163.473 167.742 c 1
+ 399.758 612.324 l 1
+ 368.854 641.994 332.534 654.01 300.361 654.01 c 0
+556.008 359.504 m 0
+ 556.008 296.095 551.428 206.273 513.069 128.645 c 0
+ 465.538 32.4568 382.426 -11.0151 304.485 -11.0151 c 0
+ 261.834 -11.0151 213.304 2.30387 169.786 34.9718 c 1
+ 112 -73 l 1
+ 52 -42 l 1
+ 119.616 85.2228 l 1
+ 75.1957 143.737 43.9996 232.717 43.9996 362.113 c 0
+ 43.9996 645.884 196.081 730 303.761 730 c 0
+ 349.84 730 397.121 715.105 437.897 684.085 c 1
+ 491 784 l 1
+ 553 751 l 1
+ 488.971 631.363 l 1
+ 497.238 619.916 504.885 607.435 511.792 593.902 c 0
+ 551.172 516.748 556.008 427.05 556.008 359.504 c 0
+443.911 547.169 m 1
+ 208.342 107.012 l 1
+ 238.634 79.4207 273.138 67.987 304.834 67.987 c 0
+ 353.415 67.987 409.354 95.4457 442.765 165.717 c 0
+ 472.354 227.951 475.085 301.614 475.085 348.897 c 0
+ 475.085 410.01 471.386 479.154 446.984 539.849 c 2
+ 443.911 547.169 l 1
+EndSplineSet
+EndChar
+
+StartChar: multiply
+Encoding: 215 215 207
+Width: 600
+Flags: HMW
+TeX: 109 0
+LayerCount: 2
+Fore
+SplineSet
+453 583 m 1
+ 508 532 l 1
+ 357.683 376.932 l 1
+ 505 221 l 1
+ 451 168 l 1
+ 304.762 322.338 l 1
+ 160 173 l 1
+ 108 224 l 1
+ 253.994 375.919 l 1
+ 108 530 l 1
+ 163 583 l 1
+ 306.764 430.829 l 1
+ 453 583 l 1
+EndSplineSet
+EndChar
+
+StartChar: AE
+Encoding: 198 198 208
+Width: 600
+Flags: HMW
+TeX: 65 0
+LayerCount: 2
+Fore
+SplineSet
+242 723 m 0
+ 571 723 l 0
+ 571 651 l 0
+ 370 651 l 0
+ 372 414 l 0
+ 541 414 l 0
+ 541 340 l 0
+ 373 340 l 0
+ 375 72 l 0
+ 568 72 l 0
+ 568 0 l 0
+ 302 0 l 0
+ 302 196 l 0
+ 151 196 l 0
+ 89 0 l 0
+ 15 0 l 0
+ 242 723 l 0
+302 651 m 0
+ 289 651 l 0
+ 168 263 l 0
+ 302 263 l 0
+ 302 651 l 0
+EndSplineSet
+EndChar
+
+StartChar: OE
+Encoding: 188 338 209
+Width: 600
+Flags: HMW
+TeX: 79 0
+LayerCount: 2
+Fore
+SplineSet
+303 690 m 0
+ 303 723 l 0
+ 571 723 l 0
+ 571 651 l 0
+ 375 651 l 0
+ 375 414 l 0
+ 541 414 l 0
+ 541 340 l 0
+ 375 340 l 0
+ 375 72 l 0
+ 568 72 l 0
+ 568 0 l 0
+ 302 0 l 0
+ 302 36 l 0
+ 278.697 7.88689 244.099 -8.08716 207.296 -8.08716 c 0
+ 150.139 -8.08716 80.2583 30.5805 47.0562 139.126 c 0
+ 42.7406 153.235 20.7902 225.823 20.7902 361.821 c 0
+ 20.7902 459.095 28.5992 542.924 59.6634 615.563 c 0
+ 98.0648 705.359 160.916 732.002 207.762 732.002 c 0
+ 243.981 732.002 278.474 716.617 303 690 c 0
+94.9751 375.779 m 0
+ 94.9751 343.461 94.9497 221.604 127.295 142.578 c 0
+ 153.346 78.9291 191.363 62.9836 217.46 62.9836 c 0
+ 257.506 62.9836 290.624 98.6049 302 150 c 0
+ 302 562 l 0
+ 289.634 601.236 259.887 665.004 207.671 665.004 c 0
+ 173.506 665.004 138.571 636.141 117.537 573.058 c 0
+ 110.441 551.779 94.9751 498.335 94.9751 375.779 c 0
+EndSplineSet
+EndChar
+
+StartChar: currency
+Encoding: 280 164 210
+Width: 600
+Flags: HMWO
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+300.7 516.248 m 0
+ 236.708 516.248 184.352 463.893 184.352 399.9 c 0
+ 184.352 335.907 236.708 283.553 300.7 283.553 c 0
+ 364.693 283.553 417.049 335.907 417.049 399.9 c 0
+ 417.049 463.893 364.693 516.248 300.7 516.248 c 0
+88.9004 569.9 m 1
+ 130.1 611.1 l 1
+ 195.483 545.717 l 1
+ 225.127 567.202 261.503 579.9 300.7 579.9 c 0
+ 339.284 579.9 375.133 567.597 404.52 546.719 c 1
+ 468.9 611.1 l 1
+ 510.1 569.9 l 1
+ 446.011 505.811 l 1
+ 467.803 476.042 480.7 439.404 480.7 399.9 c 0
+ 480.7 360.703 468.002 324.327 446.517 294.683 c 1
+ 510.1 231.1 l 1
+ 468.9 189.9 l 1
+ 405.22 253.58 l 1
+ 375.704 232.4 339.591 219.9 300.7 219.9 c 0
+ 261.196 219.9 224.558 232.797 194.789 254.589 c 1
+ 130.1 189.9 l 1
+ 88.9004 231.1 l 1
+ 153.881 296.08 l 1
+ 133.003 325.467 120.7 361.316 120.7 399.9 c 0
+ 120.7 438.791 133.2 474.904 154.38 504.42 c 1
+ 88.9004 569.9 l 1
+EndSplineSet
+EndChar
+
+StartChar: brokenbar
+Encoding: 281 166 211
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+261 756 m 0
+ 339 756 l 0
+ 339 342 l 0
+ 261 342 l 0
+ 261 756 l 0
+339 -175 m 0
+ 261 -175 l 0
+ 261 227 l 0
+ 339 227 l 0
+ 339 -175 l 0
+EndSplineSet
+EndChar
+
+StartChar: onehalf
+Encoding: 283 189 212
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 274 8260 S 1 0 0 1 0 0 2
+Refer: 157 178 N 0.8 0 0 0.8 201.3 -318.872 2
+Refer: 149 185 N 0.8 0 0 0.8 -107.4 198.6 2
+EndChar
+
+StartChar: nonbreakingspace
+Encoding: 160 160 213
+Width: 600
+Flags: HMW
+TeX: 110 0
+LayerCount: 2
+EndChar
+
+StartChar: ogonek
+Encoding: 270 731 214
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+422 0 m 0
+ 499 0 l 0
+ 460.042 -34.9926 431.396 -66.5962 421.556 -77.7406 c 0
+ 413.412 -86.9647 402.048 -100.705 402.048 -117.842 c 0
+ 402.048 -135.64 414.849 -150.797 435.947 -150.797 c 0
+ 443.138 -150.797 451.677 -149.114 463.857 -144.679 c 0
+ 481.957 -138.087 493.634 -130.111 501 -124 c 0
+ 501 -177 l 0
+ 478.28 -196.689 449.7 -204.002 420.9 -204.002 c 0
+ 360.858 -204.002 330.051 -171.745 330.051 -133.094 c 0
+ 330.051 -95.7614 361.962 -49.529 422 0 c 0
+EndSplineSet
+EndChar
+
+StartChar: Aogonek
+Encoding: 285 260 215
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 214 731 S 1 0 0 1 72 0 2
+Refer: 71 65 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Lcaron
+Encoding: 287 317 216
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 56 8217 S 0.8 0 0 0.8 206.515 136.393 2
+Refer: 52 76 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Sacute
+Encoding: 288 346 217
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 -20 138 2
+Refer: 50 83 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Scedilla
+Encoding: 289 350 218
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 201 184 S 1 0 0 1 -37 0 2
+Refer: 50 83 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Tcaron
+Encoding: 290 356 219
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 191 -1 S 1 0 0 1 8 143 2
+Refer: 59 84 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Zacute
+Encoding: 291 377 220
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 -20 138 2
+Refer: 96 90 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Zdotaccent
+Encoding: 292 379 221
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 222 729 S 1 0 0 1 0 147 2
+Refer: 96 90 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: dotaccent
+Encoding: 265 729 222
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+SplineSet
+305.003 760 m 0
+ 338.171 760 365.019 733.28 365.019 700.493 c 0
+ 365.019 667.727 338.182 640.992 304.99 640.992 c 0
+ 271.818 640.992 244.981 667.716 244.981 700.486 c 0
+ 244.981 733.264 271.822 760 305.003 760 c 0
+EndSplineSet
+EndChar
+
+StartChar: Racute
+Encoding: 293 340 223
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 -20 138 2
+Refer: 101 82 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Abreve
+Encoding: 294 258 224
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 241 728 S 1 0 0 1 -11 160 2
+Refer: 71 65 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Lacute
+Encoding: 295 313 225
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 -20 138 2
+Refer: 52 76 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Cacute
+Encoding: 296 262 226
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 -20 138 2
+Refer: 72 67 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ccaron
+Encoding: 297 268 227
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 191 -1 S 1 0 0 1 27 143 2
+Refer: 72 67 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Eogonek
+Encoding: 298 280 228
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 214 731 S 1 0 0 1 17 0 2
+Refer: 80 69 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ecaron
+Encoding: 299 282 229
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 191 -1 S 1 0 0 1 8 143 2
+Refer: 80 69 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Dcaron
+Encoding: 300 270 230
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 191 -1 S 1 0 0 1 -22 143 2
+Refer: 79 68 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Dcroat
+Encoding: 301 272 231
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 159 208 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Nacute
+Encoding: 302 323 232
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 194 -1 S 1 0 0 1 -20 138 2
+Refer: 46 78 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ncaron
+Encoding: 303 327 233
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 191 -1 S 1 0 0 1 8 143 2
+Refer: 46 78 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Ohungarumlaut
+Encoding: 304 336 234
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 270 -1 S 1 0 0 1 0 0 2
+Refer: 42 79 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Rcaron
+Encoding: 305 344 235
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 191 -1 S 1 0 0 1 8 143 2
+Refer: 101 82 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Uring
+Encoding: 306 366 236
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 161 730 S 1 0 0 1 -4 118 2
+Refer: 63 85 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Uhungarumlaut
+Encoding: 307 368 237
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 270 -1 S 1 0 0 1 0 0 2
+Refer: 63 85 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Tcedilla
+Encoding: 308 354 238
+Width: 600
+Flags: HMW
+TeX: 78 0
+LayerCount: 2
+Fore
+Refer: 201 184 S 1 0 0 1 -44 0 2
+Refer: 59 84 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: aogonek
+Encoding: 309 261 239
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 214 731 S 1 0 0 1 14 0 2
+Refer: 0 97 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: hungarumlaut
+Encoding: 267 733 240
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 -90 0 2
+Refer: 107 180 N 1 0 0 1 90 0 2
+EndChar
+
+StartChar: breve
+Encoding: 264 728 241
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+169 749 m 0
+ 195.428 707.212 242.085 666.993 299.32 666.993 c 0
+ 347.638 666.993 397.467 696.856 437 748 c 0
+ 470 700 l 0
+ 430.784 646.838 369.515 606.983 299.498 606.983 c 0
+ 236.205 606.983 172.965 640.673 127 696 c 0
+ 169 749 l 0
+EndSplineSet
+EndChar
+
+StartChar: eng
+Encoding: 332 331 242
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+SplineSet
+89 0 m 0
+ 89 529 l 0
+ 174 529 l 0
+ 174 436 l 0
+ 212.871 495.002 278.12 542.003 349.957 542.003 c 0
+ 410.281 542.003 464.544 508.129 490.899 448.568 c 0
+ 509.729 406.014 510 362.334 510 321 c 0
+ 510 65 l 0
+ 510 16.919 509.539 -32.1813 489.487 -81.4966 c 0
+ 457.36 -160.511 387.101 -203.685 314.113 -203.685 c 0
+ 273.194 -203.685 233.402 -190.084 201 -165 c 0
+ 241 -87 l 0
+ 248.911 -88.73 247.814 -97.6079 250.927 -102.004 c 0
+ 253.743 -105.982 279.85 -126.182 316.013 -126.182 c 0
+ 347.932 -126.182 381.001 -110.476 402.714 -76.7224 c 0
+ 427.982 -37.4432 428 10.8898 428 52 c 0
+ 428 319 l 0
+ 428 356.393 427.762 401.823 399.11 436.061 c 0
+ 380.097 458.781 353.908 469.58 327.341 469.58 c 0
+ 271.362 469.58 220.49 422.787 200.308 395.893 c 0
+ 178.287 366.55 174 340.651 174 305 c 0
+ 174 0 l 0
+ 89 0 l 0
+EndSplineSet
+EndChar
+
+StartChar: abreve
+Encoding: 310 259 243
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 241 728 S 1 0 0 1 10 0 2
+Refer: 0 97 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ccaron
+Encoding: 311 269 244
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 1 99 N 1 0 0 1 0 0 2
+Refer: 143 711 S 1 0 0 1 0 0 2
+EndChar
+
+StartChar: dcaron
+Encoding: 312 271 245
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+368 452 m 0
+ 368 771 l 0
+ 447 771 l 0
+ 447 49 l 0
+ 447 32.9912 447.786 16.2109 452 0 c 0
+ 369 0 l 0
+ 364.758 12.8477 364 26.4229 364 39 c 0
+ 364 85 l 0
+ 331.672 29.4834 274.151 -12.0137 209.492 -12.0137 c 0
+ 97.8574 -12.0137 9.99902 105.708 9.99902 268.875 c 0
+ 9.99902 443.625 112.897 543.229 220.226 543.229 c 0
+ 283.503 543.229 340.554 507.905 368 452 c 0
+224.355 475.159 m 0
+ 149.202 475.159 90.9316 392.789 90.9316 278.779 c 0
+ 90.9316 171.018 142.046 61.8809 227.748 61.8809 c 0
+ 273.537 61.8809 313.653 94.3154 335.296 129.689 c 0
+ 358.192 167.108 361.312 207.25 361.312 255.021 c 0
+ 361.312 325.707 359.835 363.117 343.567 397.269 c 0
+ 320.504 445.688 266.849 475.159 224.355 475.159 c 0
+EndSplineSet
+Refer: 56 8217 N 0.8 0 0 0.8 306.515 186.393 2
+EndChar
+
+StartChar: eogonek
+Encoding: 313 281 246
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+309.849 542.279 m 0
+ 396.962 542.279 495.692 495.772 519.469 353.277 c 0
+ 524.642 322.276 526.146 288.58 523 253 c 1
+ 147.298 253 l 1
+ 153.598 94.4857 256.131 55.4411 326.953 55.4411 c 0
+ 379.589 55.4411 429.496 76.3575 464 115 c 1
+ 510 70 l 1
+ 469 19 l 2
+ 429.072 -30.6685 396.601 -67.9568 396.601 -101.807 c 0
+ 396.601 -127.998 415.588 -147.006 441.833 -147.006 c 0
+ 447.913 -147.006 467.621 -146.296 501 -125 c 1
+ 500 -182 l 1
+ 478.223 -193.942 451.111 -202.754 423.732 -202.754 c 0
+ 365.924 -202.754 327.823 -164.029 327.823 -116.525 c 0
+ 327.823 -82.2885 349.347 -41.4463 392 -1 c 1
+ 366.185 -8.27677 339.549 -12.0058 312.827 -12.0058 c 0
+ 173.799 -12.0058 66.4395 87.3647 66.4395 261.323 c 0
+ 66.4395 451.743 183.571 542.279 309.849 542.279 c 0
+150.008 317 m 1
+ 441 317 l 1
+ 450.942 402.839 389.68 478.169 303.883 478.169 c 0
+ 247.072 478.169 166.495 441.85 150.008 317 c 1
+EndSplineSet
+EndChar
+
+StartChar: lcaron
+Encoding: 314 318 247
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 56 8217 S 0.8 0 0 0.8 266.515 186.393 2
+Refer: 7 108 N 1 0 0 1 -20 0 2
+EndChar
+
+StartChar: lacute
+Encoding: 315 314 248
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 7 108 N 1 0 0 1 0 0 2
+Refer: 194 -1 S 1 0 0 1 -20 188 2
+EndChar
+
+StartChar: nacute
+Encoding: 316 324 249
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 6 110 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ncaron
+Encoding: 317 328 250
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 143 711 S 1 0 0 1 0 0 2
+Refer: 6 110 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ohungarumlaut
+Encoding: 318 337 251
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 240 733 S 1 0 0 1 0 0 2
+Refer: 5 111 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: rcaron
+Encoding: 319 345 252
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 143 711 S 1 0 0 1 0 0 2
+Refer: 16 114 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: sacute
+Encoding: 320 347 253
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 3 115 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: scedilla
+Encoding: 322 351 254
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 201 184 S 1 0 0 1 -30 0 2
+Refer: 3 115 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: tcedilla
+Encoding: 323 355 255
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 201 184 S 1 0 0 1 20 0 2
+Refer: 8 116 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: uring
+Encoding: 324 367 256
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 161 730 S 1 0 0 1 0 0 2
+Refer: 15 117 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: uhungarumlaut
+Encoding: 325 369 257
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 240 733 S 1 0 0 1 0 0 2
+Refer: 15 117 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: zdot
+Encoding: 326 380 258
+Width: 600
+Flags: HMWO
+LayerCount: 2
+Fore
+Refer: 69 122 S 1 0 0 1 0 0 2
+Refer: 222 729 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: dotlessj
+Encoding: 331 567 259
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+SplineSet
+156 530 m 0
+ 437 530 l 0
+ 437 37 l 0
+ 437 -8.68478 435.772 -52.1052 413.163 -96.3812 c 0
+ 377.277 -166.657 303.238 -202.181 227.699 -202.181 c 0
+ 162.017 -202.181 103.902 -175.027 66 -128 c 0
+ 120 -56 l 0
+ 127.204 -61.9473 125.358 -69.4816 130.11 -77.2483 c 0
+ 134.378 -84.2222 169.009 -130.016 233.016 -130.016 c 0
+ 277.791 -130.016 319.506 -106.298 339.459 -63.2398 c 0
+ 352.497 -35.1019 353 -7.27543 353 21 c 0
+ 353 461 l 0
+ 156 461 l 0
+ 156 530 l 0
+EndSplineSet
+EndChar
+
+StartChar: kgreenlandic
+Encoding: 330 312 260
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+SplineSet
+87 529 m 0
+ 182 529 l 0
+ 182.131 528.206 182.196 527.403 182.196 526.598 c 0
+ 182.196 519.678 177.642 515.346 174.831 511.514 c 0
+ 171.215 506.587 171 503.254 171 499 c 0
+ 171 286 l 0
+ 436 532 l 0
+ 456.53 526.949 477.704 526 498 526 c 0
+ 528 526 l 0
+ 305 316 l 0
+ 565 -1 l 0
+ 562.299 -0.982364 559.597 -0.973546 556.896 -0.973546 c 0
+ 501.401 -0.973546 457 -5 457 -5 c 0
+ 241 265 l 0
+ 171 200 l 0
+ 171 -1 l 0
+ 87 -1 l 0
+ 87 529 l 0
+EndSplineSet
+EndChar
+
+StartChar: quotesinglbase
+Encoding: 333 8218 261
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 25 44 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: quotedblright
+Encoding: 335 8221 262
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 56 8217 S 1 0 0 1 -120 0 2
+Refer: 56 8217 N 1 0 0 1 120 0 2
+EndChar
+
+StartChar: quotedblbase
+Encoding: 336 8222 263
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 56 8217 S 1 0 0 1 120 -620 2
+Refer: 56 8217 N 1 0 0 1 -120 -620 2
+EndChar
+
+StartChar: quotedblleft
+Encoding: 334 8220 264
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 57 8216 S 1 0 0 1 120 0 2
+Refer: 57 8216 N 1 0 0 1 -120 0 2
+EndChar
+
+StartChar: ellipsis
+Encoding: 337 8230 265
+Width: 600
+Flags: MW
+LayerCount: 2
+Fore
+Refer: 24 46 S 1 0 0 1 200 0 2
+Refer: 24 46 N 1 0 0 1 -200 0 2
+Refer: 24 46 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: uparrow
+Encoding: 338 8593 266
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+78 468 m 1
+ 295 742 l 1
+ 320 742 l 1
+ 521 466 l 1
+ 463 427 l 1
+ 340 593.819 l 1
+ 340 -39 l 1
+ 263 -39 l 1
+ 263 594.4 l 1
+ 128 427 l 1
+ 78 468 l 1
+EndSplineSet
+EndChar
+
+StartChar: downarrow
+Encoding: 339 8595 267
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 266 8593 N -1 0 0 -1 599 703 2
+EndChar
+
+StartChar: visiblespace
+Encoding: 340 9251 268
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+66 81 m 0
+ 120 81 l 0
+ 120 -24 l 0
+ 478 -24 l 0
+ 478 81 l 0
+ 534 81 l 0
+ 534 -76 l 0
+ 66 -76 l 0
+ 66 81 l 0
+EndSplineSet
+EndChar
+
+StartChar: r.serif
+Encoding: 341 -1 269
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+85 529 m 4
+ 244 529 l 4
+ 241 427 l 4
+ 273.808 493.49 340.052 541.496 416.28 541.496 c 4
+ 465.614 541.496 515.474 521.475 553 484 c 4
+ 514 404 l 4
+ 505.563 412.004 501.879 420.625 495.327 429.3 c 4
+ 481.446 447.681 452.813 469.759 411.236 469.759 c 4
+ 371.703 469.759 324.688 449.297 282.848 390.04 c 4
+ 241.434 331.385 241 295.589 241 267 c 4
+ 241 62 l 4
+ 352 62 l 4
+ 352 -1 l 4
+ 83 -1 l 4
+ 83 62 l 4
+ 158 62 l 4
+ 158 462 l 4
+ 85 462 l 4
+ 85 529 l 4
+EndSplineSet
+EndChar
+
+StartChar: hungarumlaut.cap
+Encoding: 343 -1 270
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+486 939 m 0
+ 540 864 l 0
+ 371 747 l 0
+ 334 795 l 0
+ 486 939 l 0
+280 939 m 0
+ 334 864 l 0
+ 165 747 l 0
+ 128 795 l 0
+ 280 939 l 0
+EndSplineSet
+EndChar
+
+StartChar: uni2074
+Encoding: 344 8308 271
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+360 743 m 0
+ 405 743 l 0
+ 405 459 l 0
+ 478 459 l 0
+ 478 404 l 0
+ 405 404 l 0
+ 405 292 l 0
+ 339 292 l 0
+ 339 405 l 0
+ 128 405 l 0
+ 128 446 l 0
+ 360 743 l 0
+340 630 m 0
+ 204 459 l 0
+ 340 459 l 0
+ 340 630 l 0
+EndSplineSet
+EndChar
+
+StartChar: onequarter
+Encoding: 282 188 272
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 274 8260 S 1 0 0 1 0 0 2
+Refer: 271 8308 N 0.8 0 0 0.8 178.6 -314.5 2
+Refer: 149 185 N 0.8 0 0 0.8 -107.4 198.6 2
+EndChar
+
+StartChar: threequarters
+Encoding: 284 190 273
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 274 8260 S 1 0 0 1 6 0 2
+Refer: 204 179 N 0.8 0 0 0.8 -90.9999 201.01 2
+Refer: 271 8308 N 0.8 0 0 0.8 178.6 -314.5 2
+EndChar
+
+StartChar: fraction
+Encoding: 345 8260 274
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+98 -19 m 29
+ 461 770 l 29
+ 516 739 l 29
+ 152 -49 l 29
+ 98 -19 l 29
+EndSplineSet
+EndChar
+
+StartChar: lslash
+Encoding: 327 322 275
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+108 770 m 1
+ 342 770 l 1
+ 342 428.9 l 1
+ 417 455 l 2
+ 429 459 437 464 448 472 c 1
+ 448 387 l 1
+ 342 351.164 l 1
+ 342 67 l 1
+ 498 67 l 1
+ 498 0 l 1
+ 101 0 l 1
+ 101 67 l 1
+ 258 67 l 1
+ 258 322.765 l 1
+ 167 292 l 1
+ 167 368 l 1
+ 258 399.668 l 1
+ 258 703 l 1
+ 108 703 l 1
+ 108 770 l 1
+EndSplineSet
+EndChar
+
+StartChar: Lslash
+Encoding: 286 321 276
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+95 722 m 1
+ 189 722 l 1
+ 189.172 720.866 189.256 719.721 189.256 718.572 c 0
+ 189.256 703.818 179 701.431 179 683 c 2
+ 179 380.515 l 1
+ 371 443 l 2
+ 381.223 446.327 390.329 449.186 401 454 c 1
+ 401 380 l 1
+ 179 308.815 l 1
+ 179 69 l 1
+ 527 69 l 1
+ 527 -1 l 1
+ 95 -1 l 1
+ 95 281.88 l 1
+ 33 262 l 1
+ 33 333 l 1
+ 95 353.178 l 1
+ 95 722 l 1
+EndSplineSet
+EndChar
+
+StartChar: Eng
+Encoding: 346 330 277
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+69 0 m 0
+ 69 722 l 0
+ 154 722 l 0
+ 154 628 l 0
+ 195.063 692.14 265.789 735.013 341.737 735.013 c 0
+ 413.041 735.013 477.286 696.601 508.242 629.025 c 0
+ 529.38 582.882 530 536.67 530 491 c 0
+ 530 491 l 0
+ 530 203 l 0
+ 530 162.878 529.279 123.251 510.426 83.1621 c 0
+ 481.76 22.2073 421.615 -12.2234 354.689 -12.2234 c 0
+ 319.213 -12.2234 284.072 -2.51385 253 16 c 0
+ 294 88 l 0
+ 300.652 84.108 301.561 78.1418 306.406 74.6071 c 0
+ 308.777 72.8775 330.155 60.3705 357.435 60.3705 c 0
+ 390.135 60.3705 419.596 78.287 435.091 111.214 c 0
+ 447.894 138.419 448 169.63 448 197 c 0
+ 448 489 l 0
+ 448 522.737 448.069 561.745 430.159 597.471 c 0
+ 409.568 638.545 370.917 662.054 327.377 662.054 c 0
+ 264.705 662.054 206.267 613.375 180.496 576.603 c 0
+ 158.142 544.705 154 516.425 154 478 c 0
+ 154 0 l 0
+ 69 0 l 0
+EndSplineSet
+EndChar
+
+StartChar: dcroat
+Encoding: 347 273 278
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+280.638 475.041 m 0
+ 219.729 475.041 134.873 433.439 134.873 282.731 c 0
+ 134.873 108.363 223.935 61.8091 283.87 61.8091 c 0
+ 339.081 61.8091 393.871 98.7178 414.26 162.214 c 0
+ 422.843 188.943 425.29 218.613 425.29 258.526 c 0
+ 425.29 317.62 422.953 347.168 416.391 371.787 c 0
+ 395.442 450.383 327.053 475.041 280.638 475.041 c 0
+510.157 630 m 1
+ 511 49 l 2
+ 511.023 32.976 511.825 16.2095 516 0 c 1
+ 433 0 l 1
+ 428.758 12.8474 428 26.4226 428 39 c 2
+ 428 85 l 1
+ 394.754 25.5822 332.198 -11.7426 264.502 -11.7426 c 0
+ 162.172 -11.7426 53.9989 73.6686 53.9989 269.088 c 0
+ 53.9989 471.408 175.85 543.089 276.756 543.089 c 0
+ 349.905 543.089 406.551 506.411 432 452 c 1
+ 432 630 l 1
+ 344 630 l 1
+ 344 692 l 1
+ 432 692 l 1
+ 432 771 l 1
+ 521 771 l 1
+ 521.429 763.115 517.033 757.358 514.644 753.665 c 0
+ 510.515 747.282 509.991 744.04 510 738 c 2
+ 510.067 692 l 1
+ 561 692 l 1
+ 561 630 l 1
+ 510.157 630 l 1
+EndSplineSet
+EndChar
+
+StartChar: Gbreve
+Encoding: 348 286 279
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 241 728 S 1 0 0 1 10 167 2
+Refer: 67 71 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: Idotaccent
+Encoding: 349 304 280
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 222 729 S 1 0 0 1 -20 157 2
+Refer: 4 73 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: cacute
+Encoding: 321 263 281
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 1 99 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: ecaron
+Encoding: 328 283 282
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 143 711 S 1 0 0 1 0 0 2
+Refer: 9 101 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: gbreve
+Encoding: 342 287 283
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 241 728 S 1 0 0 1 10 0 2
+Refer: 13 103 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: racute
+Encoding: 350 341 284
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 16 114 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: zacute
+Encoding: 352 378 285
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 107 180 S 1 0 0 1 0 0 2
+Refer: 69 122 N 1 0 0 1 0 0 2
+EndChar
+
+StartChar: tcaron
+Encoding: 351 357 286
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+Refer: 56 8217 S 0.8 0 0 0.8 276.515 226.393 2
+Refer: 8 116 N 1 0 0 1 -30 0 2
+EndChar
+
+StartChar: bullet
+Encoding: 353 8226 287
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+405.001 343.496 m 0
+ 405.001 290.47 361.103 246.968 306.461 246.968 c 0
+ 251.887 246.968 207.967 290.437 207.967 343.507 c 0
+ 207.967 396.512 251.854 440.001 306.474 440.001 c 0
+ 361.085 440.001 405.001 396.528 405.001 343.496 c 0
+EndSplineSet
+EndChar
+
+StartChar: florin
+Encoding: 354 402 288
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+566 719 m 1
+ 528 642 l 1
+ 524.387 642.014 519.832 644.287 518.495 650.917 c 0
+ 517.585 655.43 518.381 658.903 515.477 665.038 c 0
+ 504.735 687.73 476.304 714.31 438.015 714.31 c 0
+ 408.828 714.31 375.637 697.84 356.674 655.963 c 0
+ 340.302 619.806 338.928 575.492 336 539 c 2
+ 328.378 444 l 1
+ 471 444 l 1
+ 471 378 l 1
+ 323.082 378 l 1
+ 295 28 l 2
+ 290.863 -23.5551 284.654 -73.9088 257.475 -120.242 c 0
+ 224.265 -176.855 172.982 -203.002 125.302 -203.002 c 0
+ 89.2414 -203.002 55.0861 -188.068 31 -162 c 1
+ 78 -88 l 1
+ 84.9954 -91.4507 87.1891 -97.9286 90.1488 -102.751 c 0
+ 96.5551 -113.189 111.389 -124.965 131.92 -124.965 c 0
+ 150.936 -124.965 174.229 -114.524 191.263 -83.2958 c 0
+ 210.753 -47.5643 214.363 -4.0862 217 31 c 2
+ 243.075 378 l 1
+ 103 378 l 1
+ 103 444 l 1
+ 248.035 444 l 1
+ 256 550 l 2
+ 259.285 593.711 263.037 638.828 284.817 682.438 c 0
+ 316.683 746.244 375.812 780 436.757 780 c 0
+ 486.409 780 533.918 757.602 566 719 c 1
+EndSplineSet
+EndChar
+
+StartChar: dagger
+Encoding: 355 8224 289
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+261 756 m 1
+ 339 756 l 1
+ 339 529 l 1
+ 531 529 l 1
+ 531 460 l 1
+ 339 460 l 1
+ 339 -175 l 1
+ 261 -175 l 1
+ 261 460 l 1
+ 67 460 l 1
+ 67 529 l 1
+ 261 529 l 1
+ 261 756 l 1
+EndSplineSet
+EndChar
+
+StartChar: daggerdbl
+Encoding: 356 8225 290
+Width: 600
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+261 756 m 1
+ 339 756 l 1
+ 339 529 l 1
+ 531 529 l 1
+ 531 460 l 1
+ 339 460 l 1
+ 339 140 l 1
+ 531 140 l 1
+ 531 71 l 1
+ 339 71 l 1
+ 339 -175 l 1
+ 261 -175 l 1
+ 261 71 l 1
+ 67 71 l 1
+ 67 140 l 1
+ 261 140 l 1
+ 261 460 l 1
+ 67 460 l 1
+ 67 529 l 1
+ 261 529 l 1
+ 261 756 l 1
+EndSplineSet
+EndChar
+
+StartChar: trademark
+Encoding: 357 8482 291
+Width: 600
+VWidth: 1157
+Flags: HMW
+LayerCount: 2
+Fore
+SplineSet
+286.552 735.33 m 5
+ 286.552 689.01 l 5
+ 182.332 689.01 l 5
+ 182.332 370.56 l 5
+ 130.222 370.56 l 5
+ 130.222 689.01 l 5
+ 30.6338 689.01 l 5
+ 30.6338 735.33 l 5
+ 286.552 735.33 l 5
+360.664 735.33 m 5
+ 444.04 567.42 l 5
+ 466.042 609.108 466.042 609.108 487.465 651.375 c 132
+ 508.888 693.642 508.888 693.642 530.89 735.33 c 5
+ 569.104 735.33 l 5
+ 569.104 370.56 l 5
+ 520.468 370.56 l 5
+ 520.468 619.53 l 5
+ 503.098 588.264 503.098 588.264 485.149 556.419 c 132
+ 467.2 524.574 467.2 524.574 450.988 494.466 c 5
+ 432.46 495.624 l 5
+ 368.77 619.53 l 5
+ 368.77 370.56 l 5
+ 320.134 370.56 l 5
+ 320.134 735.33 l 5
+ 360.664 735.33 l 5
+EndSplineSet
+EndChar
+
+StartChar: zero.noslash
+Encoding: 358 -1 292
+Width: 600
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+517.025 357.799 m 4
+ 517.025 137.688 423.592 -13.0208 297.523 -13.0208 c 4
+ 183.255 -13.0208 82.8194 113.451 82.8194 341.437 c 4
+ 82.8194 574.873 173.246 727.004 299.955 727.004 c 4
+ 420.815 727.004 517.025 585.161 517.025 357.799 c 4
+299.205 656.004 m 4
+ 273.981 656.004 230.75 644.394 201.424 580.18 c 4
+ 177.708 528.251 159.966 454.416 159.966 351.701 c 4
+ 159.966 277.625 175.139 200.382 194.564 153.681 c 4
+ 226.53 76.8272 272.306 60.9815 302.777 60.9815 c 4
+ 329.251 60.9815 369.189 73.0652 399.83 130.196 c 4
+ 432.501 191.111 442.125 283.781 442.125 342.506 c 4
+ 442.125 419.575 425.889 514.517 403.194 568.433 c 4
+ 372.393 641.605 328.293 656.004 299.205 656.004 c 4
+EndSplineSet
+EndChar
+
+StartChar: .notdef
+Encoding: 0 -1 293
+Width: 600
+Flags: HW
+LayerCount: 2
+EndChar
+EndChars
+EndSplineFont
diff --git a/extlib/inconsolata/OFL_1.1.txt b/extlib/inconsolata/OFL_1.1.txt
new file mode 100644
index 00000000..f1a20ac1
--- /dev/null
+++ b/extlib/inconsolata/OFL_1.1.txt
@@ -0,0 +1,97 @@
+Copyright (c) <dates>, <Copyright Holder> (<URL|email>),
+with Reserved Font Name <Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>),
+with Reserved Font Name <additional Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>).
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/extlib/inconsolata/textest.pdf b/extlib/inconsolata/textest.pdf
new file mode 100644
index 00000000..923aa349
--- /dev/null
+++ b/extlib/inconsolata/textest.pdf
Binary files differ
diff --git a/extlib/jquery/MIT.txt b/extlib/jquery/MIT.txt
new file mode 100644
index 00000000..5a2aeb47
--- /dev/null
+++ b/extlib/jquery/MIT.txt
@@ -0,0 +1,20 @@
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/extlib/jquery/jquery.js b/extlib/jquery/jquery.js
new file mode 100644
index 00000000..198b3ff0
--- /dev/null
+++ b/extlib/jquery/jquery.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file
diff --git a/extlib/reset/reset.css b/extlib/reset/reset.css
new file mode 100644
index 00000000..6ce25ce7
--- /dev/null
+++ b/extlib/reset/reset.css
@@ -0,0 +1,49 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
diff --git a/lazyserver.sh b/lazyserver.sh
index 63818a6a..843993e6 100755
--- a/lazyserver.sh
+++ b/lazyserver.sh
@@ -16,13 +16,17 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# This runs Mediagoblin using Paste with Celery set to always eager mode.
+#
+
if [ "$1" = "-h" ]
then
echo "$0 [-h] [-c paste.ini] [ARGS_to_paster ...]"
echo ""
echo " For example:"
echo " $0 -c fcgi.ini port_number=23371"
- echo " or: $0 --server-name=fcgi"
+ echo " or: $0 --server-name=fcgi --log-file=paste.log"
echo ""
echo " The configfile defaults to paste_local.ini,"
echo " if that is readable, otherwise paste.ini."
diff --git a/mediagoblin.ini b/mediagoblin.ini
index c22d12d7..dbde6e51 100644
--- a/mediagoblin.ini
+++ b/mediagoblin.ini
@@ -1,3 +1,6 @@
+# If you want to make changes to this file, first copy it to
+# mediagoblin_local.ini, then make the changes there.
+
[mediagoblin]
direct_remote_path = /mgoblin_static/
email_sender_address = "notice@mediagoblin.example.org"
@@ -8,6 +11,9 @@ email_debug_mode = true
# Set to false to disable registrations
allow_registration = true
+## Uncomment this to turn on video or enable other media types
+# media_types = mediagoblin.media_types.image, mediagoblin.media_types.video
+
## Uncomment this to put some user-overriding templates here
#local_templates = %(here)s/user_dev/templates/
diff --git a/mediagoblin/_version.py b/mediagoblin/_version.py
index df212faf..5e69f21a 100644
--- a/mediagoblin/_version.py
+++ b/mediagoblin/_version.py
@@ -14,4 +14,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-__version__ = "0.0.5"
+# valid version formats:
+# * x.y - final release
+# * x.ya1 - alpha 1
+# * x.yb1 - beta 1
+# * x.yrc1 - release candidate 1
+# * x.y.dev - dev
+
+# see http://www.python.org/dev/peps/pep-0386/
+
+__version__ = "0.3.0.dev"
diff --git a/mediagoblin/app.py b/mediagoblin/app.py
index d39469c3..96b2c8ab 100644
--- a/mediagoblin/app.py
+++ b/mediagoblin/app.py
@@ -20,7 +20,7 @@ import urllib
import routes
from webob import Request, exc
-from mediagoblin import routing, middleware
+from mediagoblin import routing, meddleware
from mediagoblin.tools import common, translate, template
from mediagoblin.tools.response import render_404
from mediagoblin.tools import request as mg_request
@@ -63,7 +63,7 @@ class MediaGoblinApp(object):
# Get the template environment
self.template_loader = get_jinja_loader(
- app_config.get('user_template_path'))
+ app_config.get('local_templates'))
# Set up storage systems
self.public_store, self.queue_store = setup_storage()
@@ -94,26 +94,19 @@ class MediaGoblinApp(object):
# object.
#######################################################
- setup_globals(app = self)
+ setup_globals(app=self)
# Workbench *currently* only used by celery, so this only
# matters in always eager mode :)
setup_workbench()
- # instantiate application middleware
- self.middleware = [common.import_component(m)(self)
- for m in middleware.ENABLED_MIDDLEWARE]
-
+ # instantiate application meddleware
+ self.meddleware = [common.import_component(m)(self)
+ for m in meddleware.ENABLED_MEDDLEWARE]
def __call__(self, environ, start_response):
request = Request(environ)
- # pass the request through our middleware classes
- for m in self.middleware:
- response = m.process_request(request)
- if response is not None:
- return response(environ, start_response)
-
## Routing / controller loading stuff
path_info = request.path_info
route_match = self.routing.match(path_info)
@@ -129,6 +122,11 @@ class MediaGoblinApp(object):
# The other option would be:
# request.full_path = environ["SCRIPT_URL"]
+ # Fix up environ for urlgen
+ # See bug: https://bitbucket.org/bbangert/routes/issue/55/cache_hostinfo-breaks-on-https-off
+ if environ.get('HTTPS', '').lower() == 'off':
+ environ.pop('HTTPS')
+
## Attach utilities to the request object
request.matchdict = route_match
request.urlgen = routes.URLGenerator(self.routing, environ)
@@ -165,13 +163,20 @@ class MediaGoblinApp(object):
return render_404(request)(environ, start_response)
controller = common.import_component(route_match['controller'])
+
+ # pass the request through our meddleware classes
+ for m in self.meddleware:
+ response = m.process_request(request, controller)
+ if response is not None:
+ return response(environ, start_response)
+
request.start_response = start_response
# get the response from the controller
response = controller(request)
- # pass the response through the middleware
- for m in self.middleware[::-1]:
+ # pass the response through the meddleware
+ for m in self.meddleware[::-1]:
m.process_response(request, response)
return response(environ, start_response)
diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py
index a932ad26..5a707c7b 100644
--- a/mediagoblin/auth/forms.py
+++ b/mediagoblin/auth/forms.py
@@ -29,15 +29,7 @@ class RegistrationForm(wtforms.Form):
password = wtforms.PasswordField(
_('Password'),
[wtforms.validators.Required(),
- wtforms.validators.Length(min=6, max=30),
- wtforms.validators.EqualTo(
- 'confirm_password',
- _('Passwords must match.'))])
- confirm_password = wtforms.PasswordField(
- _('Confirm password'),
- [wtforms.validators.Required()],
- description=_(
- u"Type it again here to make sure there are no spelling mistakes."))
+ wtforms.validators.Length(min=6, max=30)])
email = wtforms.TextField(
_('Email address'),
[wtforms.validators.Required(),
@@ -59,9 +51,10 @@ class ForgotPassForm(wtforms.Form):
'Username or email',
[wtforms.validators.Required()])
- def validate_username(form,field):
- if not (re.match(r'^\w+$',field.data) or
- re.match(r'^.+@[^.].*\.[a-z]{2,10}$',field.data, re.IGNORECASE)):
+ def validate_username(form, field):
+ if not (re.match(r'^\w+$', field.data) or
+ re.match(r'^.+@[^.].*\.[a-z]{2,10}$', field.data,
+ re.IGNORECASE)):
raise wtforms.ValidationError(u'Incorrect input')
@@ -69,17 +62,10 @@ class ChangePassForm(wtforms.Form):
password = wtforms.PasswordField(
'Password',
[wtforms.validators.Required(),
- wtforms.validators.Length(min=6, max=30),
- wtforms.validators.EqualTo(
- 'confirm_password',
- 'Passwords must match.')])
- confirm_password = wtforms.PasswordField(
- 'Confirm password',
- [wtforms.validators.Required()])
+ wtforms.validators.Length(min=6, max=30)])
userid = wtforms.HiddenField(
'',
[wtforms.validators.Required()])
token = wtforms.HiddenField(
'',
[wtforms.validators.Required()])
-
diff --git a/mediagoblin/auth/lib.py b/mediagoblin/auth/lib.py
index 4c57ef88..c0af3b5b 100644
--- a/mediagoblin/auth/lib.py
+++ b/mediagoblin/auth/lib.py
@@ -94,6 +94,7 @@ EMAIL_VERIFICATION_TEMPLATE = (
u"http://{host}{uri}?"
u"userid={userid}&token={verification_key}")
+
def send_verification_email(user, request):
"""
Send the verification email to users to activate their accounts.
@@ -104,17 +105,17 @@ def send_verification_email(user, request):
"""
rendered_email = render_template(
request, 'mediagoblin/auth/verification_email.txt',
- {'username': user['username'],
+ {'username': user.username,
'verification_url': EMAIL_VERIFICATION_TEMPLATE.format(
host=request.host,
uri=request.urlgen('mediagoblin.auth.verify_email'),
- userid=unicode(user['_id']),
- verification_key=user['verification_key'])})
+ userid=unicode(user._id),
+ verification_key=user.verification_key)})
# TODO: There is no error handling in place
send_email(
mg_globals.app_config['email_sender_address'],
- [user['email']],
+ [user.email],
# TODO
# Due to the distributed nature of GNU MediaGoblin, we should
# find a way to send some additional information about the
@@ -128,6 +129,7 @@ EMAIL_FP_VERIFICATION_TEMPLATE = (
u"http://{host}{uri}?"
u"userid={userid}&token={fp_verification_key}")
+
def send_fp_verification_email(user, request):
"""
Send the verification email to users to change their password.
@@ -138,17 +140,16 @@ def send_fp_verification_email(user, request):
"""
rendered_email = render_template(
request, 'mediagoblin/auth/fp_verification_email.txt',
- {'username': user['username'],
+ {'username': user.username,
'verification_url': EMAIL_FP_VERIFICATION_TEMPLATE.format(
host=request.host,
uri=request.urlgen('mediagoblin.auth.verify_forgot_password'),
- userid=unicode(user['_id']),
- fp_verification_key=user['fp_verification_key'])})
+ userid=unicode(user._id),
+ fp_verification_key=user.fp_verification_key)})
# TODO: There is no error handling in place
send_email(
mg_globals.app_config['email_sender_address'],
- [user['email']],
+ [user.email],
'GNU MediaGoblin - Change forgotten password!',
rendered_email)
-
diff --git a/mediagoblin/auth/routing.py b/mediagoblin/auth/routing.py
index 912d89fa..ea9388c5 100644
--- a/mediagoblin/auth/routing.py
+++ b/mediagoblin/auth/routing.py
@@ -33,13 +33,6 @@ auth_routes = [
controller='mediagoblin.views:simple_template_render'),
Route('mediagoblin.auth.forgot_password', '/forgot_password/',
controller='mediagoblin.auth.views:forgot_password'),
- Route('mediagoblin.auth.verify_forgot_password', '/forgot_password/verify/',
- controller='mediagoblin.auth.views:verify_forgot_password'),
- Route('mediagoblin.auth.fp_changed_success',
- '/forgot_password/changed_success/',
- template='mediagoblin/auth/fp_changed_success.html',
- controller='mediagoblin.views:simple_template_render'),
- Route('mediagoblin.auth.fp_email_sent',
- '/forgot_password/email_sent/',
- template='mediagoblin/auth/fp_email_sent.html',
- controller='mediagoblin.views:simple_template_render')]
+ Route('mediagoblin.auth.verify_forgot_password',
+ '/forgot_password/verify/',
+ controller='mediagoblin.auth.views:verify_forgot_password')]
diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py
index 2a670679..c04a49a7 100644
--- a/mediagoblin/auth/views.py
+++ b/mediagoblin/auth/views.py
@@ -74,20 +74,21 @@ def register(request):
extra_validation_passes = False
if users_with_email:
register_form.email.errors.append(
- _(u'Sorry, that email address has already been taken.'))
+ _(u'Sorry, a user with that email address already exists.'))
extra_validation_passes = False
if extra_validation_passes:
# Create the user
user = request.db.User()
- user['username'] = username
- user['email'] = email
- user['pw_hash'] = auth_lib.bcrypt_gen_password_hash(
+ user.username = username
+ user.email = email
+ user.pw_hash = auth_lib.bcrypt_gen_password_hash(
request.POST['password'])
+ user.verification_key = unicode(uuid.uuid4())
user.save(validate=True)
# log the user in
- request.session['user_id'] = unicode(user['_id'])
+ request.session['user_id'] = unicode(user._id)
request.session.save()
# send verification email
@@ -98,7 +99,7 @@ def register(request):
# message waiting for them to verify their email
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=user['username'])
+ user=user.username)
return render_to_response(
request,
@@ -122,7 +123,7 @@ def login(request):
if user and user.check_login(request.POST['password']):
# set up login in session
- request.session['user_id'] = unicode(user['_id'])
+ request.session['user_id'] = unicode(user._id)
request.session.save()
if request.POST.get('next'):
@@ -160,16 +161,16 @@ def verify_email(request):
you are lucky :)
"""
# If we don't have userid and token parameters, we can't do anything; 404
- if not request.GET.has_key('userid') or not request.GET.has_key('token'):
+ if not 'userid' in request.GET or not 'token' in request.GET:
return render_404(request)
user = request.db.User.find_one(
{'_id': ObjectId(unicode(request.GET['userid']))})
- if user and user['verification_key'] == unicode(request.GET['token']):
- user[u'status'] = u'active'
- user[u'email_verified'] = True
- user[u'verification_key'] = None
+ if user and user.verification_key == unicode(request.GET['token']):
+ user.status = u'active'
+ user.email_verified = True
+ user.verification_key = None
user.save()
@@ -186,7 +187,7 @@ def verify_email(request):
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=user['username'])
+ user=user.username)
def resend_activation(request):
@@ -195,9 +196,26 @@ def resend_activation(request):
Resend the activation email.
"""
- request.user[u'verification_key'] = unicode(uuid.uuid4())
- request.user.save()
+ if request.user is None:
+ messages.add_message(
+ request,
+ messages.ERROR,
+ _('You must be logged in so we know who to send the email to!'))
+
+ return redirect(request, 'mediagoblin.auth.login')
+
+ if request.user.email_verified:
+ messages.add_message(
+ request,
+ messages.ERROR,
+ _("You've already verified your email address!"))
+
+ return redirect(request, "mediagoblin.user_pages.user_home", user=request.user['username'])
+
+ request.user.verification_key = unicode(uuid.uuid4())
+ request.user.save()
+
email_debug_message(request)
send_verification_email(request.user, request)
@@ -207,23 +225,19 @@ def resend_activation(request):
_('Resent your verification email.'))
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=request.user['username'])
+ user=request.user.username)
def forgot_password(request):
"""
Forgot password view
- Sends an email whit an url to renew forgoten password
+ Sends an email with an url to renew forgotten password
"""
fp_form = auth_forms.ForgotPassForm(request.POST)
if request.method == 'POST' and fp_form.validate():
- # Here, so it doesn't depend on the actual mail being sent
- # and thus doesn't reveal, wether mail was sent.
- email_debug_message(request)
-
# '$or' not available till mongodb 1.5.3
user = request.db.User.find_one(
{'username': request.POST['username']})
@@ -232,13 +246,21 @@ def forgot_password(request):
{'email': request.POST['username']})
if user:
- if user['email_verified'] and user['status'] == 'active':
- user[u'fp_verification_key'] = unicode(uuid.uuid4())
- user[u'fp_token_expire'] = datetime.datetime.now() + \
+ if user.email_verified and user.status == 'active':
+ user.fp_verification_key = unicode(uuid.uuid4())
+ user.fp_token_expire = datetime.datetime.now() + \
datetime.timedelta(days=10)
user.save()
send_fp_verification_email(user, request)
+
+ messages.add_message(
+ request,
+ messages.INFO,
+ _("An email has been sent with instructions on how to "
+ "change your password."))
+ email_debug_message(request)
+
else:
# special case... we can't send the email because the
# username is inactive / hasn't verified their email
@@ -251,11 +273,14 @@ def forgot_password(request):
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=user['username'])
-
-
- # do not reveal whether or not there is a matching user, just move along
- return redirect(request, 'mediagoblin.auth.fp_email_sent')
+ user=user.username)
+ return redirect(request, 'mediagoblin.auth.login')
+ else:
+ messages.add_message(
+ request,
+ messages.WARNING,
+ _("Couldn't find someone with that username or email."))
+ return redirect(request, 'mediagoblin.auth.forgot_password')
return render_to_response(
request,
@@ -285,21 +310,25 @@ def verify_forgot_password(request):
return render_404(request)
# check if we have a real user and correct token
- if ((user and user['fp_verification_key'] and
- user['fp_verification_key'] == unicode(formdata_token) and
- datetime.datetime.now() < user['fp_token_expire']
- and user['email_verified'] and user['status'] == 'active')):
+ if ((user and user.fp_verification_key and
+ user.fp_verification_key == unicode(formdata_token) and
+ datetime.datetime.now() < user.fp_token_expire
+ and user.email_verified and user.status == 'active')):
cp_form = auth_forms.ChangePassForm(formdata_vars)
if request.method == 'POST' and cp_form.validate():
- user[u'pw_hash'] = auth_lib.bcrypt_gen_password_hash(
+ user.pw_hash = auth_lib.bcrypt_gen_password_hash(
request.POST['password'])
- user[u'fp_verification_key'] = None
- user[u'fp_token_expire'] = None
+ user.fp_verification_key = None
+ user.fp_token_expire = None
user.save()
- return redirect(request, 'mediagoblin.auth.fp_changed_success')
+ messages.add_message(
+ request,
+ messages.INFO,
+ _("You can now log in using your new password."))
+ return redirect(request, 'mediagoblin.auth.login')
else:
return render_to_response(
request,
@@ -328,6 +357,6 @@ def _process_for_token(request):
formdata = {
'vars': formdata_vars,
'has_userid_and_token':
- formdata_vars.has_key('userid') and formdata_vars.has_key('token')}
+ 'userid' in formdata_vars and 'token' in formdata_vars}
return formdata
diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini
index 900957ce..eb22bc1b 100644
--- a/mediagoblin/config_spec.ini
+++ b/mediagoblin/config_spec.ini
@@ -1,14 +1,18 @@
[mediagoblin]
+# HTML title of the pages
+html_title = string(default="GNU MediaGoblin")
+
+# Enabled media types
+media_types = string_list(default=list("mediagoblin.media_types.image"))
+
# database stuff
db_host = string()
db_name = string(default="mediagoblin")
db_port = integer()
-
# Where temporary files used in processing and etc are kept
workbench_path = string(default="%(here)s/user_dev/media/workbench")
-
# Where mediagoblin-builtin static assets are kept
direct_remote_path = string(default="/mgoblin_static/")
@@ -24,9 +28,11 @@ email_smtp_pass = string(default=None)
allow_registration = boolean(default=True)
# tag parsing
-tags_delimiter = string(default=",")
tags_max_length = integer(default=50)
+# Whether comments are ascending or descending
+comments_ascending = boolean(default=True)
+
# By default not set, but you might want something like:
# "%(here)s/user_dev/templates/"
local_templates = string()
@@ -44,6 +50,7 @@ allow_attachments = boolean(default=False)
# Cookie stuff
csrf_cookie_name = string(default='mediagoblin_csrftoken')
+
[storage:publicstore]
storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage")
base_dir = string(default="%(here)s/user_dev/media/public")
@@ -54,6 +61,11 @@ storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage
base_dir = string(default="%(here)s/user_dev/media/queue")
+# Should we keep the original file?
+[media_type:mediagoblin.media_types.video]
+keep_original = boolean(default=False)
+
+
[beaker.cache]
type = string(default="file")
data_dir = string(default="%(here)s/user_dev/beaker/cache/data")
diff --git a/mediagoblin/db/__init__.py b/mediagoblin/db/__init__.py
index c5124b1a..27e8a90f 100644
--- a/mediagoblin/db/__init__.py
+++ b/mediagoblin/db/__init__.py
@@ -23,7 +23,7 @@ Database Abstraction/Wrapper Layer
pymongo. Read beow for why, but note that nobody is actually doing
this and there's no proof that we'll ever support more than
MongoDB... it would be a huge amount of work to do so.
-
+
If you really want to prove that possible, jump on IRC and talk to
us about making such a branch. In the meanwhile, it doesn't hurt to
have things as they are... if it ever makes it hard for us to
diff --git a/mediagoblin/db/mixin.py b/mediagoblin/db/mixin.py
new file mode 100644
index 00000000..5145289e
--- /dev/null
+++ b/mediagoblin/db/mixin.py
@@ -0,0 +1,92 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011,2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+This module contains some Mixin classes for the db objects.
+
+A bunch of functions on the db objects are really more like
+"utility functions": They could live outside the classes
+and be called "by hand" passing the appropiate reference.
+They usually only use the public API of the object and
+rarely use database related stuff.
+
+These functions now live here and get "mixed in" into the
+real objects.
+"""
+
+from mediagoblin.auth import lib as auth_lib
+from mediagoblin.tools import common
+
+
+class UserMixin(object):
+ def check_login(self, password):
+ """
+ See if a user can login with this password
+ """
+ return auth_lib.bcrypt_check_password(
+ password, self.pw_hash)
+
+
+class MediaEntryMixin(object):
+ def get_display_media(self, media_map,
+ fetch_order=common.DISPLAY_IMAGE_FETCHING_ORDER):
+ """
+ Find the best media for display.
+
+ Args:
+ - media_map: a dict like
+ {u'image_size': [u'dir1', u'dir2', u'image.jpg']}
+ - fetch_order: the order we should try fetching images in
+
+ Returns:
+ (media_size, media_path)
+ """
+ media_sizes = media_map.keys()
+
+ for media_size in common.DISPLAY_IMAGE_FETCHING_ORDER:
+ if media_size in media_sizes:
+ return media_map[media_size]
+
+ def main_mediafile(self):
+ pass
+
+ def url_for_self(self, urlgen, **extra_args):
+ """
+ Generate an appropriate url for ourselves
+
+ Use a slug if we have one, else use our '_id'.
+ """
+ uploader = self.get_uploader
+
+ if self.get('slug'):
+ return urlgen(
+ 'mediagoblin.user_pages.media_home',
+ user=uploader.username,
+ media=self.slug,
+ **extra_args)
+ else:
+ return urlgen(
+ 'mediagoblin.user_pages.media_home',
+ user=uploader.username,
+ media=unicode(self._id),
+ **extra_args)
+
+ def get_fail_exception(self):
+ """
+ Get the exception that's appropriate for this error
+ """
+ if self['fail_error']:
+ return common.import_component(self['fail_error'])
diff --git a/mediagoblin/templates/mediagoblin/auth/fp_changed_success.html b/mediagoblin/db/mongo/__init__.py
index 7cea312d..ba347c69 100644
--- a/mediagoblin/templates/mediagoblin/auth/fp_changed_success.html
+++ b/mediagoblin/db/mongo/__init__.py
@@ -1,6 +1,5 @@
-{#
# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 Free Software Foundation, Inc
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -14,14 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#}
-{% extends "mediagoblin/base.html" %}
-
-{% block mediagoblin_content %}
- <p>
- {% trans -%}
- Your password has been changed. Try to log in now.
- {%- endtrans %}
- </p>
-{% endblock %}
-
diff --git a/mediagoblin/db/indexes.py b/mediagoblin/db/mongo/indexes.py
index 75394a31..1dd73f2b 100644
--- a/mediagoblin/db/indexes.py
+++ b/mediagoblin/db/mongo/indexes.py
@@ -93,8 +93,9 @@ MEDIAENTRY_INDEXES = {
('created', DESCENDING)]},
'state_uploader_tags_created': {
- # Indexing on processed?, media uploader, associated tags, and timestamp
- # Used for showing media items matching a tag search, most recent first.
+ # Indexing on processed?, media uploader, associated tags, and
+ # timestamp Used for showing media items matching a tag
+ # search, most recent first.
'index': [('state', ASCENDING),
('uploader', ASCENDING),
('tags.slug', DESCENDING),
diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/mongo/migrations.py
index edaf5630..cf4e94ae 100644
--- a/mediagoblin/db/migrations.py
+++ b/mediagoblin/db/mongo/migrations.py
@@ -14,7 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from mediagoblin.db.util import RegisterMigration
+from mediagoblin.db.mongo.util import RegisterMigration
from mediagoblin.tools.text import cleaned_markdown_conversion
@@ -100,3 +100,11 @@ def user_add_forgot_password_token_and_expires(database):
"""
add_table_field(database, 'users', 'fp_verification_key', None)
add_table_field(database, 'users', 'fp_token_expire', None)
+
+
+@RegisterMigration(7)
+def media_type_image_to_multimedia_type_image(database):
+ database['media_entries'].update(
+ {'media_type': 'image'},
+ {'$set': {'media_type': 'mediagoblin.media_types.image'}},
+ multi=True)
diff --git a/mediagoblin/db/models.py b/mediagoblin/db/mongo/models.py
index e085840e..e085840e 100644
--- a/mediagoblin/db/models.py
+++ b/mediagoblin/db/mongo/models.py
diff --git a/mediagoblin/db/mongo/open.py b/mediagoblin/db/mongo/open.py
new file mode 100644
index 00000000..48c909d9
--- /dev/null
+++ b/mediagoblin/db/mongo/open.py
@@ -0,0 +1,78 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import pymongo
+import mongokit
+from paste.deploy.converters import asint
+from mediagoblin.db.mongo import models
+from mediagoblin.db.mongo.util import MigrationManager
+
+
+def connect_database_from_config(app_config, use_pymongo=False):
+ """
+ Connect to the main database, take config from app_config
+
+ Optionally use pymongo instead of mongokit for the connection.
+ """
+ port = app_config.get('db_port')
+ if port:
+ port = asint(port)
+
+ if use_pymongo:
+ connection = pymongo.Connection(
+ app_config.get('db_host'), port)
+ else:
+ connection = mongokit.Connection(
+ app_config.get('db_host'), port)
+ return connection
+
+
+def setup_connection_and_db_from_config(app_config, use_pymongo=False):
+ """
+ Setup connection and database from config.
+
+ Optionally use pymongo instead of mongokit.
+ """
+ connection = connect_database_from_config(app_config, use_pymongo)
+ database_path = app_config['db_name']
+ db = connection[database_path]
+
+ if not use_pymongo:
+ models.register_models(connection)
+
+ return (connection, db)
+
+
+def check_db_migrations_current(db):
+ # This MUST be imported so as to set up the appropriate migrations!
+ from mediagoblin.db.mongo import migrations
+
+ # Init the migration number if necessary
+ migration_manager = MigrationManager(db)
+ migration_manager.install_migration_version_if_missing()
+
+ # Tiny hack to warn user if our migration is out of date
+ if not migration_manager.database_at_latest_migration():
+ db_migration_num = migration_manager.database_current_migration()
+ latest_migration_num = migration_manager.latest_migration()
+ if db_migration_num < latest_migration_num:
+ print (
+ "*WARNING:* Your migrations are out of date, "
+ "maybe run ./bin/gmg migrate?")
+ elif db_migration_num > latest_migration_num:
+ print (
+ "*WARNING:* Your migrations are out of date... "
+ "in fact they appear to be from the future?!")
diff --git a/mediagoblin/db/mongo/util.py b/mediagoblin/db/mongo/util.py
new file mode 100644
index 00000000..e2065693
--- /dev/null
+++ b/mediagoblin/db/mongo/util.py
@@ -0,0 +1,292 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Utilities for database operations.
+
+Some note on migration and indexing tools:
+
+We store information about what the state of the database is in the
+'mediagoblin' document of the 'app_metadata' collection. Keys in that
+document relevant to here:
+
+ - 'migration_number': The integer representing the current state of
+ the migrations
+"""
+
+import copy
+
+# Imports that other modules might use
+from pymongo import ASCENDING, DESCENDING
+from pymongo.errors import InvalidId
+from mongokit import ObjectId
+
+from mediagoblin.db.mongo.indexes import ACTIVE_INDEXES, DEPRECATED_INDEXES
+
+
+################
+# Indexing tools
+################
+
+
+def add_new_indexes(database, active_indexes=ACTIVE_INDEXES):
+ """
+ Add any new indexes to the database.
+
+ Args:
+ - database: pymongo or mongokit database instance.
+ - active_indexes: indexes to possibly add in the pattern of:
+ {'collection_name': {
+ 'identifier': {
+ 'index': [index_foo_goes_here],
+ 'unique': True}}
+ where 'index' is the index to add and all other options are
+ arguments for collection.create_index.
+
+ Returns:
+ A list of indexes added in form ('collection', 'index_name')
+ """
+ indexes_added = []
+
+ for collection_name, indexes in active_indexes.iteritems():
+ collection = database[collection_name]
+ collection_indexes = collection.index_information().keys()
+
+ for index_name, index_data in indexes.iteritems():
+ if not index_name in collection_indexes:
+ # Get a copy actually so we don't modify the actual
+ # structure
+ index_data = copy.copy(index_data)
+ index = index_data.pop('index')
+ collection.create_index(
+ index, name=index_name, **index_data)
+
+ indexes_added.append((collection_name, index_name))
+
+ return indexes_added
+
+
+def remove_deprecated_indexes(database, deprecated_indexes=DEPRECATED_INDEXES):
+ """
+ Remove any deprecated indexes from the database.
+
+ Args:
+ - database: pymongo or mongokit database instance.
+ - deprecated_indexes: the indexes to deprecate in the pattern of:
+ {'collection_name': {
+ 'identifier': {
+ 'index': [index_foo_goes_here],
+ 'unique': True}}
+
+ (... although we really only need the 'identifier' here, as the
+ rest of the information isn't used in this case. But it's kept
+ around so we can remember what it was)
+
+ Returns:
+ A list of indexes removed in form ('collection', 'index_name')
+ """
+ indexes_removed = []
+
+ for collection_name, indexes in deprecated_indexes.iteritems():
+ collection = database[collection_name]
+ collection_indexes = collection.index_information().keys()
+
+ for index_name, index_data in indexes.iteritems():
+ if index_name in collection_indexes:
+ collection.drop_index(index_name)
+
+ indexes_removed.append((collection_name, index_name))
+
+ return indexes_removed
+
+
+#################
+# Migration tools
+#################
+
+# The default migration registry...
+#
+# Don't set this yourself! RegisterMigration will automatically fill
+# this with stuff via decorating methods in migrations.py
+
+class MissingCurrentMigration(Exception):
+ pass
+
+
+MIGRATIONS = {}
+
+
+class RegisterMigration(object):
+ """
+ Tool for registering migrations
+
+ Call like:
+
+ @RegisterMigration(33)
+ def update_dwarves(database):
+ [...]
+
+ This will register your migration with the default migration
+ registry. Alternately, to specify a very specific
+ migration_registry, you can pass in that as the second argument.
+
+ Note, the number of your migration should NEVER be 0 or less than
+ 0. 0 is the default "no migrations" state!
+ """
+ def __init__(self, migration_number, migration_registry=MIGRATIONS):
+ assert migration_number > 0, "Migration number must be > 0!"
+ assert migration_number not in migration_registry, \
+ "Duplicate migration numbers detected! That's not allowed!"
+
+ self.migration_number = migration_number
+ self.migration_registry = migration_registry
+
+ def __call__(self, migration):
+ self.migration_registry[self.migration_number] = migration
+ return migration
+
+
+class MigrationManager(object):
+ """
+ Migration handling tool.
+
+ Takes information about a database, lets you update the database
+ to the latest migrations, etc.
+ """
+ def __init__(self, database, migration_registry=MIGRATIONS):
+ """
+ Args:
+ - database: database we're going to migrate
+ - migration_registry: where we should find all migrations to
+ run
+ """
+ self.database = database
+ self.migration_registry = migration_registry
+ self._sorted_migrations = None
+
+ def _ensure_current_migration_record(self):
+ """
+ If there isn't a database[u'app_metadata'] mediagoblin entry
+ with the 'current_migration', throw an error.
+ """
+ if self.database_current_migration() is None:
+ raise MissingCurrentMigration(
+ "Tried to call function which requires "
+ "'current_migration' set in database")
+
+ @property
+ def sorted_migrations(self):
+ """
+ Sort migrations if necessary and store in self._sorted_migrations
+ """
+ if not self._sorted_migrations:
+ self._sorted_migrations = sorted(
+ self.migration_registry.items(),
+ # sort on the key... the migration number
+ key=lambda migration_tuple: migration_tuple[0])
+
+ return self._sorted_migrations
+
+ def latest_migration(self):
+ """
+ Return a migration number for the latest migration, or 0 if
+ there are no migrations.
+ """
+ if self.sorted_migrations:
+ return self.sorted_migrations[-1][0]
+ else:
+ # If no migrations have been set, we start at 0.
+ return 0
+
+ def set_current_migration(self, migration_number):
+ """
+ Set the migration in the database to migration_number
+ """
+ # Add the mediagoblin migration if necessary
+ self.database[u'app_metadata'].update(
+ {u'_id': u'mediagoblin'},
+ {u'$set': {u'current_migration': migration_number}},
+ upsert=True)
+
+ def install_migration_version_if_missing(self):
+ """
+ Sets the migration to the latest version if no migration
+ version at all is set.
+ """
+ mgoblin_metadata = self.database[u'app_metadata'].find_one(
+ {u'_id': u'mediagoblin'})
+ if not mgoblin_metadata:
+ latest_migration = self.latest_migration()
+ self.set_current_migration(latest_migration)
+
+ def database_current_migration(self):
+ """
+ Return the current migration in the database.
+ """
+ mgoblin_metadata = self.database[u'app_metadata'].find_one(
+ {u'_id': u'mediagoblin'})
+ if not mgoblin_metadata:
+ return None
+ else:
+ return mgoblin_metadata[u'current_migration']
+
+ def database_at_latest_migration(self):
+ """
+ See if the database is at the latest migration.
+ Returns a boolean.
+ """
+ current_migration = self.database_current_migration()
+ return current_migration == self.latest_migration()
+
+ def migrations_to_run(self):
+ """
+ Get a list of migrations to run still, if any.
+
+ Note that calling this will set your migration version to the
+ latest version if it isn't installed to anything yet!
+ """
+ self._ensure_current_migration_record()
+
+ db_current_migration = self.database_current_migration()
+
+ return [
+ (migration_number, migration_func)
+ for migration_number, migration_func in self.sorted_migrations
+ if migration_number > db_current_migration]
+
+ def migrate_new(self, pre_callback=None, post_callback=None):
+ """
+ Run all migrations.
+
+ Includes two optional args:
+ - pre_callback: if called, this is a callback on something to
+ run pre-migration. Takes (migration_number, migration_func)
+ as arguments
+ - pre_callback: if called, this is a callback on something to
+ run post-migration. Takes (migration_number, migration_func)
+ as arguments
+ """
+ # If we aren't set to any version number, presume we're at the
+ # latest (which means we'll do nothing here...)
+ self.install_migration_version_if_missing()
+
+ for migration_number, migration_func in self.migrations_to_run():
+ if pre_callback:
+ pre_callback(migration_number, migration_func)
+ migration_func(self.database)
+ self.set_current_migration(migration_number)
+ if post_callback:
+ post_callback(migration_number, migration_func)
diff --git a/mediagoblin/db/open.py b/mediagoblin/db/open.py
index e73b6258..32827fcb 100644
--- a/mediagoblin/db/open.py
+++ b/mediagoblin/db/open.py
@@ -14,42 +14,5 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import pymongo
-import mongokit
-from paste.deploy.converters import asint
-from mediagoblin.db import models
-
-
-def connect_database_from_config(app_config, use_pymongo=False):
- """
- Connect to the main database, take config from app_config
-
- Optionally use pymongo instead of mongokit for the connection.
- """
- port = app_config.get('db_port')
- if port:
- port = asint(port)
-
- if use_pymongo:
- connection = pymongo.Connection(
- app_config.get('db_host'), port)
- else:
- connection = mongokit.Connection(
- app_config.get('db_host'), port)
- return connection
-
-
-def setup_connection_and_db_from_config(app_config, use_pymongo=False):
- """
- Setup connection and database from config.
-
- Optionally use pymongo instead of mongokit.
- """
- connection = connect_database_from_config(app_config, use_pymongo)
- database_path = app_config['db_name']
- db = connection[database_path]
-
- if not use_pymongo:
- models.register_models(connection)
-
- return (connection, db)
+from mediagoblin.db.mongo.open import \
+ setup_connection_and_db_from_config, check_db_migrations_current
diff --git a/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html b/mediagoblin/db/sql/__init__.py
index 69aac6b3..ba347c69 100644
--- a/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html
+++ b/mediagoblin/db/sql/__init__.py
@@ -1,6 +1,5 @@
-{#
# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 Free Software Foundation, Inc
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -14,15 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#}
-{% extends "mediagoblin/base.html" %}
-
-{% block mediagoblin_content %}
- <p>
- {% trans -%}
- Check your inbox. We sent an email with a URL for changing your password.
- {%- endtrans %}
- </p>
-
-{% endblock %}
-
diff --git a/mediagoblin/db/sql/base.py b/mediagoblin/db/sql/base.py
new file mode 100644
index 00000000..40140327
--- /dev/null
+++ b/mediagoblin/db/sql/base.py
@@ -0,0 +1,38 @@
+from sqlalchemy.orm import scoped_session, sessionmaker, object_session
+
+
+Session = scoped_session(sessionmaker())
+
+
+def _fix_query_dict(query_dict):
+ if '_id' in query_dict:
+ query_dict['id'] = query_dict.pop('_id')
+
+
+class GMGTableBase(object):
+ query = Session.query_property()
+
+ @classmethod
+ def find(cls, query_dict={}):
+ _fix_query_dict(query_dict)
+ return cls.query.filter_by(**query_dict)
+
+ @classmethod
+ def find_one(cls, query_dict={}):
+ _fix_query_dict(query_dict)
+ return cls.query.filter_by(**query_dict).first()
+
+ @classmethod
+ def one(cls, query_dict):
+ return cls.find(query_dict).one()
+
+ def get(self, key):
+ return getattr(self, key)
+
+ def save(self, validate = True):
+ assert validate
+ sess = object_session(self)
+ if sess is None:
+ sess = Session()
+ sess.add(self)
+ sess.commit()
diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py
new file mode 100644
index 00000000..88614fd4
--- /dev/null
+++ b/mediagoblin/db/sql/convert.py
@@ -0,0 +1,151 @@
+from mediagoblin.init import setup_global_and_app_config, setup_database
+from mediagoblin.db.mongo.util import ObjectId
+
+from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment,
+ Tag, MediaTag, MediaFile)
+from mediagoblin.db.sql.open import setup_connection_and_db_from_config as \
+ sql_connect
+from mediagoblin.db.mongo.open import setup_connection_and_db_from_config as \
+ mongo_connect
+from mediagoblin.db.sql.base import Session
+
+
+obj_id_table = dict()
+
+def add_obj_ids(entry, new_entry):
+ global obj_id_table
+ print "%r -> %r" % (entry._id, new_entry.id)
+ obj_id_table[entry._id] = new_entry.id
+
+
+def copy_attrs(entry, new_entry, attr_list):
+ for a in attr_list:
+ val = entry[a]
+ setattr(new_entry, a, val)
+
+def copy_reference_attr(entry, new_entry, ref_attr):
+ val = entry[ref_attr]
+ val = obj_id_table[val]
+ setattr(new_entry, ref_attr, val)
+
+
+def convert_users(mk_db):
+ session = Session()
+
+ for entry in mk_db.User.find():
+ print entry.username
+
+ new_entry = User()
+ copy_attrs(entry, new_entry,
+ ('username', 'email', 'created', 'pw_hash', 'email_verified',
+ 'status', 'verification_key', 'is_admin', 'url',
+ 'bio', 'bio_html',
+ 'fp_verification_key', 'fp_token_expire',))
+ # new_entry.fp_verification_expire = entry.fp_token_expire
+
+ session.add(new_entry)
+ session.flush()
+ add_obj_ids(entry, new_entry)
+
+ session.commit()
+ session.close()
+
+
+def convert_media_entries(mk_db):
+ session = Session()
+
+ for entry in mk_db.MediaEntry.find():
+ print repr(entry.title)
+
+ new_entry = MediaEntry()
+ copy_attrs(entry, new_entry,
+ ('title', 'slug', 'created',
+ 'description', 'description_html',
+ 'media_type', 'state',
+ 'fail_error',
+ 'queued_task_id',))
+ copy_reference_attr(entry, new_entry, "uploader")
+
+ session.add(new_entry)
+ session.flush()
+ add_obj_ids(entry, new_entry)
+
+ for key, value in entry.media_files.iteritems():
+ new_file = MediaFile(name=key, file_path=value)
+ new_file.media_entry = new_entry.id
+ Session.add(new_file)
+
+ session.commit()
+ session.close()
+
+
+def convert_media_tags(mk_db):
+ session = Session()
+ session.autoflush = False
+
+ for media in mk_db.MediaEntry.find():
+ print repr(media.title)
+
+ for otag in media.tags:
+ print " ", repr((otag["slug"], otag["name"]))
+
+ nslug = session.query(Tag).filter_by(slug=otag["slug"]).first()
+ print " ", repr(nslug)
+ if nslug is None:
+ nslug = Tag(slug=otag["slug"])
+ session.add(nslug)
+ session.flush()
+ print " ", repr(nslug), nslug.id
+
+ ntag = MediaTag()
+ ntag.tag = nslug.id
+ ntag.name = otag["name"]
+ ntag.media_entry = obj_id_table[media._id]
+ session.add(ntag)
+
+ session.commit()
+ session.close()
+
+
+def convert_media_comments(mk_db):
+ session = Session()
+
+ for entry in mk_db.MediaComment.find():
+ print repr(entry.content)
+
+ new_entry = MediaComment()
+ copy_attrs(entry, new_entry,
+ ('created',
+ 'content', 'content_html',))
+ copy_reference_attr(entry, new_entry, "media_entry")
+ copy_reference_attr(entry, new_entry, "author")
+
+ session.add(new_entry)
+ session.flush()
+ add_obj_ids(entry, new_entry)
+
+ session.commit()
+ session.close()
+
+
+def main():
+ global_config, app_config = setup_global_and_app_config("mediagoblin.ini")
+
+ sql_conn, sql_db = sql_connect({'sql_engine': 'sqlite:///mediagoblin.db'})
+
+ mk_conn, mk_db = mongo_connect(app_config)
+
+ Base.metadata.create_all(sql_db.engine)
+
+ convert_users(mk_db)
+ Session.remove()
+ convert_media_entries(mk_db)
+ Session.remove()
+ convert_media_tags(mk_db)
+ Session.remove()
+ convert_media_comments(mk_db)
+ Session.remove()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/mediagoblin/db/sql/extratypes.py b/mediagoblin/db/sql/extratypes.py
new file mode 100644
index 00000000..88f556d9
--- /dev/null
+++ b/mediagoblin/db/sql/extratypes.py
@@ -0,0 +1,18 @@
+from sqlalchemy.types import TypeDecorator, Unicode
+
+
+class PathTupleWithSlashes(TypeDecorator):
+ "Represents a Tuple of strings as a slash separated string."
+
+ impl = Unicode
+
+ def process_bind_param(self, value, dialect):
+ if value is not None:
+ assert len(value), "Does not support empty lists"
+ value = '/'.join(value)
+ return value
+
+ def process_result_value(self, value, dialect):
+ if value is not None:
+ value = tuple(value.split('/'))
+ return value
diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py
new file mode 100644
index 00000000..91092f33
--- /dev/null
+++ b/mediagoblin/db/sql/models.py
@@ -0,0 +1,153 @@
+import datetime
+
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import (
+ Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey,
+ UniqueConstraint)
+from sqlalchemy.orm import relationship
+from sqlalchemy.orm.collections import attribute_mapped_collection
+from sqlalchemy.ext.associationproxy import association_proxy
+
+from mediagoblin.db.sql.extratypes import PathTupleWithSlashes
+from mediagoblin.db.sql.base import GMGTableBase
+from mediagoblin.db.mixin import UserMixin, MediaEntryMixin
+
+
+Base = declarative_base(cls=GMGTableBase)
+
+
+class SimpleFieldAlias(object):
+ """An alias for any field"""
+ def __init__(self, fieldname):
+ self.fieldname = fieldname
+
+ def __get__(self, instance, cls):
+ return getattr(instance, self.fieldname)
+
+ def __set__(self, instance, val):
+ setattr(instance, self.fieldname, val)
+
+
+class User(Base, UserMixin):
+ __tablename__ = "users"
+
+ id = Column(Integer, primary_key=True)
+ username = Column(Unicode, nullable=False, unique=True)
+ email = Column(Unicode, nullable=False)
+ created = Column(DateTime, nullable=False, default=datetime.datetime.now)
+ pw_hash = Column(Unicode, nullable=False)
+ email_verified = Column(Boolean)
+ status = Column(Unicode, default=u"needs_email_verification", nullable=False)
+ verification_key = Column(Unicode)
+ is_admin = Column(Boolean, default=False, nullable=False)
+ url = Column(Unicode)
+ bio = Column(UnicodeText) # ??
+ bio_html = Column(UnicodeText) # ??
+ fp_verification_key = Column(Unicode)
+ fp_token_expire = Column(DateTime)
+
+ ## TODO
+ # plugin data would be in a separate model
+
+ _id = SimpleFieldAlias("id")
+
+
+class MediaEntry(Base, MediaEntryMixin):
+ __tablename__ = "media_entries"
+
+ id = Column(Integer, primary_key=True)
+ uploader = Column(Integer, ForeignKey('users.id'), nullable=False)
+ title = Column(Unicode, nullable=False)
+ slug = Column(Unicode, nullable=False)
+ created = Column(DateTime, nullable=False, default=datetime.datetime.now)
+ description = Column(UnicodeText) # ??
+ description_html = Column(UnicodeText) # ??
+ media_type = Column(Unicode, nullable=False)
+ state = Column(Unicode, nullable=False) # or use sqlalchemy.types.Enum?
+
+ fail_error = Column(Unicode)
+ fail_metadata = Column(UnicodeText)
+
+ queued_media_file = Column(PathTupleWithSlashes)
+
+ queued_task_id = Column(Unicode)
+
+ __table_args__ = (
+ UniqueConstraint('uploader', 'slug'),
+ {})
+
+ get_uploader = relationship(User)
+
+ media_files_helper = relationship("MediaFile",
+ collection_class=attribute_mapped_collection("name"),
+ cascade="all, delete-orphan"
+ )
+ media_files = association_proxy('media_files_helper', 'file_path',
+ creator=lambda k,v: MediaFile(name=k, file_path=v)
+ )
+
+ ## TODO
+ # media_data
+ # attachment_files
+ # fail_error
+
+
+class MediaFile(Base):
+ __tablename__ = "mediafiles"
+
+ media_entry = Column(
+ Integer, ForeignKey(MediaEntry.id),
+ nullable=False, primary_key=True)
+ name = Column(Unicode, primary_key=True)
+ file_path = Column(PathTupleWithSlashes)
+
+ def __repr__(self):
+ return "<MediaFile %s: %r>" % (self.name, self.file_path)
+
+
+class Tag(Base):
+ __tablename__ = "tags"
+
+ id = Column(Integer, primary_key=True)
+ slug = Column(Unicode, nullable=False, unique=True)
+
+
+class MediaTag(Base):
+ __tablename__ = "media_tags"
+
+ id = Column(Integer, primary_key=True)
+ tag = Column(Integer, ForeignKey('tags.id'), nullable=False)
+ name = Column(Unicode)
+ media_entry = Column(
+ Integer, ForeignKey('media_entries.id'),
+ nullable=False)
+ # created = Column(DateTime, nullable=False, default=datetime.datetime.now)
+
+ __table_args__ = (
+ UniqueConstraint('tag', 'media_entry'),
+ {})
+
+
+class MediaComment(Base):
+ __tablename__ = "media_comments"
+
+ id = Column(Integer, primary_key=True)
+ media_entry = Column(
+ Integer, ForeignKey('media_entries.id'), nullable=False)
+ author = Column(Integer, ForeignKey('users.id'), nullable=False)
+ created = Column(DateTime, nullable=False, default=datetime.datetime.now)
+ content = Column(UnicodeText, nullable=False)
+ content_html = Column(UnicodeText)
+
+ get_author = relationship(User)
+
+
+def show_table_init():
+ from sqlalchemy import create_engine
+ engine = create_engine('sqlite:///:memory:', echo=True)
+
+ Base.metadata.create_all(engine)
+
+
+if __name__ == '__main__':
+ show_table_init()
diff --git a/mediagoblin/db/sql/open.py b/mediagoblin/db/sql/open.py
new file mode 100644
index 00000000..c682bd3b
--- /dev/null
+++ b/mediagoblin/db/sql/open.py
@@ -0,0 +1,33 @@
+from sqlalchemy import create_engine
+
+from mediagoblin.db.sql.base import Session
+from mediagoblin.db.sql.models import Base
+
+
+class DatabaseMaster(object):
+ def __init__(self, engine):
+ self.engine = engine
+
+ for k,v in Base._decl_class_registry.iteritems():
+ setattr(self, k, v)
+
+ def commit(self):
+ Session.commit()
+
+ def save(self, obj):
+ Session.add(obj)
+ Session.flush()
+
+ def reset_after_request(self):
+ Session.remove()
+
+
+def setup_connection_and_db_from_config(app_config):
+ engine = create_engine(app_config['sql_engine'], echo=True)
+ Session.configure(bind=engine)
+
+ return "dummy conn", DatabaseMaster(engine)
+
+
+def check_db_migrations_current(db):
+ pass
diff --git a/mediagoblin/db/util.py b/mediagoblin/db/util.py
index 84a6cbce..1df9494c 100644
--- a/mediagoblin/db/util.py
+++ b/mediagoblin/db/util.py
@@ -14,278 +14,5 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
-Utilities for database operations.
-
-Some note on migration and indexing tools:
-
-We store information about what the state of the database is in the
-'mediagoblin' document of the 'app_metadata' collection. Keys in that
-document relevant to here:
-
- - 'migration_number': The integer representing the current state of
- the migrations
-"""
-
-import copy
-
-# Imports that other modules might use
-from pymongo import ASCENDING, DESCENDING
-from pymongo.errors import InvalidId
-from mongokit import ObjectId
-
-from mediagoblin.db.indexes import ACTIVE_INDEXES, DEPRECATED_INDEXES
-
-
-################
-# Indexing tools
-################
-
-
-def add_new_indexes(database, active_indexes=ACTIVE_INDEXES):
- """
- Add any new indexes to the database.
-
- Args:
- - database: pymongo or mongokit database instance.
- - active_indexes: indexes to possibly add in the pattern of:
- {'collection_name': {
- 'identifier': {
- 'index': [index_foo_goes_here],
- 'unique': True}}
- where 'index' is the index to add and all other options are
- arguments for collection.create_index.
-
- Returns:
- A list of indexes added in form ('collection', 'index_name')
- """
- indexes_added = []
-
- for collection_name, indexes in active_indexes.iteritems():
- collection = database[collection_name]
- collection_indexes = collection.index_information().keys()
-
- for index_name, index_data in indexes.iteritems():
- if not index_name in collection_indexes:
- # Get a copy actually so we don't modify the actual
- # structure
- index_data = copy.copy(index_data)
- index = index_data.pop('index')
- collection.create_index(
- index, name=index_name, **index_data)
-
- indexes_added.append((collection_name, index_name))
-
- return indexes_added
-
-
-def remove_deprecated_indexes(database, deprecated_indexes=DEPRECATED_INDEXES):
- """
- Remove any deprecated indexes from the database.
-
- Args:
- - database: pymongo or mongokit database instance.
- - deprecated_indexes: the indexes to deprecate in the pattern of:
- {'collection_name': {
- 'identifier': {
- 'index': [index_foo_goes_here],
- 'unique': True}}
-
- (... although we really only need the 'identifier' here, as the
- rest of the information isn't used in this case. But it's kept
- around so we can remember what it was)
-
- Returns:
- A list of indexes removed in form ('collection', 'index_name')
- """
- indexes_removed = []
-
- for collection_name, indexes in deprecated_indexes.iteritems():
- collection = database[collection_name]
- collection_indexes = collection.index_information().keys()
-
- for index_name, index_data in indexes.iteritems():
- if index_name in collection_indexes:
- collection.drop_index(index_name)
-
- indexes_removed.append((collection_name, index_name))
-
- return indexes_removed
-
-
-#################
-# Migration tools
-#################
-
-# The default migration registry...
-#
-# Don't set this yourself! RegisterMigration will automatically fill
-# this with stuff via decorating methods in migrations.py
-
-class MissingCurrentMigration(Exception): pass
-
-
-MIGRATIONS = {}
-
-
-class RegisterMigration(object):
- """
- Tool for registering migrations
-
- Call like:
-
- @RegisterMigration(33)
- def update_dwarves(database):
- [...]
-
- This will register your migration with the default migration
- registry. Alternately, to specify a very specific
- migration_registry, you can pass in that as the second argument.
-
- Note, the number of your migration should NEVER be 0 or less than
- 0. 0 is the default "no migrations" state!
- """
- def __init__(self, migration_number, migration_registry=MIGRATIONS):
- assert migration_number > 0, "Migration number must be > 0!"
- assert not migration_registry.has_key(migration_number), \
- "Duplicate migration numbers detected! That's not allowed!"
-
- self.migration_number = migration_number
- self.migration_registry = migration_registry
-
- def __call__(self, migration):
- self.migration_registry[self.migration_number] = migration
- return migration
-
-
-class MigrationManager(object):
- """
- Migration handling tool.
-
- Takes information about a database, lets you update the database
- to the latest migrations, etc.
- """
- def __init__(self, database, migration_registry=MIGRATIONS):
- """
- Args:
- - database: database we're going to migrate
- - migration_registry: where we should find all migrations to
- run
- """
- self.database = database
- self.migration_registry = migration_registry
- self._sorted_migrations = None
-
- def _ensure_current_migration_record(self):
- """
- If there isn't a database[u'app_metadata'] mediagoblin entry
- with the 'current_migration', throw an error.
- """
- if self.database_current_migration() is None:
- raise MissingCurrentMigration(
- "Tried to call function which requires "
- "'current_migration' set in database")
-
- @property
- def sorted_migrations(self):
- """
- Sort migrations if necessary and store in self._sorted_migrations
- """
- if not self._sorted_migrations:
- self._sorted_migrations = sorted(
- self.migration_registry.items(),
- # sort on the key... the migration number
- key=lambda migration_tuple: migration_tuple[0])
-
- return self._sorted_migrations
-
- def latest_migration(self):
- """
- Return a migration number for the latest migration, or 0 if
- there are no migrations.
- """
- if self.sorted_migrations:
- return self.sorted_migrations[-1][0]
- else:
- # If no migrations have been set, we start at 0.
- return 0
-
- def set_current_migration(self, migration_number):
- """
- Set the migration in the database to migration_number
- """
- # Add the mediagoblin migration if necessary
- self.database[u'app_metadata'].update(
- {u'_id': u'mediagoblin'},
- {u'$set': {u'current_migration': migration_number}},
- upsert=True)
-
- def install_migration_version_if_missing(self):
- """
- Sets the migration to the latest version if no migration
- version at all is set.
- """
- mgoblin_metadata = self.database[u'app_metadata'].find_one(
- {u'_id': u'mediagoblin'})
- if not mgoblin_metadata:
- latest_migration = self.latest_migration()
- self.set_current_migration(latest_migration)
-
- def database_current_migration(self):
- """
- Return the current migration in the database.
- """
- mgoblin_metadata = self.database[u'app_metadata'].find_one(
- {u'_id': u'mediagoblin'})
- if not mgoblin_metadata:
- return None
- else:
- return mgoblin_metadata[u'current_migration']
-
- def database_at_latest_migration(self):
- """
- See if the database is at the latest migration.
- Returns a boolean.
- """
- current_migration = self.database_current_migration()
- return current_migration == self.latest_migration()
-
- def migrations_to_run(self):
- """
- Get a list of migrations to run still, if any.
-
- Note that calling this will set your migration version to the
- latest version if it isn't installed to anything yet!
- """
- self._ensure_current_migration_record()
-
- db_current_migration = self.database_current_migration()
-
- return [
- (migration_number, migration_func)
- for migration_number, migration_func in self.sorted_migrations
- if migration_number > db_current_migration]
-
- def migrate_new(self, pre_callback=None, post_callback=None):
- """
- Run all migrations.
-
- Includes two optional args:
- - pre_callback: if called, this is a callback on something to
- run pre-migration. Takes (migration_number, migration_func)
- as arguments
- - pre_callback: if called, this is a callback on something to
- run post-migration. Takes (migration_number, migration_func)
- as arguments
- """
- # If we aren't set to any version number, presume we're at the
- # latest (which means we'll do nothing here...)
- self.install_migration_version_if_missing()
-
- for migration_number, migration_func in self.migrations_to_run():
- if pre_callback:
- pre_callback(migration_number, migration_func)
- migration_func(self.database)
- self.set_current_migration(migration_number)
- if post_callback:
- post_callback(migration_number, migration_func)
+from mediagoblin.db.mongo.util import (ObjectId, InvalidId,
+ DESCENDING)
diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py
index 6431d67e..4cf14a70 100644
--- a/mediagoblin/decorators.py
+++ b/mediagoblin/decorators.py
@@ -40,7 +40,7 @@ def require_active_login(controller):
request.user.get('status') == u'needs_email_verification':
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=request.user['username'])
+ user=request.user.username)
elif not request.user or request.user.get('status') != u'active':
return exc.HTTPFound(
location="%s?next=%s" % (
@@ -57,10 +57,10 @@ def user_may_delete_media(controller):
Require user ownership of the MediaEntry to delete.
"""
def wrapper(request, *args, **kwargs):
- uploader = request.db.MediaEntry.find_one(
- {'_id': ObjectId(request.matchdict['media'])}).uploader()
- if not (request.user['is_admin'] or
- request.user['_id'] == uploader['_id']):
+ uploader_id = request.db.MediaEntry.find_one(
+ {'_id': ObjectId(request.matchdict['media'])}).uploader
+ if not (request.user.is_admin or
+ request.user._id == uploader_id):
return exc.HTTPForbidden()
return controller(request, *args, **kwargs)
@@ -95,11 +95,10 @@ def get_user_media_entry(controller):
if not user:
return render_404(request)
-
media = request.db.MediaEntry.find_one(
{'slug': request.matchdict['media'],
'state': 'processed',
- 'uploader': user['_id']})
+ 'uploader': user._id})
# no media via slug? Grab it via ObjectId
if not media:
@@ -107,7 +106,7 @@ def get_user_media_entry(controller):
media = request.db.MediaEntry.find_one(
{'_id': ObjectId(request.matchdict['media']),
'state': 'processed',
- 'uploader': user['_id']})
+ 'uploader': user._id})
except InvalidId:
return render_404(request)
@@ -119,6 +118,7 @@ def get_user_media_entry(controller):
return _make_safe(wrapper, controller)
+
def get_media_entry_by_id(controller):
"""
Pass in a MediaEntry based off of a url component
@@ -138,4 +138,3 @@ def get_media_entry_by_id(controller):
return controller(request, media=media, *args, **kwargs)
return _make_safe(wrapper, controller)
-
diff --git a/mediagoblin/edit/__init__.py b/mediagoblin/edit/__init__.py
index 576bd0f5..ba347c69 100644
--- a/mediagoblin/edit/__init__.py
+++ b/mediagoblin/edit/__init__.py
@@ -13,5 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py
index 3d1d9fd4..d49b9b28 100644
--- a/mediagoblin/edit/forms.py
+++ b/mediagoblin/edit/forms.py
@@ -24,15 +24,21 @@ class EditForm(wtforms.Form):
title = wtforms.TextField(
_('Title'),
[wtforms.validators.Length(min=0, max=500)])
- description = wtforms.TextAreaField('Description of this work')
+ description = wtforms.TextAreaField(
+ _('Description of this work'),
+ description=_("""You can use
+ <a href="http://daringfireball.net/projects/markdown/basics">
+ Markdown</a> for formatting."""))
tags = wtforms.TextField(
_('Tags'),
- [tag_length_validator])
+ [tag_length_validator],
+ description=_(
+ "Separate tags by commas."))
slug = wtforms.TextField(
_('Slug'),
[wtforms.validators.Required(message=_("The slug can't be empty"))],
description=_(
- "The title part of this media's URL. "
+ "The title part of this media's address. "
"You usually don't need to change this."))
license = wtforms.SelectField(
_('License'),
@@ -41,11 +47,27 @@ class EditForm(wtforms.Form):
class EditProfileForm(wtforms.Form):
bio = wtforms.TextAreaField(
_('Bio'),
- [wtforms.validators.Length(min=0, max=500)])
+ [wtforms.validators.Length(min=0, max=500)],
+ description=_("""You can use
+ <a href="http://daringfireball.net/projects/markdown/basics">
+ Markdown</a> for formatting."""))
url = wtforms.TextField(
_('Website'),
[wtforms.validators.Optional(),
- wtforms.validators.URL(message='Improperly formed URL')])
+ wtforms.validators.URL(message="""This address contains errors""")])
+
+
+class EditAccountForm(wtforms.Form):
+ old_password = wtforms.PasswordField(
+ _('Old password'),
+ [wtforms.validators.Required()],
+ description=_(
+ "Enter your old password to prove you own this account."))
+ new_password = wtforms.PasswordField(
+ _('New password'),
+ [wtforms.validators.Required(),
+ wtforms.validators.Length(min=6, max=30)],
+ id="password")
class EditAttachmentsForm(wtforms.Form):
diff --git a/mediagoblin/edit/lib.py b/mediagoblin/edit/lib.py
index b722e9c1..a199cbf7 100644
--- a/mediagoblin/edit/lib.py
+++ b/mediagoblin/edit/lib.py
@@ -17,8 +17,8 @@
def may_edit_media(request, media):
"""Check, if the request's user may edit the media details"""
- if media['uploader'] == request.user['_id']:
+ if media.uploader == request.user._id:
return True
- if request.user['is_admin']:
+ if request.user.is_admin:
return True
return False
diff --git a/mediagoblin/edit/routing.py b/mediagoblin/edit/routing.py
index 34e9fd80..5216f7ca 100644
--- a/mediagoblin/edit/routing.py
+++ b/mediagoblin/edit/routing.py
@@ -20,4 +20,7 @@ from routes.route import Route
edit_routes = [
# Media editing view handled in user_pages/routing.py
Route('mediagoblin.edit.profile', '/profile/',
- controller="mediagoblin.edit.views:edit_profile")]
+ controller="mediagoblin.edit.views:edit_profile"),
+ Route('mediagoblin.edit.account', '/account/',
+ controller="mediagoblin.edit.views:edit_account")
+ ]
diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py
index f92eabac..6f4585cf 100644
--- a/mediagoblin/edit/views.py
+++ b/mediagoblin/edit/views.py
@@ -26,6 +26,7 @@ from werkzeug.utils import secure_filename
from mediagoblin import messages
from mediagoblin import mg_globals
+from mediagoblin.auth import lib as auth_lib
from mediagoblin.edit import forms
from mediagoblin.edit.lib import may_edit_media
from mediagoblin.decorators import require_active_login, get_user_media_entry
@@ -43,11 +44,11 @@ def edit_media(request, media):
return exc.HTTPForbidden()
defaults = dict(
- title=media['title'],
- slug=media['slug'],
- description=media['description'],
- tags=media_tags_as_string(media['tags']),
- license=media['license'])
+ title=media.title,
+ slug=media.slug,
+ description=media.description,
+ tags=media_tags_as_string(media.tags))
+ license=media.license)
form = forms.EditForm(
request.POST,
@@ -58,33 +59,34 @@ def edit_media(request, media):
# and userid.
existing_user_slug_entries = request.db.MediaEntry.find(
{'slug': request.POST['slug'],
- 'uploader': media['uploader'],
- '_id': {'$ne': media['_id']}}).count()
+ 'uploader': media.uploader,
+ '_id': {'$ne': media._id}}).count()
if existing_user_slug_entries:
form.slug.errors.append(
_(u'An entry with that slug already exists for this user.'))
else:
- media['title'] = unicode(request.POST['title'])
- media['description'] = unicode(request.POST.get('description'))
+ media.title = unicode(request.POST['title'])
+ media.description = unicode(request.POST.get('description'))
media['tags'] = convert_to_tag_list_of_dicts(
request.POST.get('tags'))
- media['description_html'] = cleaned_markdown_conversion(
- media['description'])
+ media.description_html = cleaned_markdown_conversion(
+ media.description)
- media['license'] = (
+ media.license = (
unicode(request.POST.get('license'))
or '')
- media['slug'] = unicode(request.POST['slug'])
+ media.slug = unicode(request.POST['slug'])
+
media.save()
return exc.HTTPFound(
location=media.url_for_self(request.urlgen))
- if request.user['is_admin'] \
- and media['uploader'] != request.user['_id'] \
+ if request.user.is_admin \
+ and media.uploader != request.user._id \
and request.method != 'POST':
messages.add_message(
request, messages.WARNING,
@@ -110,7 +112,7 @@ def edit_attachments(request, media):
attachment_public_filepath \
= mg_globals.public_store.get_unique_filepath(
- ['media_entries', unicode(media['_id']), 'attachment',
+ ['media_entries', unicode(media._id), 'attachment',
secure_filename(request.POST['attachment_file'].filename)])
attachment_public_file = mg_globals.public_store.get_file(
@@ -126,7 +128,7 @@ def edit_attachments(request, media):
name=request.POST['attachment_name'] \
or request.POST['attachment_file'].filename,
filepath=attachment_public_filepath,
- created=datetime.utcnow()
+ created=datetime.utcnow(),
))
media.save()
@@ -152,7 +154,7 @@ def edit_attachments(request, media):
def edit_profile(request):
# admins may edit any user profile given a username in the querystring
edit_username = request.GET.get('username')
- if request.user['is_admin'] and request.user['username'] != edit_username:
+ if request.user.is_admin and request.user.username != edit_username:
user = request.db.User.find_one({'username': edit_username})
# No need to warn again if admin just submitted an edited profile
if request.method != 'POST':
@@ -167,22 +169,64 @@ def edit_profile(request):
bio=user.get('bio'))
if request.method == 'POST' and form.validate():
- user['url'] = unicode(request.POST['url'])
- user['bio'] = unicode(request.POST['bio'])
+ user.url = unicode(request.POST['url'])
+ user.bio = unicode(request.POST['bio'])
- user['bio_html'] = cleaned_markdown_conversion(user['bio'])
+ user.bio_html = cleaned_markdown_conversion(user.bio)
- user.save()
+ user.save()
- messages.add_message(request,
- messages.SUCCESS,
- 'Profile edited!')
- return redirect(request,
- 'mediagoblin.user_pages.user_home',
- user=edit_username)
+ messages.add_message(request,
+ messages.SUCCESS,
+ _("Profile changes saved"))
+ return redirect(request,
+ 'mediagoblin.user_pages.user_home',
+ user=user['username'])
return render_to_response(
request,
'mediagoblin/edit/edit_profile.html',
{'user': user,
'form': form})
+
+
+@require_active_login
+def edit_account(request):
+ edit_username = request.GET.get('username')
+ user = request.user
+
+ form = forms.EditAccountForm(request.POST)
+
+ if request.method == 'POST' and form.validate():
+ password_matches = auth_lib.bcrypt_check_password(
+ request.POST['old_password'],
+ user.pw_hash)
+
+ if (request.POST['old_password'] or request.POST['new_password']) and not \
+ password_matches:
+ form.old_password.errors.append(_('Wrong password'))
+
+ return render_to_response(
+ request,
+ 'mediagoblin/edit/edit_account.html',
+ {'user': user,
+ 'form': form})
+
+ if password_matches:
+ user.pw_hash = auth_lib.bcrypt_gen_password_hash(
+ request.POST['new_password'])
+
+ user.save()
+
+ messages.add_message(request,
+ messages.SUCCESS,
+ _("Account settings saved"))
+ return redirect(request,
+ 'mediagoblin.user_pages.user_home',
+ user=user.username)
+
+ return render_to_response(
+ request,
+ 'mediagoblin/edit/edit_account.html',
+ {'user': user,
+ 'form': form})
diff --git a/mediagoblin/gmg_commands/__init__.py b/mediagoblin/gmg_commands/__init__.py
index 10c30385..04187ff2 100644
--- a/mediagoblin/gmg_commands/__init__.py
+++ b/mediagoblin/gmg_commands/__init__.py
@@ -29,7 +29,7 @@ SUBCOMMAND_MAP = {
'setup': 'mediagoblin.gmg_commands.migrate:migrate_parser_setup',
'func': 'mediagoblin.gmg_commands.migrate:migrate',
'help': 'Apply all unapplied bulk migrations to the database'},
- 'adduser':{
+ 'adduser': {
'setup': 'mediagoblin.gmg_commands.users:adduser_parser_setup',
'func': 'mediagoblin.gmg_commands.users:adduser',
'help': 'Creates an user'},
@@ -68,7 +68,7 @@ def main_cli():
subparsers = parser.add_subparsers(help='sub-command help')
for command_name, command_struct in SUBCOMMAND_MAP.iteritems():
- if command_struct.has_key('help'):
+ if 'help' in command_struct:
subparser = subparsers.add_parser(
command_name, help=command_struct['help'])
else:
@@ -94,4 +94,3 @@ def main_cli():
if __name__ == '__main__':
main_cli()
-
diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py
index 78d30713..7f699429 100644
--- a/mediagoblin/gmg_commands/import_export.py
+++ b/mediagoblin/gmg_commands/import_export.py
@@ -16,7 +16,6 @@
from mediagoblin import mg_globals
from mediagoblin.db.open import setup_connection_and_db_from_config
-from mediagoblin.init.config import read_mediagoblin_config
from mediagoblin.storage.filestorage import BasicFileStorage
from mediagoblin.init import setup_storage, setup_global_and_app_config
@@ -65,10 +64,10 @@ def _import_media(db, args):
queue_cache = BasicFileStorage(
args._cache_path['queue'])
- for entry in db.media_entries.find():
- for name, path in entry['media_files'].items():
+ for entry in db.MediaEntry.find():
+ for name, path in entry.media_files.items():
_log.info('Importing: {0} - {1}'.format(
- entry['title'],
+ entry.title,
name))
media_file = mg_globals.public_store.get_file(path, mode='wb')
@@ -88,7 +87,7 @@ def _import_database(db, args):
args.mongorestore_path,
'-d', db.name,
os.path.join(args._cache_path['database'], db.name)])
-
+
p.wait()
_log.info('...Database imported')
@@ -108,7 +107,7 @@ def env_import(args):
global_config, app_config = setup_global_and_app_config(args.conf_file)
connection, db = setup_connection_and_db_from_config(
- app_config, use_pymongo=True)
+ app_config)
tf = tarfile.open(
args.tar_file,
@@ -207,15 +206,17 @@ def _export_media(db, args):
queue_cache = BasicFileStorage(
args._cache_path['queue'])
- for entry in db.media_entries.find():
- for name, path in entry['media_files'].items():
- _log.info('Exporting {0} - {1}'.format(
- entry['title'],
+ for entry in db.MediaEntry.find():
+ for name, path in entry.media_files.items():
+ _log.info(u'Exporting {0} - {1}'.format(
+ entry.title,
name))
-
- mc_file = media_cache.get_file(path, mode='wb')
- mc_file.write(
- mg_globals.public_store.get_file(path, mode='rb').read())
+ try:
+ mc_file = media_cache.get_file(path, mode='wb')
+ mc_file.write(
+ mg_globals.public_store.get_file(path, mode='rb').read())
+ except Exception as e:
+ _log.error('Failed: {0}'.format(e))
_log.info('...Media exported')
@@ -226,7 +227,8 @@ def env_export(args):
'''
if args.cache_path:
if os.path.exists(args.cache_path):
- _log.error('The cache directory must not exist before you run this script')
+ _log.error('The cache directory must not exist '
+ 'before you run this script')
_log.error('Cache directory: {0}'.format(args.cache_path))
return False
@@ -242,9 +244,9 @@ def env_export(args):
globa_config, app_config = setup_global_and_app_config(args.conf_file)
setup_storage()
-
+
connection, db = setup_connection_and_db_from_config(
- app_config, use_pymongo=True)
+ app_config)
_export_database(db, args)
diff --git a/mediagoblin/gmg_commands/migrate.py b/mediagoblin/gmg_commands/migrate.py
index fad9b363..0a8ee7dc 100644
--- a/mediagoblin/gmg_commands/migrate.py
+++ b/mediagoblin/gmg_commands/migrate.py
@@ -16,12 +16,12 @@
import sys
-from mediagoblin.db import util as db_util
+from mediagoblin.db.mongo import util as db_util
from mediagoblin.db.open import setup_connection_and_db_from_config
-from mediagoblin.init.config import read_mediagoblin_config
+from mediagoblin.init import setup_global_and_app_config
# This MUST be imported so as to set up the appropriate migrations!
-from mediagoblin.db import migrations
+from mediagoblin.db.mongo import migrations
def migrate_parser_setup(subparser):
@@ -41,9 +41,9 @@ def _print_finished_migration(migration_number, migration_func):
def migrate(args):
- config, validation_result = read_mediagoblin_config(args.conf_file)
+ global_config, app_config = setup_global_and_app_config(args.conf_file)
connection, db = setup_connection_and_db_from_config(
- config['mediagoblin'], use_pymongo=True)
+ app_config, use_pymongo=True)
migration_manager = db_util.MigrationManager(db)
# Clear old indexes
@@ -53,13 +53,13 @@ def migrate(args):
for collection, index_name in removed_indexes:
print "Removed index '%s' in collection '%s'" % (
index_name, collection)
-
+
# Migrate
print "\n== Applying migrations... =="
migration_manager.migrate_new(
pre_callback=_print_started_migration,
post_callback=_print_finished_migration)
-
+
# Add new indexes
print "\n== Adding new indexes... =="
new_indexes = db_util.add_new_indexes(db)
diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py
index 345c3e5c..4bfe30a5 100644
--- a/mediagoblin/gmg_commands/users.py
+++ b/mediagoblin/gmg_commands/users.py
@@ -18,27 +18,30 @@ from mediagoblin.gmg_commands import util as commands_util
from mediagoblin.auth import lib as auth_lib
from mediagoblin import mg_globals
-
def adduser_parser_setup(subparser):
subparser.add_argument(
- 'username',
+ '--username','-u',
help="Username used to login")
subparser.add_argument(
- 'password',
- help="Your supersecret word to login")
+ '--password','-p',
+ help="Your supersecret word to login, beware of storing it in bash history")
subparser.add_argument(
- 'email',
- help="Email to recieve notifications")
+ '--email','-e',
+ help="Email to receive notifications")
def adduser(args):
#TODO: Lets trust admins this do not validate Emails :)
commands_util.setup_app(args)
+ args.username = commands_util.prompt_if_not_set(args.username, "Username:")
+ args.password = commands_util.prompt_if_not_set(args.password, "Password:",True)
+ args.email = commands_util.prompt_if_not_set(args.email, "Email:")
+
db = mg_globals.database
users_with_username = \
db.User.find({
- 'username': args.username.lower()
+ 'username': args.username.lower(),
}).count()
if users_with_username:
@@ -47,11 +50,11 @@ def adduser(args):
else:
# Create the user
entry = db.User()
- entry['username'] = unicode(args.username.lower())
- entry['email'] = unicode(args.email)
- entry['pw_hash'] = auth_lib.bcrypt_gen_password_hash(args.password)
- entry['status'] = u'active'
- entry['email_verified'] = True
+ entry.username = unicode(args.username.lower())
+ entry.email = unicode(args.email)
+ entry.pw_hash = auth_lib.bcrypt_gen_password_hash(args.password)
+ entry.status = u'active'
+ entry.email_verified = True
entry.save(validate=True)
print "User created (and email marked as verified)"
@@ -68,9 +71,9 @@ def makeadmin(args):
db = mg_globals.database
- user = db.User.one({'username':unicode(args.username.lower())})
+ user = db.User.one({'username': unicode(args.username.lower())})
if user:
- user['is_admin'] = True
+ user.is_admin = True
user.save()
print 'The user is now Admin'
else:
@@ -91,11 +94,10 @@ def changepw(args):
db = mg_globals.database
- user = db.User.one({'username':unicode(args.username.lower())})
+ user = db.User.one({'username': unicode(args.username.lower())})
if user:
- user['pw_hash'] = auth_lib.bcrypt_gen_password_hash(args.password)
+ user.pw_hash = auth_lib.bcrypt_gen_password_hash(args.password)
user.save()
print 'Password successfully changed'
else:
print 'The user doesn\'t exist'
-
diff --git a/mediagoblin/gmg_commands/util.py b/mediagoblin/gmg_commands/util.py
index 168a0760..3e26c53f 100644
--- a/mediagoblin/gmg_commands/util.py
+++ b/mediagoblin/gmg_commands/util.py
@@ -16,6 +16,7 @@
from mediagoblin import app
+import getpass
def setup_app(args):
@@ -25,3 +26,15 @@ def setup_app(args):
mgoblin_app = app.MediaGoblinApp(args.conf_file)
return mgoblin_app
+
+def prompt_if_not_set(variable, text, password=False):
+ """
+ Checks if the variable is None and prompt for a value if it is
+ """
+ if variable is None:
+ if not password:
+ variable=raw_input(text + u' ')
+ else:
+ variable=getpass.getpass(text + u' ')
+
+ return variable
diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
index 4e4e8863..1a7267e5 100644
--- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
index 548e971f..c53fc387 100644
--- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -21,27 +21,19 @@ msgstr ""
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "اسم المستخدم"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "كلمة السر"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "يجب أن تتطابق كلمتا السر."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "أكّد كلمة السر"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "اكتبها مرة أخرى هنا للتأكد من عدم وجود أخطاء إملائية."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "عنوان البريد الإلكتروني"
@@ -54,10 +46,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "عذرًا، لقد اختار مستخدم آخر هذا الاسم."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "عÙوًا، هذا العنوان البريدي مستخدم."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -65,15 +57,28 @@ msgstr ""
"تم التحقق من بريدك الإلكتروني. يمكنك الآن الولوج، وتحرير ملÙÙƒ الشخصي، ونشر "
"الصور!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Ù…ÙØªØ§Ø­ التحقق أو معر٠المستخدم خاطئ"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "أعدنا إرسال رسالة التحقق."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -81,74 +86,127 @@ msgstr ""
"تعذر إرسال رسالة استعادة كلمة السر لأن اسم المستخدم معطل أو لأننا لم نتحقق "
"من بريدك الإلكتروني."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "العنوان"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "وص٠هذا العمل."
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "الوسوم"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "المسار"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "لا يمكن ترك المسار ÙØ§Ø±ØºÙ‹Ø§"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"الجزء الذي يمثل عنوان المل٠ÙÙŠ المسار. لا حاجة إلى تغيير محتوى هذه الخانة "
-"عادةً."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "السيرة"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "الموقع الإلكتروني"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "يوجد مل٠آخر بهذا المسار لدى هذى المستخدم."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "أنت تحرّر وسائط مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "أنت تحرّر مل٠مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "الملÙ"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "وص٠هذا العمل."
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "يجب أن تضع ملÙًا."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "لا يبدو أن هذا المل٠صورة!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "يا سلام! Ù†ÙØ´Ø±ÙŽØª!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "صورة قزم مرتبك"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "ويحي!"
@@ -163,33 +221,30 @@ msgid ""
msgstr ""
"إن كنت متأكدًا من صحة العنوان ÙØ±Ø¨Ù…ا تكون Ø§Ù„ØµÙØ­Ø© التي تريدها Ù†Ùقلت أو Ø­ÙØ°Ùت."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "صورة قزم مرتبك"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "غنو ميدياغوبلن"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "شعار ميدياغوبلن"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "أرسل وسائط"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "أض٠وسائط"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "أكّد بريدك"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Ù„ÙØ¬"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -199,81 +254,53 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "مرحبًا بكم يا محبي الوسائط! ميدياغوبلن هو..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "المكان الأنسب لوسائطك!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr "مكان يجتمع Ùيه الناس ليتعاونوا ويعرضوا إبداعاتهم الأصلية والمقتبسة!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr "مشروع حر، Ùنحن أحد مشاريع <a href=\"http://gnu.org\">غنو</a>."
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr "مشروع يحاول جعل عالمنا Ø£ÙØ¶Ù„ عن طريق اللامركزية (قريبًا!)."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"جاهز للتمدد. (Ø³ÙŠÙØ¶Ø§Ù دعم أنساق كثيرة من الوسائط قريبًا، كما سندعم الÙيديو!)."
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">أنشئ حسابًا مجانيًا</a>\n"
-" أو\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">ركّب ميدياغوبلن على خادومك الخاص</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "أحدث الوسائط"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "أدخل كلمة سرك الجديدة"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "أدخل اسم المستخدم أو بريدك الإلكتروني"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "لقد غÙيرت كلمة سرك. جرّب الولوج الآن."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr "تÙقد بريدك الإلكتروني. لقد أرسلنا رسالة بها وصلة لتغيير كلمة سرك."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -300,27 +327,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "ÙØ´Ù„ الولوج!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "ألا تملك حسابًا بعد؟"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "أنشئ حسابًا هنا!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "أنسيت كلمة سرك؟"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "غيّرها!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "أنشئ حسابًا!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "أنشئ"
@@ -352,36 +375,114 @@ msgid "Cancel"
msgstr "ألغÙ"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Ø§Ø­ÙØ¸ التغييرات"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "تحرير مل٠%(username)s الشخصي"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "الوسائط الموسومة بâ€"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "انشر وسائطك"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "أرسل"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "وسائط <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "عذرًا، تعذر العثور على مستخدم بهذا الاسم."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -413,35 +514,45 @@ msgstr "لا توجد وسائط تحت المعالجة"
msgid "These uploads failed to process:"
msgstr "ÙØ´Ù„ت معالجة هذه Ø§Ù„Ù…Ù„ÙØ§Øª:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "مل٠%(username)s الشخصي"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "عذرًا، تعذر العثور على مستخدم بهذا الاسم."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "يجب التحقق من البريد الإلكتروني"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "أوشكنا على الانتهاء! ما زال حسابك بحاجة إلى Ø§Ù„ØªÙØ¹ÙŠÙ„."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "ستصلك رسالة إلكترونية خلال لحظات بها التعليمات."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "إن لم تصل."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "أعد إرسال رسالة التحقق"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr "سجّل أحدهم حسابًا بهذا الاسم، ولكننا بانتظار Ø§Ù„ØªÙØ¹ÙŠÙ„ حتى الآن."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -450,40 +561,36 @@ msgstr ""
"إن كنت أنت ذلك الشخص لكنك Ùقدت رسالة التحقق، يمكنك <a "
"href=\"%(login_url)s\">الولوج</a> وإعادة إرسالها."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "مل٠%(username)s الشخصي"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "هذه زاوية لتخبر الآخرين Ùيها عن Ù†ÙØ³Ùƒ."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Ø­Ø±Ù‘ÙØ± المل٠الشخصي"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "لم يعبئ هذا العضو بيانات ملÙÙ‡ بعد."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Ø£Ø¸Ù‡ÙØ± كل وسائط %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "هنا ستظهر وسائطك، ولكن يبدو أنك لم تض٠شيئًا بعد."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "أض٠وسائط"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "لا يبدو أنه توجد أي وسائط هنا حتى الآن..."
@@ -495,31 +602,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "الأحدث"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "الأقدم"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "علّÙÙ‚"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "أنا متأكد من رغبتي بحذ٠هذا العمل"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "أنت على وشك حذ٠وسائط مستخدم آخر. كن حذرًا أثناء العملية."
diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
index 9b9e7e3b..45f2331f 100644
--- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
index e2cd8342..a5d6732b 100644
--- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
@@ -1,15 +1,16 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# Al fred <devaleitzer@aim.com>, 2011.
# <devaleitzer@aim.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +20,19 @@ msgstr ""
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Aquest tipus de fitxer no és vàlid."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nom d'usuari"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Contrasenya"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Les contrasenyes han de coincidir"
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Confirmeu la contrasenya"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Adreça electrònica"
@@ -52,10 +45,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Lamentablement aquest usuari ja existeix."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Disculpeu, aquesta adreça electrònica ja s'està utilitzant."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,87 +56,155 @@ msgstr ""
"Ja s'ha verificat la vostra adreça electrònica. Ara podeu entrar, editar el "
"vostre perfil i penjar imatge!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
"La clau de verificació o la identificació de l'usuari no són correctes."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Torna'm a enviar el correu de verificació"
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Títol"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Etiquetes"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biografia"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Lloc web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Esteu editant fitxers d'un altre usuari. Aneu amb compte."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Esteu editant el perfil d'un usuari. Aneu amb compte"
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Aquest tipus de fitxer no és vàlid."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Fitxer"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr ""
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Heu d'escollir un fitxer."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "El fitxer no és una imatge"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Visca! S'ha enviat!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Imatge de la pantalla 404, el goblin no sap què fer..."
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Ups!"
@@ -159,33 +220,30 @@ msgstr ""
"Si esteu convençut que l'adreça és correcta, pot ser que la pàgina que "
"cerqueu s'hagi canviat d'ubicació o s'hagi eliminat."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Logo de mediagoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Envia fitxers"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Tots els fitxers"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "verifiqueu el correu electrònic"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Entra"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -195,85 +253,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Ei, fanàtic multimèdia! MediaGoblin és..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "El lloc fitxer pels teus fitxers!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Un lloc en el qual les persones poden col·laborar i mostrar les seves "
-"creacions originals o obres derivades."
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-"Amb l'objectiu de fer del món un lloc millor a través de la "
-"descentralització i (eventualment, aviat disponible!) La federació!"
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Construït per l'ampliació. (Múltiples tipus de fitxers en breu amb el "
-"programari, incloent el suport de vídeo!)"
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Desenvolupat per persones com vostè. ( <a "
-"href=\"http://mediagoblin.org/pages/join.html\"> Podeu ajudar a millorar "
-"aquest programari!</a> )"
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -294,27 +319,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Inici de sessió ha fallat!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Encara no teniu un compte?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Creeu-ne un aquí!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Creeu un compte!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Crea"
@@ -346,36 +367,114 @@ msgid "Cancel"
msgstr "Cancel·la"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Desa els canvis"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Etiquetat amb:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Envieu els vostres fitxers"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Envia"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>'s media"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Lamentablement no s'ha trobat l'usuari que cercàveu."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -397,7 +496,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
msgid "Media in-processing"
-msgstr ""
+msgstr "S'està processant el fitxer"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
@@ -405,37 +504,49 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
+msgstr "No s'han pogut penjar els següents fitxers:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Lamentablement no s'ha trobat l'usuari que cercàveu."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr ""
+msgstr "Cal que verifiqueu l'adreça electrònica"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
-msgstr ""
+msgstr "Gairebé esteu! Tan sols falta que activeu el vostre compte"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "Us hauria d'arribar un correu amb les instruccions per a fer-ho."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
-msgstr ""
+msgstr "Per si no hi fos:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Torna'm a enviar el correu de verificació"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
+"Algú ja ha registrat un compte amb aquest nom d'usuari, però encara l'ha "
+"d'activar."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -444,76 +555,98 @@ msgstr ""
"Si siu aqeust usuari però heu perdut el correu de verificació, podeu <a "
"href=\"%(login_url)s\">entrar</a> i tornar-lo a enviar."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Edita el perfil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
+msgstr "Aquest usuari encara no ha escrit res al seu perfil."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "View all of %(username)s's media"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
-msgstr ""
+msgstr "Icona RSS"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Comentari"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
index b65212eb..4f4bbfda 100644
--- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
index 5baab62e..1fb472f0 100644
--- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
@@ -1,12 +1,14 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
# <benjamin@lebsanft.org>, 2011.
# <cwebber@dustycloud.org>, 2011.
# Elrond <elrond+mediagoblin.org@samba-tng.org>, 2011.
+# <jakob.kramer@gmx.de>, 2011.
# Jan-Christoph Borchardt <JanCBorchardt@fsfe.org>, 2011.
+# Jan-Christoph Borchardt <jan@unhosted.org>, 2011.
# <kyoo@kyoo.ch>, 2011.
# <mediagoblin.org@samba-tng.org>, 2011.
# Rafael Maguiña <rafael.maguina@gmail.com>, 2011.
@@ -15,8 +17,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: German (http://www.transifex.net/projects/p/mediagoblin/team/de/)\n"
"MIME-Version: 1.0\n"
@@ -26,134 +28,193 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Benutzername"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Passwort"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Passwörter müssen übereinstimmen."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Passwort wiederholen"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Hier nochmal eintragen, um Tippfehler zu verhindern."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
-msgstr "Email-Adresse"
+msgstr "E-Mail-Adresse"
#: mediagoblin/auth/views.py:55
msgid "Sorry, registration is disabled on this instance."
-msgstr "Registrierung ist auf dieser Instanz leider deaktiviert."
+msgstr "Das Registrieren ist auf dieser Instanz leider deaktiviert."
#: mediagoblin/auth/views.py:73
msgid "Sorry, a user with that name already exists."
msgstr "Leider gibt es bereits einen Benutzer mit diesem Namen."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Tut und Leid, aber diese Email-Adresse wird bereits verwendet."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Leider gibt es bereits einen Benutzer mit dieser E-Mail-Adresse."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-"Deine Email-Adresse wurde bestätigt. Du kannst dich nun anmelden, Dein "
+"Deine E-Mail-Adresse wurde bestätigt. Du kannst dich nun anmelden, Dein "
"Profil bearbeiten und Bilder hochladen!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
-msgstr "Der Bestätigungssschlüssel oder die Nutzernummer ist falsch."
+msgstr "Der Bestätigungsschlüssel oder die Nutzernummer ist falsch."
+
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "Du musst angemeldet sein, damit wir wissen, wer die Email bekommt."
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Deine E-Mail-Adresse wurde bereits bestätigt."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
-msgstr "Bestätigungs-Email wurde erneut versandt."
+msgstr "Bestätigungs-E-Mail wurde erneut versandt."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
-"Konnte Email zur Wiederherstellung des Passworts nicht senden, weil dein "
-"Benutzername inaktiv oder deine Email-Adresse noch nicht verifiziert ist."
+"E-Mail zur Wiederherstellung des Passworts konnte nicht gesendet werden, "
+"weil dein Benutzername inaktiv oder deine E-Mail-Adresse noch nicht "
+"verifiziert ist."
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Beschreibung des Werkes"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Markierungen"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Kurztitel"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Bitte gib einen Kurztitel ein"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"Der Titelteil der Medienadresse. Normalerweise muss hier nichts geändert "
-"werden."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biographie"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Webseite"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Altes Passwort"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Diesen Kurztitel hast du bereits vergeben."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Du bearbeitest die Medien eines Anderen. Bitte sei vorsichtig."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Du bearbeitest das Profil eines Anderen. Bitte sei vorsichtig."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Falsches Passwort"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Datei"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Beschreibung des Werkes"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Du musst eine Datei angeben."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Diese Datei scheint kein Bild zu sein!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Yeeeaaah! Geschafft!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Bild eines angespannten Goblins"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Hoppla!"
@@ -169,33 +230,30 @@ msgstr ""
"Wenn du sicher bist, dass die Adresse stimmt, wurde die Seite eventuell "
"verschoben oder gelöscht."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Bild eines angespannten Goblins"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin-Logo"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Medien hochladen"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Medien hinzufügen"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Bitte bestätige deine E-Mail-Adresse!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Bitte bestätige deine Email-Adresse!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "Abmelden"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Anmelden"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -207,93 +265,57 @@ msgstr ""
msgid "Explore"
msgstr "Entdecke"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Hallo Medien-Liebhaber! MediaGoblin ist …"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Hallo du, willkommen auf dieser MediaGoblin-Seite!"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Der perfekte Platz für deine Medien!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Ein Platz für Zusammenarbeit und um Originale und abgeleitete Werke zu "
-"präsentieren!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Frei, wie in Freiheit. (Wir sind schließlich ein <a "
-"href=\"http://gnu.org\">GNU</a>-Projekt.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Weltverbesserer durch Dezentralisierung und (hoffentlich bald!) unabhängige "
-"Kommunikation!"
+"Diese Seite läuft mit <a href=\"http://mediagoblin.org\">MediaGoblin</a>, "
+"einer großartigen Software für Medienhosting."
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Gebaut für Erweiterungen. (Bald mit Unterstützung für verschiedene "
-"Medientypen inklusive Videos!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Betrieben von Leuten wie dir. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Du kannst uns dabei helfen, "
-"die Software zu verbessern!</a>)"
+"Melde dich mit deinem MediaGoblin-Konto an, um eigene Medien hinzuzufügen, "
+"zu kommentieren, Favoriten zu speichern und mehr."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Neugierig dich uns anzuschliessen?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Hast du noch keinen? Das geht ganz einfach!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Gratis ein Konto einrichten</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">MediaGoblin auf deinem eigenen Server einrichten</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Neuste Medien"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Neues Passwort eingeben"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Benutzername oder Email-Adresse eingeben"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Dein Passwort wurde geändert. Versuche dich jetzt einzuloggen."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Passwort wiederherstellen"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Prüfe deinen Posteingang. Wir haben dir eine Email geschickt mit einer URL, "
-"um dein Passwort zu ändern."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Anleitung senden"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -314,33 +336,29 @@ msgstr ""
"\n"
"%(verification_url)s\n"
"\n"
-"Wenn du denkst, dass das ein Fehler ist, ignoriere einfach diese Email und bleib ein glücklicher Goblin!"
+"Wenn du denkst, dass das ein Fehler ist, ignoriere einfach diese E-Mail und bleib ein glücklicher Goblin!"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "Anmeldevorgang fehlgeschlagen!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Hast du noch kein Konto?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Registriere dich hier!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Wechsle es!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Neues Konto registrieren!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Registrieren"
@@ -356,7 +374,7 @@ msgid ""
msgstr ""
"Hallo %(username)s,\n"
"\n"
-"um dein Konto bei GNU MediaGoblin zu aktivieren, musst du folgende Adresse in einem Webbrowser öffnen:\n"
+"um dein Konto bei GNU MediaGoblin zu aktivieren, musst du folgende Adresse in deinem Webbrowser öffnen:\n"
"\n"
"%(verification_url)s"
@@ -371,36 +389,114 @@ msgid "Cancel"
msgstr "Abbrechen"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Änderungen speichern"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "%(username)ss Profil bearbeiten"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Medien markiert mit:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Medien markiert mit: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Original"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Medien hochladen"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Bestätigen"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "%(username)ss Medien"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>s Medien"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Dieser Benutzer wurde leider nicht gefunden."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Löschen"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "bei"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -434,31 +530,41 @@ msgstr "Keine Medien in Bearbeitung"
msgid "These uploads failed to process:"
msgstr "Die folgenden Uploads sind fehlgeschlagen:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)ss Profil"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Dieser Benutzer konnte leider nicht gefunden werden."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr "Email-Bestätigung benötigt"
+msgstr "E-Mail-Bestätigung benötigt"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Fast fertig! Dein Konto muss noch freigeschaltet werden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
-"Gleich solltest du eine Email bekommen, die dir sagt, was du noch machen "
-"musst."
+"Gleich solltest du eine E-Mail erhalten, die dir erklärt, was du noch machen"
+" musst."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Wenn sie nicht ankommt:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Bestätigung erneut senden"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -466,7 +572,7 @@ msgstr ""
"Jemand hat bereits ein Konto mit diesem Benutzernamen registriert, aber es "
"muss noch aktiviert werden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -476,40 +582,36 @@ msgstr ""
" kannst du dich <a href=\"%(login_url)s\">anmelden</a> und sie erneut "
"senden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)ss Profil"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Hier kannst du Anderen etwas über dich erzählen."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Profil bearbeiten"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Dieser Benutzer hat (noch) keine Daten in seinem Profil."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Alle Medien von %(username)s anschauen"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "Hier erscheinen deine Medien. Sobald du etwas hochgeladen hast."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Medien hinzufügen"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Scheinbar gibt es hier noch nichts …"
@@ -521,31 +623,59 @@ msgstr "Feed-Symbol"
msgid "Atom feed"
msgstr "Atom-Feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Neuere"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Zu Seite:"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Ältere"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Kommentar"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Ja, wirklich löschen"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Ohh, der Kommentar war leer."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Dein Kommentar wurde gesendet!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Du hast das Medium gelöscht."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"Das Medium wurde nicht gelöscht. Du musst ankreuzen, dass du es wirklich "
+"löschen möchtest."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Du versuchst Medien eines anderen Nutzers zu löschen. Sei vorsichtig."
diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
index 5e1401f6..3584cd4f 100644
--- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
@@ -1,14 +1,14 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,27 +17,19 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
-msgid "Username"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
-msgid "Password"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
msgstr ""
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
+msgid "Username"
msgstr ""
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
+msgid "Password"
msgstr ""
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr ""
@@ -50,94 +42,164 @@ msgid "Sorry, a user with that name already exists."
msgstr ""
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
+msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your "
"profile, and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid "An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or "
"your account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr ""
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
-msgid "The title part of this media's URL. You usually don't need to change this."
+#: mediagoblin/edit/forms.py:39
+msgid ""
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/submit/forms.py:25
-msgid "File"
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
msgstr ""
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
msgstr ""
-#: mediagoblin/submit/views.py:46
-msgid "You must provide a file."
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
+#: mediagoblin/submit/forms.py:25
+msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:50
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr ""
@@ -151,33 +213,30 @@ msgid ""
"has been moved or deleted."
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:47
-msgid "MediaGoblin logo"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -187,78 +246,55 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, "
+"an extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you"
+" can log in with your MediaGoblin account."
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project,"
-" after all.)"
+msgid "Don't have one yet? It's easy!"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the "
-"software, including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve "
-"this software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a "
-"free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" "
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an "
+"account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" "
"href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on "
"your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid "Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -279,27 +315,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr ""
@@ -325,35 +357,113 @@ msgid "Cancel"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
+msgid "Add your media"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
+msgid "Add"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> "
+"for formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
@@ -385,74 +495,80 @@ msgstr ""
msgid "These uploads failed to process:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid "An email should arrive in a few moments with instructions on how to do so."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to"
" be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can "
"<a href=\"%(login_url)s\">log in</a> and resend it."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
@@ -464,31 +580,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
index c537c65e..d0c5f2bf 100644
--- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
index f6bb1cce..6536f4d5 100644
--- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -21,27 +21,19 @@ msgstr ""
"Language: eo\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "La provizita dosiero ne konformas al la informtipo."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Uzantnomo"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Pasvorto"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Pasvortoj devas esti egalaj."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Retajpu pasvorton"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Retajpu Äin por certigi, ke ne okazis mistajpoj."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "RetpoÅtadreso"
@@ -54,10 +46,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "BedaÅ­rinde, uzanto kun tiu nomo jam ekzistas."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Tiu retpoÅtadreso jam estas uzata."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Ni bedaÅ­ras, sed konto kun tiu retpoÅtadreso jam ekzistas."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -65,15 +57,28 @@ msgstr ""
"Via retpoÅtadreso estas konfirmita. Vi povas nun ensaluti, redakti vian "
"profilon, kaj alÅuti bildojn!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "La kontrol-kodo aÅ­ la uzantonomo ne estas korekta"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "Vi devas esti ensalutita, por ke ni sciu, al kiu sendi la retleteron!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Vi jam konfirmis vian retpoÅtadreson!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Resendi vian kontrol-mesaÄon."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -81,74 +86,127 @@ msgstr ""
"Ni ne povas sendi pasvortsavan retleteron, ĉar aŭ via konto estas neaktiva, "
"aÅ­ Äia retpoÅtadreso ne estis konfirmita."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titolo"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Priskribo de ĉi tiu verko"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Etikedoj"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "La distingiga adresparto"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "La distingiga adresparto ne povas esti malplena"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"La parto de la dosieradreso, bazita sur la dosiertitolo. Ordinare ne necesas"
-" Äin ÅanÄi."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Retejo"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "La malnova pasvorto"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Ĉi tiu uzanto jam havas dosieron kun tiu distingiga adresparto."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Vi priredaktas dosieron de alia uzanto. Agu singardeme."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Vi redaktas profilon de alia uzanto. Agu singardeme."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "La provizita dosiero ne konformas al la informtipo."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "MalÄusta pasvorto"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Dosiero"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Priskribo de ĉi tiu verko"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Vi devas provizi dosieron."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "La dosiero Åajnas ne esti bildo!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Hura! AlÅutitas!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Bildo de 404-koboldo penÅvitanta."
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Oj!"
@@ -164,33 +222,30 @@ msgstr ""
"Se vi estas certa, ke la adreso estas Äusta, eble la serĉata de vi paÄo "
"estis movita aÅ­ forigita."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Bildo de 404-koboldo penÅvitanta."
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Emblemo de MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "AlÅuti aÅ­d-vid-dosieron"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Aldoni dosieron"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Konfirmu viecon de la retpoÅtadreso!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "konfirmu vian retpoÅtadreson! "
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "elsaluti"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Ensaluti"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -200,93 +255,60 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:24
msgid "Explore"
-msgstr ""
+msgstr "Ĉirkaŭrigardi"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Saluton, artemulo! MediaGoblin estas…"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Saluton, kaj bonvenon al ĉi tiu MediaGoblina retpaÄaro!"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "La perfekta loko por viaj aÅ­d-vid-dosieroj!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Loko, kie homoj povas kunlabori, kaj elmeti originalajn kreaĵojn kaj "
-"derivaĵojn!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Libera verko. (Ni ja estas projekto de <a href=\"http://gnu.org\">GNU</a>.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Celanta plibonigi la mondon per sencentreco kaj (iam, baldaÅ­!) federateco!"
+"Ĉi tiu retpaÄaro funkcias per <a "
+"href=\"http://mediagoblin.org\">MediaGoblin</a>, eksterordinare bonega "
+"programaro por gastigado de aÅ­dâ€vidâ€dosieroj."
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Kreita por etendado. (BaldaÅ­ en la programo aperos subteno de pluraj "
-"informspecoj, inkluzive de filmoj!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Vivanta per homoj kiel vi. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Vi povas helpi al ni "
-"plibonigi la programon!</a>)"
+"Por aldoni viajn proprajn dosierojn, fari al vi liston de la plej plaĉaj, "
+"ks, vi povas ensaluti je via MediaGoblina konto."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Ĉu vi deziregas aliÄi nin?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Ĉu vi ankoraÅ­ ne havas tian? Ne malÄoju!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Kreu senpagan"
-" konton</a>⎠aŭ⎠<a class=\"header_submit\" "
-"href=\"http://wiki.mediagoblin.org/HackingHowto\">Kreu senpagan konton</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
-msgstr "Plej nove aldonitaj dosieroj"
+msgstr "Laste aldonitaj dosieroj"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Enigu vian novan pasvorton"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Enigu vian salutnomon aÅ­ retpoÅtadreson"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Via pasvorto estis ÅanÄita. Nun provu ensaluti."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Ekhavo de nova pasvorto"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Kontrolu vian retleterujon. Ni sendis retleteron kun retadreso por ÅanÄo de "
-"via pasvorto."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Sendi instrukcion"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -313,27 +335,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Ensaluto malsukcesis!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Ĉu ankoraŭ sen konto?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Kreu Äin ĉi tie!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Ĉu vi forgesis vian pasvorton?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "ÅœanÄu Äin!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Kreu konton!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Krei"
@@ -364,36 +382,114 @@ msgid "Cancel"
msgstr "Nuligi"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Konservi ÅanÄojn"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Redaktado de l’profilo de %(username)s'"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Dosieroj markitaj per:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Dosieroj kun etikedo: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Originalo"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "AlÅutu vian aÅ­d-vid-dosieron"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "AlÅuti"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Dosieroj de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Dosieroj de <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Uzanto ne trovita."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "ÅœanÄi"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Forigi"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "je"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -427,30 +523,40 @@ msgstr "Neniu dosieroj preparatas"
msgid "These uploads failed to process:"
msgstr "Preparado de ĉi tiuj alÅutaĵoj malsukcesis:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profilo de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Uzanto ne trovita."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Necesas konfirmo de retpoÅtadreso"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "PreskaÅ­ finite! Restas nur validigi vian konton."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Post kelkaj momentoj devas veni retletero kun instrukcio pri kiel tion fari."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Se tio ne okazas:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Resendi kontrolmesaÄon"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -458,7 +564,7 @@ msgstr ""
"Iu registris konton kun tiu ĉi uzantonomo, sed Äi devas ankoraÅ­ esti "
"aktivigita."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -467,41 +573,37 @@ msgstr ""
"Se vi estas tiu sed vi perdis vian kontrolmesaÄon, vi povas <a "
"href=\"%(login_url)s\">ensaluti</a> kaj resendi Äin."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profilo de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Jen estas spaceto por rakonti pri vi al aliaj."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Redakti profilon"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Ĉi tiu uzanto ne jam aldonis informojn pri si."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Rigardi ĉiujn dosierojn de %(username)s'"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
"Äœuste ĉi tie aperos viaj dosieroj, sed vi Åajne ankoraÅ­ nenion alÅutis."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Aldoni dosieron"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Ĉi tie Åajne estas ankoraÅ­ neniuj dosieroj…"
@@ -513,31 +615,59 @@ msgstr "flusimbolo"
msgid "Atom feed"
msgstr "Atom-a informfluo"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Plinovaj"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Malplinovaj"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Komento"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Iri al paÄo:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Mi estas certa, ke mi volas forigi ĉi tion"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Oj, via komento estis malplena."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Via komento estis afiÅita!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Vi forigis la dosieron."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"La dosiero ne estis forigita, ĉar vi ne konfirmis vian certecon per la "
+"markilo."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Vi estas forigonta dosieron de alia uzanto. Estu singardema."
diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
index 2d2b9243..b9f8eeed 100644
--- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
index a3c9939b..ab8c6b3f 100644
--- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -10,12 +10,13 @@
# <juangsub@gmail.com>, 2011.
# <juanma@kde.org.ar>, 2011.
# Mario Rodriguez <msrodriguez00@gmail.com>, 2011.
+# <mu@member.fsf.org>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mediagoblin/team/es/)\n"
"MIME-Version: 1.0\n"
@@ -25,28 +26,19 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Archivo inválido para el formato seleccionado."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nombre de usuario"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Contraseña"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Las contraseñas deben coincidir."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Confirma tu contraseña"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-"Escriba de nuevo aquí para asegurarse de que no hay faltas de ortografía."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Dirección de correo electrónico"
@@ -59,10 +51,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Lo sentimos, ya existe un usuario con ese nombre."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Lo sentimos, esa dirección de correo electrónico ya ha sido tomada."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Lo sentimos, ya existe un usuario con esa dirección de email."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -70,16 +62,31 @@ msgstr ""
"Tu dirección de correo electrónico ha sido verificada. ¡Ahora puedes "
"ingresar, editar tu perfil, y enviar imágenes!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
"La clave de verificación o la identificación de usuario son incorrectas"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"¡Debes iniciar sesión para que podamos saber a quién le enviamos el correo "
+"electrónico!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "¡Ya has verificado tu dirección de correo!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Se reenvió tu correo electrónico de verificación."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -88,76 +95,129 @@ msgstr ""
"porque su nombre de usuario está inactivo o la dirección de su cuenta de "
"correo electrónico no ha sido verificada."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Título"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Descripción de esta obra"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Etiquetas"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Ficha"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "La ficha no puede estar vacía"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"La parte del título de la URL de este contenido. Normalmente no necesitas "
-"cambiar esto."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Sitio web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Vieja contraseña"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Una entrada con esa ficha ya existe para este usuario."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Estás editando el contenido de otro usuario. Proceder con precaución."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Estás editando un perfil de usuario. Proceder con precaución."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Archivo inválido para el formato seleccionado."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Contraseña incorrecta"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Archivo"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Descripción de esta obra"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Debes proporcionar un archivo."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "¡El archivo no parece ser una imagen!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
-msgstr "¡Woohoo! ¡Enviado!"
+msgstr "¡Yujú! ¡Enviado!"
+
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Imagen de 404 goblin estresándose"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
-msgstr "Ups!"
+msgstr "¡Ups!"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
@@ -171,33 +231,30 @@ msgstr ""
"Si estás seguro que la dirección es correcta, puede ser que la pagina haya "
"sido movida o borrada."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Imagen de 404 goblin estresándose"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Logo de MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Enviar contenido"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Añadir contenido"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "¡Verifica tu email!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "¡Verifica tu correo electrónico!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "Cerrar sesión"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Conectarse"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -209,93 +266,58 @@ msgstr ""
msgid "Explore"
msgstr "Explorar"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "¡Hola, amante de los contenidos! MediaGoblin es ..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "¡El lugar ideal para tus contenidos!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Hola, ¡bienvenido a este sitio de MediaGoblin!"
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"¡Un lugar para colaborar y exhibir tus creaciones originales y derivadas!"
+"Este sitio está montado con <a "
+"href=\"http://mediagoblin.org\">MediaGoblin</a>, un programa libre buenísimo"
+" para gestionar contenido multimedia."
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Libre, como en la libertad. (Somos parte del proyecto <a "
-"href=\"http://gnu.org\">GNU</a> después de todo.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Queriendo hacer del mundo un mejor lugar a través de la descentralización y "
-"(eventualmente, muy pronto!) la federalización!"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Pensado para ser extensible. (Prontamente soporte para multiples formatos, "
-"incluyendo video!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Impulsado por gente como vos. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\"> Vos podés ayudarnos a "
-"mejorar este programa</a>)"
+"Para añadir tus propios contenidos, dejar comentarios, guardar tus favoritos"
+" y más, puedes iniciar sesión con tu cuenta de MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Te gustaría unirte a nosotros?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "¿Aún no tienes una? ¡Es fácil!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Crea una "
-"cuenta gratuita</a> o <a class=\"header_submit\" "
-"href=\"http://wiki.mediagoblin.org/HackingHowto\">Establece MediaGoblin en "
-"tu propio servidor</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "El contenido más reciente"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Ingrese su nueva contraseña"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Introduzca su nombre de usuario o correo electrónico"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Se cambió tu contraseña. Intenta iniciar sesión ahora."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Recuperar contraseña"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Revisa tu bandeja de entrada. Te enviamos un correo electrónico con una URL "
-"para cambiar tu contraseña."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Enviar instrucciones"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -310,36 +332,35 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
-"Hola %(username)s , para cambiar su contraseña de GNU MediaGoblin, abra la "
-"siguiente URL en su navegador: %(verification_url)s Si usted piensa que "
-"esto es un error, simplemente ignore este mensaje y siga siendo un duende "
-"feliz!"
+"Hola %(username)s,\n"
+"\n"
+"Para cambiar tu contraseña de GNU MediaGoblin, abre la siguiente URL en un navegador:\n"
+"\n"
+"%(verification_url)s \n"
+"\n"
+"Si piensas que esto es un error, simplemente ignora este mensaje y sigue siendo un trasgo feliz."
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "¡Falló el inicio de sesión!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "¿No tienes una cuenta?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "¡Crea una aquí!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "¿Olvidaste tu contraseña?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Cambiarlo!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "¡Crea una cuenta!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Crear"
@@ -362,7 +383,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:29
#, python-format
msgid "Editing %(media_title)s"
-msgstr "Edición %(media_title)s "
+msgstr "Editando %(media_title)s "
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
@@ -370,41 +391,119 @@ msgid "Cancel"
msgstr "Cancelar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Guardar cambios"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Editando el perfil de %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Contenido etiquetado con:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Contenido etiquetado con: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Original"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Envía tu contenido"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Enviar"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Contenidos de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Contenido de <a href=\"%(user_url)s\">%(username)s</a>'s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Lo sentimos, no se encontró ese usuario."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Editar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Borrar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "en"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr "Realmente deseas eliminar %(title)s ?"
+msgstr "¿Realmente deseas eliminar %(title)s?"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
msgid "Delete Permanently"
@@ -433,31 +532,41 @@ msgstr "No hay contenido siendo procesado."
msgid "These uploads failed to process:"
msgstr "Estos archivos no pudieron ser procesados:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Perfil de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Lo sentimos, no se encontró ese usuario."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Es necesario un correo electrónico de verificación"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
-msgstr "Casi terminas! Solo falta activar la cuenta."
+msgstr "¡Casi hemos terminado! Solo falta activar la cuenta."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"En unos momentos te debería llegar un correo electrónico con las "
"instrucciones para hacerlo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "En caso de que no:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Reenviar correo electrónico de verificación"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -465,7 +574,7 @@ msgstr ""
"Alguien ya registró una cuenta con ese nombre de usuario, pero todavía no "
"fue activada."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -474,41 +583,37 @@ msgstr ""
"Si tú eres esa persona, pero has perdido tu correo electrónico de "
"verificación, puedes <a href=\"%(login_url)s\">acceder</a> y reenviarlo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Perfil de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Aquí hay un lugar para que le cuentes a los demás sobre tí."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Editar perfil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Este usuario (todavia) no ha completado su perfil."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Ver todo el contenido de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
"Aquí es donde tú contenido estará, pero parece que aún no has agregado nada."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Añadir contenido"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Parece que aún no hay ningún contenido aquí..."
@@ -520,31 +625,57 @@ msgstr "ícono feed"
msgid "Atom feed"
msgstr "Atom feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Recientes"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Antiguas"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Comentario"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Ir a la página:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Estoy seguro de que quiero borrar esto"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Ups, tu comentario estaba vacío."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "¡Tu comentario ha sido publicado!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Eliminaste el contenido"
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "El contenido no se eliminó porque no marcaste que estabas seguro."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Estás a punto de eliminar un contenido de otro usuario. Proceder con "
diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
index eaa18426..b805cca5 100644
--- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
index 16939306..ba5c639d 100644
--- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
@@ -3,6 +3,8 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# <a5565930@nepwk.com>, 2011.
+# <chesuidayeur@yahoo.fr>, 2011.
# <joehillen@gmail.com>, 2011.
# <marktraceur@gmail.com>, 2011.
# <maxineb@members.fsf.org>, 2011.
@@ -12,9 +14,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
-"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"POT-Creation-Date: 2011-12-04 10:24-0600\n"
+"PO-Revision-Date: 2011-12-29 17:39+0000\n"
+"Last-Translator: ianux <a5565930@nepwk.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,6 +25,10 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Le fichier envoyé ne correspond pas au type de média."
+
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Nom d'utilisateur"
@@ -42,7 +48,7 @@ msgstr "Confirmer le mot de passe"
#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
-"Tapez-le à nouveau ici pour vous assurer qu'il n'ya pas de fautes "
+"Tapez-le à nouveau ici pour vous assurer qu'il n'y a pas de fautes "
"d'orthographe."
#: mediagoblin/auth/forms.py:42
@@ -58,8 +64,8 @@ msgid "Sorry, a user with that name already exists."
msgstr "Un utilisateur existe déjà avec ce nom, désolé."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Désolé, cette adresse courriel a déjà été prise."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Désolé, il existe déjà un utilisateur ayant cette adresse e-mail."
#: mediagoblin/auth/views.py:179
msgid ""
@@ -73,15 +79,26 @@ msgstr ""
msgid "The verification key or user id is incorrect"
msgstr "La clé de vérification ou le nom d'utilisateur est incorrect."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:203
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"Vous devez être authentifié afin que nous sachions à qui envoyer l'e-mail !"
+
+#: mediagoblin/auth/views.py:211
+msgid "You've already verified your email address!"
+msgstr "Votre adresse e-mail a déjà été vérifiée !"
+
+#: mediagoblin/auth/views.py:224
msgid "Resent your verification email."
msgstr "E-mail de vérification renvoyé."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:265
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+"Impossible d'envoyer un email de récupération de mot de passe : votre compte"
+" est inactif ou bien l'email de votre compte n'a pas été vérifiée."
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
@@ -91,46 +108,68 @@ msgstr "Titre"
msgid "Tags"
msgstr "Tags"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34
+msgid "Seperate tags by commas."
+msgstr "Séparez les tags par des virgules."
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Légende"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "La légende ne peut pas être laissée vide."
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:35
msgid ""
"The title part of this media's URL. You usually don't need to change this."
msgstr ""
+"Le nom de ce media dans l'URL. Vous n'avez normalement pas besoin de le "
+"changer"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Site web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:49
+msgid "Old password"
+msgstr "Ancien mot de passe."
+
+#: mediagoblin/edit/forms.py:52
+msgid "New Password"
+msgstr "Nouveau mot de passe"
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Une entrée existe déjà pour cet utilisateur avec la même légende."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
"Vous vous apprêtez à modifier le média d'un autre utilisateur. Veuillez "
"prendre garde."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
"Vous vous apprêtez à modifier le profil d'un utilisateur. Veuillez prendre "
"garde."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Invalide fichier donné pour le type de média."
+#: mediagoblin/edit/views.py:171
+msgid "Wrong password"
+msgstr "Mauvais mot de passe"
+
+#: mediagoblin/edit/views.py:192
+msgid "Profile edited!"
+msgstr "Profile mis à jour !"
+
+#: mediagoblin/media_types/__init__.py:65
+msgid "Could not find any file extension in \"{filename}\""
+msgstr "Impossible d'extraire une extension de fichier de \"{nomfichier}\""
#: mediagoblin/submit/forms.py:25
msgid "File"
@@ -138,27 +177,27 @@ msgstr "Fichier"
#: mediagoblin/submit/forms.py:30
msgid "Description of this work"
-msgstr ""
+msgstr "Descriptif pour ce travail"
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:49
msgid "You must provide a file."
msgstr "Il vous faut fournir un fichier."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Ce fichier ne semble pas être une image !"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:127
msgid "Woohoo! Submitted!"
msgstr "Youhou, c'est envoyé !"
+#: mediagoblin/submit/views.py:133
+msgid "Invalid file type."
+msgstr "Type de fichier invalide."
+
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
-msgstr "Zut!"
+msgstr "Zut !"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr "Il ne semble pas être une page à cette adresse. Désolé!"
+msgstr "Il ne semble pas y avoir de page à cette adresse. Désolé !"
#: mediagoblin/templates/mediagoblin/404.html:26
msgid ""
@@ -166,128 +205,113 @@ msgid ""
" been moved or deleted."
msgstr ""
"Si vous êtes sûr que l'adresse est correcte, peut-être la page que vous "
-"recherchez a été déplacé ou supprimé."
+"recherchez a été déplacée ou supprimée."
#: mediagoblin/templates/mediagoblin/404.html:32
msgid "Image of 404 goblin stressing out"
-msgstr "Image de 404 gobelin stresser"
+msgstr "Image de 404 gobelin angoissé"
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:49
msgid "MediaGoblin logo"
msgstr "Logo MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
+#: mediagoblin/templates/mediagoblin/base.html:54
msgid "Submit media"
msgstr "Soumettre un média"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "vérifiez votre adresse e-mail !"
+#: mediagoblin/templates/mediagoblin/base.html:65
+msgid "Verify your email!"
+msgstr "Vérifiez votre adresse e-mail !"
+
+#: mediagoblin/templates/mediagoblin/base.html:72
+msgid "log out"
+msgstr "déconnexion"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "S'identifier"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:91
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
-"Propulsé par <a href=\"http://mediagoblin.org\">MediaGoblin</a> , un <a "
-"href=\"http://gnu.org/\">GNU</a> de projet"
+"Propulsé par <a href=\"http://mediagoblin.org\">MediaGoblin</a> , un projet "
+"<a href=\"http://gnu.org/\">GNU</a>"
#: mediagoblin/templates/mediagoblin/root.html:24
msgid "Explore"
-msgstr ""
+msgstr "Explorer"
#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Salut à tous, amateur de médias! MediaGoblin est ..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "L'endroit idéal pour vos médias!"
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Bonjour, et bienvenu sur ce site MediaGoblin !"
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Un lieu pour les personnes de collaborer et de montrer des créations "
-"originales et dérivées!"
+"Ce site fait tourner <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un "
+"logiciel d'hébergement de média extraordinairement génial."
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Logiciel libre. (Nous sommes une <a href=\"http://gnu.org\">GNU</a> projet, "
-"après tout.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Visant à rendre le monde meilleur grâce à la décentralisation et "
-"(éventuellement, venir bientôt!) fédération!"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Construit pour l'extensibilité. (Plusieurs types de médias à venir au "
-"logiciel, y compris le support vidéo!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Propulsé par des gens comme vous. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Vous pouvez nous aider à "
-"améliorer ce logiciel!</a>)"
+"Ajoutez vos propres medias, commentez ceux des autres, sauvegardez vos "
+"préférés et plus encore ! Faites tout cela depuis votre compte MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Vous n'en avez pas ? C'est facile !"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Créez un compte sur ce site</a>\n"
+" ou\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Déployez MediaGoblin sur votre propre serveur</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:44
msgid "Most recent media"
-msgstr ""
+msgstr "Tout derniers media"
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
msgid "Enter your new password"
-msgstr ""
+msgstr "Entrez un nouveau mot de passe"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Submit"
+msgstr "Soumettre"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Récupérer le mot de passe"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Envoyer les instructions"
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
msgid "Your password has been changed. Try to log in now."
msgstr ""
+"Votre mot de passe a été changé. Essayez maintenant de vous identifier."
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
msgid ""
"Check your inbox. We sent an email with a URL for changing your password."
msgstr ""
+"Verifiez votre boîte de réception. Nous vous avons envoyé un email avec une "
+"URL vous permettant de changer votre mot de passe."
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -302,30 +326,35 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
+"Bonjour %(username)s,\n"
+"\n"
+"Pour changer votre mot de passe GNU MediaGoblin, ouvrez l'URL suivante dans \n"
+"votre navigateur internet :\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"Si vous pensez qu'il s'agit d'une erreur, ignorez simplement cet email et restez\n"
+"un goblin heureux !"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
-msgstr "Connexion a échoué!"
+msgstr "La connexion a échoué!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
-msgstr "Pas encore de compte?"
+msgstr "Pas encore de compte ?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
-msgstr "Créez-en un ici!"
+msgstr "Créez-en un ici !"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
+msgstr "Vous avez oublié votre mot de passe ?"
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
-msgstr "Créer un compte!"
+msgstr "Créer un compte !"
#: mediagoblin/templates/mediagoblin/auth/register.html:31
msgid "Create"
@@ -367,27 +396,54 @@ msgstr "Enregistrer les modifications"
msgid "Editing %(username)s's profile"
msgstr "Modification du profil de %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Média comportant les tags suivants :"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Médias taggés avec : %(tag_name)s "
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:19
+msgid "Original"
+msgstr "Original"
#: mediagoblin/templates/mediagoblin/submit/start.html:26
msgid "Submit yer media"
msgstr "Soumettez ce média"
-#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Soumettre"
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Medias de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Médias de <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Impossible de trouver cet utilisateur, désolé."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:57
+#, python-format
+msgid "By <a href=\"%(user_url)s\">%(username)s</a> on %(date)s"
+msgstr "Par <a href=\"%(user_url)s\">%(username)s</a> le %(date)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:67
+msgid "Post a comment"
+msgstr "Poster un commentaire"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:85
+msgid "at"
+msgstr "à"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
+msgid "Post comment!"
+msgstr "Poster le commentaire !"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:124
+msgid "Edit"
+msgstr "Éditer"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:130
+msgid "Delete"
+msgstr "Effacer"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -396,7 +452,7 @@ msgstr "Voulez-vous vraiment supprimer %(title)s ?"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
msgid "Delete Permanently"
-msgstr ""
+msgstr "Supprimer définitivement"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
@@ -419,33 +475,43 @@ msgstr "Aucun média en transformation"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
-msgstr "Ces ajouts n'etaient pas processé:"
+msgstr "Le traitement de ces ajouts a échoué :"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "profil de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Impossible de trouver cet utilisateur, désolé."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Vérification d'email nécessaire"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
-msgstr "Presque fini! Votre compte a encore besoin d'être activé."
+msgstr "Presque fini ! Votre compte a encore besoin d'être activé."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Un e-mail devrait vous parvenir dans quelques instants ; il vous indiquera "
"comment procéder."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Si la vérification n'est pas arrivée à bon port :"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Renvoyer l'e-mail de vérification"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -453,7 +519,7 @@ msgstr ""
"Quelqu'un a enregistré un compte avec ce nom, mais il doit encore être "
"activé."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -463,48 +529,43 @@ msgstr ""
"vérification, vous pouvez vous <a href=\"%(login_url)s\">identifier</a> et "
"le renvoyer."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "profil de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Voici un endroit pour parler aux autres de vous-même."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:119
msgid "Edit profile"
msgstr "Modifier le profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:107
msgid "This user hasn't filled in their profile (yet)."
-msgstr "Cet utilisateur n'a pas rempli leur profil (encore)."
+msgstr "Cet utilisateur n'a pas (encore) rempli son profil."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:133
#, python-format
msgid "View all of %(username)s's media"
msgstr "Voir tous les médias de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:146
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-"C'est là où vos médias apparaît, mais vous ne semblez pas avoir quoi que ce "
-"soit encore ajouté."
+"C'est là où vos médias apparaîssent, mais vous ne semblez pas avoir encore "
+"ajouté quoi que ce soit."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:152
msgid "Add media"
msgstr "Ajouter des médias"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:158
msgid "There doesn't seem to be any media here yet..."
-msgstr "Il ne semble pas être un média encore là ..."
+msgstr "Il ne semble pas y avoir de média là, pour l'instant ..."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
-msgstr "icon de flux"
+msgstr "icone de flux"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
@@ -512,11 +573,23 @@ msgstr "flux Atom"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
msgid "Newer"
-msgstr ""
+msgstr "Nouveaux"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
msgid "Older"
-msgstr ""
+msgstr "Anciens"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:50
+msgid "Go to page:"
+msgstr "Aller à la page :"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "Tagged with"
+msgstr "Taggé avec"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "and"
+msgstr "et"
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
@@ -524,17 +597,27 @@ msgstr "Commentaire"
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
-msgstr ""
+msgstr "Je suis sûr de vouloir supprimer cela"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Oups, votre commentaire était vide."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Votre commentaire a été posté !"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Vous avez supprimé le media."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"Ce media n'a pas été supprimé car vous n'avez pas confirmer que vous étiez "
+"sur."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Vous êtes sur le point de supprimer des médias d'un autre utilisateur. "
diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
index feb156ff..94b378d2 100644
--- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
index d9fdf8d6..56f74573 100644
--- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: ia\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nomine de usator"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Contrasigno"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Adresse de e-posta"
@@ -52,95 +44,163 @@ msgid "Sorry, a user with that name already exists."
msgstr ""
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
+msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titulo"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Sito web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/submit/forms.py:25
-msgid "File"
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
msgstr ""
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
msgstr ""
-#: mediagoblin/submit/views.py:46
-msgid "You must provide a file."
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
+#: mediagoblin/submit/forms.py:25
+msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:50
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr ""
@@ -154,33 +214,30 @@ msgid ""
" been moved or deleted."
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:47
-msgid "MediaGoblin logo"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Initiar session"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -190,76 +247,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
+msgid "Don't have one yet? It's easy!"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -280,27 +313,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Crear un conto!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr ""
@@ -326,35 +355,113 @@ msgid "Cancel"
msgstr "Cancellar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
+msgid "Add your media"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
+msgid "Add"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
@@ -387,75 +494,81 @@ msgstr ""
msgid "These uploads failed to process:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profilo de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profilo de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
@@ -467,31 +580,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Commento"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
index cc0ccbfa..d5fb3eac 100644
--- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
index 183d09ed..6a8b8b65 100644
--- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
@@ -1,15 +1,16 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# <pikappa469@alice.it>, 2011.
# <robi@nunnisoft.ch>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +20,19 @@ msgstr ""
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "documento non valido come tipo multimediale."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nome utente"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Password"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Le password devono coincidere"
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Conferma password"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Scrivilo ancora qui per assicurarti che non ci siano errori"
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Indirizzo email"
@@ -52,10 +45,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Spiacente, esiste già un utente con quel nome"
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Spiacente, quell'indirizzo email è già stato preso."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Siamo spiacenti, un utente con quell'indirizzo email esiste già."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,88 +56,159 @@ msgstr ""
"Il tuo indirizzo email è stato verificato. Puoi ora fare login, modificare "
"il tuo profilo, e inserire immagini!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "La chiave di verifica o l'id utente è sbagliato"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"Devi entrare col tuo profilo così possiamo sapere a chi inviare l'email!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Hai già verificato il tuo indirizzo email!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Rispedisci email di verifica"
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+"Impossibile inviare l'email di recupero password perchè il tuo nome utente è"
+" inattivo o il tuo account email non è stato verificato."
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titolo"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Descrizione di questo lavoro"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Tags"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Sito web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Password vecchia"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
"Stai modificando documenti multimediale di un altro utente. Procedi con "
"attenzione."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Stai modificando il profilo di un utente. Procedi con attenzione."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "documento non valido come tipo multimediale."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Password errata"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Documento"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Descrizione di questo lavoro"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Devi specificare un documento."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Il documento non sembra essere un'immagine!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Evviva! "
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Immagine di 404 folletti che stressano"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Oops!"
@@ -160,33 +224,30 @@ msgstr ""
"Se sei sicuro che l'indirizzo è corretto, forse la pagina che stai cercando "
"è stata spostata o cancellata."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Immagine di 404 folletti che stressano"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin logo"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Inoltra file multimediale"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Aggiungi documenti multimediali"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Verifica la tua email!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "verifica il tuo indirizzo email!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "disconnettiti"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Accedi"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -198,86 +259,59 @@ msgstr ""
msgid "Explore"
msgstr "Esplora"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Ciao, amante del multimedia! MediaGoblin è..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Ciao, benvenuto a questo sito MediaGoblin!"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Il posto perfetto per i tuoi documenti multimediali!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Un posto per collaborare con altri e mostrare le proprie creazioni originali"
-" e derivate!"
+"questo sito sta utilizzando <a "
+"href=\"http://mediagoblin.org\">Mediagoblin</a>, un ottimo programma di "
+"media hosting."
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Libero, come in libertà. (Siamo un progetto <a "
-"href=\"http://gnu.org\">GNU</a>, dopotutto.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Con l'obbiettivo di rendere il mondo un posto migliore attraverso la "
-"decentrelizzazione e (finalmente, presto!) federazione!"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Fatto per estensibilità. (Numerosi tipi multimediali saranno presto aggiunti"
-" al programma, incluso il supporto video!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
+"Per aggiungere i tuoi file, scrivere commenti, salvare i tuoi preferiti e "
+"altro, devi entrare col tuo profilo MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Eccitato di unirti a noi?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Non ne hai già uno? E' semplice!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Documenti multimediali più recenti"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Inserisci la tua nuova password"
-
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Inserisci il tuo nome utente o email"
-
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Recupera Password"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Invia istruzioni"
+
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
msgid ""
@@ -291,32 +325,36 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
+"Ciao %(username)s,\n"
+"per cambiare la tua password MediaGoblin apri il seguente URL\n"
+"nel tuo web browser:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"Se pensi che sia un errore, ignora semplicemente questa email e continua ad essere \n"
+"un goblin felice!"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "Accesso fallito!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Non hai ancora un account?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Creane uno qui!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Hai dimenticato la password?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Crea un account!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Crea"
@@ -347,36 +385,114 @@ msgid "Cancel"
msgstr "Annulla"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Salva i cambiamenti"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Stai modificando il profilo di %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Media taggata con:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "file taggato con:%(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Originale"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Inoltra documento multimediale"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Conferma"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "file di %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Documenti multimediali di <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Mi dispiace, utente non trovato"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Modifica"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Elimina"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "a"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -408,30 +524,40 @@ msgstr "Nessun documento multimediale in elaborazione"
msgid "These uploads failed to process:"
msgstr "L'elaborazione di questi upload è fallita:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "profilo di %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Mi dispiace, utente non trovato"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "è necessario verificare email"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Quasi finito! Il tuo account deve ancora essere attivato."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"In breve dovresti ricevere un email contenente istruzioni su come fare."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Nel caso non fosse:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Rispedisci email di verifica"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -439,7 +565,7 @@ msgstr ""
"Qualcuno ha registrato un account con questo nome utente, ma deve ancora "
"essere attivato."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -448,30 +574,29 @@ msgstr ""
"Se sei quella persona ma hai perso l'email di verifica, puoi <a "
"href=\"%(login_url)s\">accedere</a> e rispedirlo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "profilo di %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Ecco un posto dove raccontare agli altri di te."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Modifica profilo"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Questo utente non ha (ancora) compilato il proprio profilo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Visualizza tutti i file multimediali di %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
@@ -479,11 +604,8 @@ msgstr ""
"Questo è dove i tuoi documenti multimediali appariranno, ma sembra che tu "
"non abbia ancora aggiunto niente."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Aggiungi documenti multimediali"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Non sembra ci sia ancora nessun documento multimediali qui.."
@@ -495,31 +617,58 @@ msgstr "feed icon"
msgid "Atom feed"
msgstr "Atom feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Più nuovo"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Più vecchio"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Commento"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Vai alla pagina:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Sono sicuro di volerlo cancellare"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Oops, il tuo commento era vuoto."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Il tuo commento è stato aggiunto!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Hai cancellato il file"
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"Il file non è stato eliminato perchè non hai confermato di essere sicuro."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Stai cancellando un documento multimediale di un altro utente. Procedi con "
diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
index 5267eddc..21aeed26 100644
--- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
index 59262d82..7ed8652b 100644
--- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "ユーザãƒãƒ¼ãƒ "
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "パスワード"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "パスワードãŒä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "パスワードを確èª"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "メールアドレス"
@@ -52,95 +44,163 @@ msgid "Sorry, a user with that name already exists."
msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãã®åå‰ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã™ã§ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚"
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
+msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "メアドãŒç¢ºèªã•れã¦ã„ã¾ã™ã€‚ã“れã§ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãƒ—ロファイルを編集ã—ã€ç”»åƒã‚’æå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "検証キーã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼IDãŒé–“é•ã£ã¦ã„ã¾ã™"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "検証メールをå†é€ã—ã¾ã—ãŸã€‚"
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "タイトル"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "ã‚¿ã‚°"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "スラグ"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "スラグã¯å¿…è¦ã§ã™ã€‚"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "自己紹介"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "URL"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "ãã®ã‚¹ãƒ©ã‚°ã‚’æŒã¤ã‚¨ãƒ³ãƒˆãƒªã¯ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "ã‚ãªãŸã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集ã—ã¦ã„ã¾ã™ã€‚ã”æ³¨æ„ãã ã•ã„。"
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "ã‚ãªãŸã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ—ロファイルを編集ã—ã¦ã„ã¾ã™ã€‚ã”æ³¨æ„ãã ã•ã„。"
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "ファイル"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr ""
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "ファイルをæä¾›ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "ファイルãŒç”»åƒã§ã¯ãªã„よã†ã§ã™ï¼"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "投稿終了ï¼"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr ""
@@ -154,33 +214,30 @@ msgid ""
" been moved or deleted."
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
-msgid "MediaGoblin logo"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "コンテンツを投稿"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "メアドを確èªã—ã¦ãã ã•ã„ï¼"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "ログイン"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -190,76 +247,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
+msgid "Don't have one yet? It's easy!"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -280,27 +313,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "ã¾ã ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’æŒã£ã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "ã“ã“ã§ä½œæˆï¼"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "アカウントを作æˆï¼"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr ""
@@ -331,36 +360,114 @@ msgid "Cancel"
msgstr "キャンセル"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "投稿ã™ã‚‹"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "%(username)sã•ã‚“ã®ãƒ—ロフィールを編集中"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "タグ付ã‘ã•れãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "コンテンツを投稿"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "é€ä¿¡"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>ã•ã‚“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -392,75 +499,81 @@ msgstr ""
msgid "These uploads failed to process:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)sã•ã‚“ã®ãƒ—ロフィール"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "メールã¯ã€ãã®æ–¹æ³•ã®æŒ‡ç¤ºã§ã„ãã¤ã‹ã®çž¬é–“ã«åˆ°ç€ã—ã¾ã™ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "到ç€ã—ãªã„å ´åˆã¯ã€"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "確èªãƒ¡ãƒ¼ãƒ«ã‚’å†é€ä¿¡"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr "ã‚ãªãŸã®ç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’紛失ã—ãŸå ´åˆã€<a href=\"%(login_url)s\">ログイン</a>ã—ã¦å†é€ã§ãã¾ã™ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)sã•ã‚“ã®ãƒ—ロフィール"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "プロフィールを編集"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "%(username)sã•ã‚“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’ã™ã¹ã¦è¦‹ã‚‹"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
@@ -472,31 +585,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
index e6d1976b..4d03c586 100644
--- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
index 618daf6f..7b63a859 100644
--- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
@@ -3,14 +3,14 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# <mail@jefvanschendel.nl>, 2011.
+# <mail@jefvanschendel.nl>, 2011, 2012.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
-"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"POT-Creation-Date: 2011-12-04 10:24-0600\n"
+"PO-Revision-Date: 2012-01-04 18:42+0000\n"
+"Last-Translator: schendje <mail@jefvanschendel.nl>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,6 +19,10 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Verkeerd bestandsformaat voor mediatype opgegeven."
+
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Gebruikersnaam"
@@ -37,7 +41,7 @@ msgstr "Bevestig wachtwoord"
#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
+msgstr "Typ het hier nog een keer om spelfouten te voorkomen."
#: mediagoblin/auth/forms.py:42
msgid "Email address"
@@ -52,8 +56,8 @@ msgid "Sorry, a user with that name already exists."
msgstr "Sorry, er bestaat al een gebruiker met die naam."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Sorry, dat e-mailadres is al ingenomen."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Sorry, een gebruiker met dat e-mailadres bestaat al."
#: mediagoblin/auth/views.py:179
msgid ""
@@ -67,15 +71,27 @@ msgstr ""
msgid "The verification key or user id is incorrect"
msgstr "De verificatie sleutel of gebruikers-ID is onjuist"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:203
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"Je moet ingelogd zijn, anders weten we niet waar we de e-mail naartoe moeten"
+" sturen!"
+
+#: mediagoblin/auth/views.py:211
+msgid "You've already verified your email address!"
+msgstr "Je hebt je e-mailadres al geverifieerd!"
+
+#: mediagoblin/auth/views.py:224
msgid "Resent your verification email."
msgstr "Verificatie e-mail opnieuw opgestuurd."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:265
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+"Email kon niet verstuurd worden omdat je gebruikersnaam inactief is of omdat"
+" je e-mailadres nog niet geverifieerd is."
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
@@ -85,45 +101,67 @@ msgstr "Titel"
msgid "Tags"
msgstr "Etiket"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34
+msgid "Seperate tags by commas."
+msgstr "Scheidt labels met komma's."
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
-msgstr ""
+msgstr "Slug"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
-msgstr ""
+msgstr "De slug kan niet leeg zijn"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:35
msgid ""
"The title part of this media's URL. You usually don't need to change this."
msgstr ""
+"Het titeldeel van het adres van deze media. Meestal hoef je dit niet aan te "
+"passen."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Website"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:49
+msgid "Old password"
+msgstr "Oud wachtwoord"
+
+#: mediagoblin/edit/forms.py:52
+msgid "New Password"
+msgstr "Nieuw wachtwoord"
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
-msgstr ""
+msgstr "Er bestaat al een met die slug voor deze gebruiker."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
"U bent de media van een andere gebruiker aan het aanpassen. Ga voorzichtig "
"te werk."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
"U bent een gebruikersprofiel aan het aanpassen. Ga voorzichtig te werk."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr ""
+#: mediagoblin/edit/views.py:171
+msgid "Wrong password"
+msgstr "Verkeerd wachtwoord"
+
+#: mediagoblin/edit/views.py:192
+msgid "Profile edited!"
+msgstr "Profiel aangepast!"
+
+#: mediagoblin/media_types/__init__.py:65
+msgid "Could not find any file extension in \"{filename}\""
+msgstr "Kon geen bestandsformaat voor \"{filename}\" vinden"
#: mediagoblin/submit/forms.py:25
msgid "File"
@@ -131,141 +169,141 @@ msgstr "Bestand"
#: mediagoblin/submit/forms.py:30
msgid "Description of this work"
-msgstr ""
+msgstr "Beschrijving van dit werk"
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:49
msgid "You must provide a file."
msgstr "U moet een bestand aangeven."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Het lijkt erop dat dit bestand geen afbeelding is!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:127
msgid "Woohoo! Submitted!"
msgstr "Mooizo! Toegevoegd!"
+#: mediagoblin/submit/views.py:133
+msgid "Invalid file type."
+msgstr "Ongeldig bestandstype"
+
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
-msgstr ""
+msgstr "Oeps!"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr ""
+msgstr "Het lijkt erop dat er geen pagina bestaat op dit adres. Sorry!"
#: mediagoblin/templates/mediagoblin/404.html:26
msgid ""
"If you're sure the address is correct, maybe the page you're looking for has"
" been moved or deleted."
msgstr ""
+"Als je zeker weet dat het adres klopt is de pagina misschien verplaatst of "
+"verwijderd."
#: mediagoblin/templates/mediagoblin/404.html:32
msgid "Image of 404 goblin stressing out"
-msgstr ""
+msgstr "Afbeelding van de 404 goblin onder stress"
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:49
msgid "MediaGoblin logo"
-msgstr ""
+msgstr "MediaGoblin logo"
-#: mediagoblin/templates/mediagoblin/base.html:52
+#: mediagoblin/templates/mediagoblin/base.html:54
msgid "Submit media"
msgstr "Voeg media toe"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Controleer uw e-mail!"
+#: mediagoblin/templates/mediagoblin/base.html:65
+msgid "Verify your email!"
+msgstr "Verifieer je e-mailadres!"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:72
+msgid "log out"
+msgstr "uitloggen"
+
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Inloggen"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:91
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+"Aangedreven door &lt;a "
+"href=\"http://mediagoblin.org\"&gt;MediaGoblin&lt;/a&gt; , een &lt;a "
+"href=\"http://gnu.org/\"&gt;GNU-project&lt;/a&gt;"
#: mediagoblin/templates/mediagoblin/root.html:24
msgid "Explore"
-msgstr ""
+msgstr "Verkennen"
#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr ""
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Hoi, welkom op deze MediaGoblin website!"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
+"Deze website draait <a href=\"http://mediagoblin.org\">MediaGoblin</a>, een "
+"buitengewoon goed stuk software voor mediahosting."
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
+"Om je eigen media toe te voegen, berichten te plaatsen, favorieten op te "
+"slaan en meer, kun je inloggen met je MediaGoblin account."
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
+msgid "Don't have one yet? It's easy!"
+msgstr "Heb je er nog geen? Het is heel eenvoudig!"
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Creëer een account op deze website</a>\n"
+" of\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Gebruik MediaGoblin op je eigen server</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:44
msgid "Most recent media"
-msgstr ""
+msgstr "Nieuwste media"
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
msgid "Enter your new password"
-msgstr ""
+msgstr "Voer je nieuwe wachtwoord in"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Submit"
+msgstr "Voeg toe"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Wachtwoord herstellen"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Stuur instructies"
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
msgid "Your password has been changed. Try to log in now."
-msgstr ""
+msgstr "Je wachtwoord is veranderd. Probeer om opnieuw in te loggen."
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
msgid ""
"Check your inbox. We sent an email with a URL for changing your password."
msgstr ""
+"Check je inbox. Er is een e-mail verstuurd waarmee je je wachtwoord kunt "
+"veranderen."
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -280,26 +318,29 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
+"Hoi %(username)s,\n"
+"\n"
+"Om je wachtwoord voor GNU MediaGoblin te veranderen, moet je dit adres in je webbrowser openen:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"Als je denkt dat dit niet klopt, kun je deze e-mail gewoon negeren."
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
-msgstr ""
+msgstr "Inloggen is mislukt!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Heeft u nog geen account?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Maak er hier een!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
+msgstr "Wachtwoord vergeten?"
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
@@ -307,7 +348,7 @@ msgstr "Maak een account aan!"
#: mediagoblin/templates/mediagoblin/auth/register.html:31
msgid "Create"
-msgstr ""
+msgstr "Creëer"
#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19
#, python-format
@@ -342,89 +383,128 @@ msgstr "Wijzigingen opslaan"
msgid "Editing %(username)s's profile"
msgstr "Het profiel aanpassen van %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Media met het etiket:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Media met het label: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:19
+msgid "Original"
+msgstr "Origineel"
#: mediagoblin/templates/mediagoblin/submit/start.html:26
msgid "Submit yer media"
msgstr "Voeg media toe"
-#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Voeg toe"
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Media van %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Media van <a href=\"%(user_url)s\"> %(username)s </a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Sorry, die gebruiker kon niet worden gevonden."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:57
+#, python-format
+msgid "By <a href=\"%(user_url)s\">%(username)s</a> on %(date)s"
+msgstr "Door <a href=\"%(user_url)s\">%(username)s</a> op %(date)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:67
+msgid "Post a comment"
+msgstr "Plaats een bericht"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:85
+msgid "at"
+msgstr "op"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
+msgid "Post comment!"
+msgstr "Plaats bericht!"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:124
+msgid "Edit"
+msgstr "Pas aan"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:130
+msgid "Delete"
+msgstr "Verwijderen"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "Zeker weten dat je %(title)s wil verwijderen?"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
msgid "Delete Permanently"
-msgstr ""
+msgstr "Permanent verwijderen"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
-msgstr ""
+msgstr "Mediaverwerkingspaneel"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
msgid ""
"You can track the state of media being processed for your gallery here."
-msgstr ""
+msgstr "Hier kun je de status zien van de media die verwerkt worden."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
msgid "Media in-processing"
-msgstr ""
+msgstr "Media te verwerken"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
-msgstr ""
+msgstr "Geen media om te verwerken"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
-msgstr ""
+msgstr "Deze toevoegingen konden niet verwerkt worden:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profiel van %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Sorry, die gebruiker kon niet worden gevonden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr ""
+msgstr "Emailverificatie is nodig"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
-msgstr ""
+msgstr "Bijna klaar! Je account moet nog geactiveerd worden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Een e-mail zou in een paar ogenblikken aan moeten komen met instructies "
"hiertoe."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Zoniet:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Stuur de verificatie e-mail opnieuw op."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
+"Iemand heeft een account met deze gebruikersnaam gemaakt, maar hij moet nog "
+"geactiveerd worden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -433,58 +513,67 @@ msgstr ""
"Als u die persoon bent, maar de verificatie e-mail verloren hebt, kunt u <a "
"href=\"%(login_url)s\">inloggen</a> en hem nogmaals verzenden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profiel van %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
-msgstr ""
+msgstr "Hier is een plekje om anderen over jezelf te vertellen."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:119
msgid "Edit profile"
msgstr "Profiel aanpassen."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:107
msgid "This user hasn't filled in their profile (yet)."
-msgstr ""
+msgstr "Deze gebruiker heeft zijn of haar profiel (nog) niet ingevuld."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:133
#, python-format
msgid "View all of %(username)s's media"
msgstr "Bekijk alle media van %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:146
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
+"Dit is waar je nieuwe media zal verschijnen, maar het lijkt erop dat je nog "
+"niets heb toegevoegd."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:152
msgid "Add media"
-msgstr ""
+msgstr "Voeg media toe"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:158
msgid "There doesn't seem to be any media here yet..."
-msgstr ""
+msgstr "Het lijkt erop dat er nog geen media is."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
-msgstr ""
+msgstr "feed icoon"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
-msgstr ""
+msgstr "Atom feed"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
msgid "Newer"
-msgstr ""
+msgstr "Nieuwer"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
msgid "Older"
-msgstr ""
+msgstr "Ouder"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:50
+msgid "Go to page:"
+msgstr "Ga naar pagina:"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "Tagged with"
+msgstr "Gelabeld met"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "and"
+msgstr "en"
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
@@ -492,18 +581,29 @@ msgstr "Commentaar"
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
-msgstr ""
+msgstr "Ik weet zeker dat ik dit wil verwijderen."
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Oeps, je bericht was leeg."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Je bericht is geplaatst!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Je hebt deze media verwijderd."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"Deze media was niet verwijderd omdat je niet hebt aangegeven dat je het "
+"zeker weet."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+"Je staat op het punt de media van iemand anders te verwijderen. Pas op."
diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
index ba427c29..11b00041 100644
--- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
index c74e1dd0..dcc82f90 100644
--- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: nn_NO\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Ugyldig fil for mediatypen."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Brukarnamn"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Passord"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Passorda må vera like."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Gjenta passord"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Skriv passordet omatt for å unngå stavefeil."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Epost"
@@ -52,10 +44,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Ein konto med dette brukarnamnet finst allereide."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Den epostadressa er allereide teken."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,87 +55,155 @@ msgstr ""
"Kontoen din er stadfesta. Du kan no logga inn, endra profilen din og lasta "
"opp filer."
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Stadfestingsnykelen eller brukar-ID-en din er feil."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Send ein ny stadfestingsepost."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
"Kunne ikkje senda epost. Brukarnamnet ditt er inaktivt eller uverifisert."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Tittel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Skildring av mediefila"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Merkelappar"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Nettnamn"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Nettnamnet kan ikkje vera tomt"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
-msgstr "Nettnamnet (adressetittel) for mediefila di. Trengst ikkje endrast."
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Presentasjon"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Heimeside"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Eit innlegg med denne adressetittelen finst allereie."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Trå varsamt, du endrar nokon andre sine mediefiler."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Trå varsamt, du endrar nokon andre sin profil."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Ugyldig fil for mediatypen."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Skildring av mediefila"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Du må velja ei fil."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Fila verkar ikkje å vera ei gyldig biletefil."
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Johoo! Opplasta!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Bilete av stressa 404-tusse."
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Oops."
@@ -159,33 +219,30 @@ msgstr ""
"Er du sikker på at adressa er korrekt, so er sida truleg flytta eller "
"sletta."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Bilete av stressa 404-tusse."
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Last opp"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Legg til mediefiler"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Stadfest epostadressa di"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Logg inn"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -197,91 +254,53 @@ msgstr ""
msgid "Explore"
msgstr "Utforsk"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Hei der mediaentusiast, MediaGoblin..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Er ein perfekt plass for mediet ditt!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-"Er ein plass for folk å samarbeida og visa fram sjølvlaga og vidarebygde "
-"verk."
-#: mediagoblin/templates/mediagoblin/root.html:31
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr "Fri som i fridom (me er eit <a href=\"http://gnu.org\">GNU</a>-prosjekt)."
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Arbeidar for å gjera verda ein betre stad gjennom desentralisering og (til "
-"slutt, kjem snart!) federering, enkelt forklart deling og sending av "
-"mediefiler og kommentarar over fleire nettstader."
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr "Bygd for utviding (fleire medietypar kjem snart, m.a. video)."
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Driven av folk som deg. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Du kan hjelpa med å forbetra"
-" MediaGoblin</a>)"
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Lyst til å bli med oss?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Opprett ein "
-"gratis konto</a> eller <a class=\"header_submit\" "
-"href=\"http://wiki.mediagoblin.org/HackingHowto\">installer MediaGoblin på "
-"eigen tenar</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Nyaste mediefiler"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Fyll inn passord"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Fyll inn brukarnamn eller epost"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Passordet endra. Prøv å logga inn no."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
-"Sjekk innboksen din. Me har sendt deg ein epost med ei netadresse for "
-"passordendring."
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -308,27 +327,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Innlogging feila"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Har du ingen konto?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Lag ein!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Gløymd passordet?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Endra"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Lag ein konto."
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Opprett"
@@ -359,36 +374,114 @@ msgid "Cancel"
msgstr "Bryt av"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Lagra"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Endrar profilen til %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Merkelappar:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Last opp"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Send"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a> sine mediefiler"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Fann ingen slik brukar"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -420,35 +513,45 @@ msgstr "Ingen media under handsaming"
msgid "These uploads failed to process:"
msgstr "Klarte ikkje handsama desse opplasta filene:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)s sin profil"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Fann ingen slik brukar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Epostverifisering trengst."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Nesten ferdig. Du treng berre aktivera kontoen."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "Ein epost med instruksjonar kjem straks."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "I tilfelle det ikkje skjer:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Send ein ny epost"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr "Dette brukarnamnet finst allereie, men det er ikkje aktivert."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -457,40 +560,36 @@ msgstr ""
"Viss dette er deg, kan du <a href=\"%(login_url)s\">logga inn</a> for å få "
"tilsendt ny epost med stadfestingslenkje."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)s sin profil"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Her kan du fortelja om deg sjølv."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Endra profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Brukaren har ikkje fylt ut profilen sin (enno)."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Sjå alle %(username)s sine mediefiler"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
-msgstr "Her kjem mediefilene dine. Ser ikkje ut til at du har lagt til noko."
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Legg til mediefiler"
+msgstr "Her kjem mediefilene dine."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Ser ikkje ut til at det finst nokon mediefiler her nett no."
@@ -502,31 +601,57 @@ msgstr " "
msgid "Atom feed"
msgstr "Atom-kjelde"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Nyare"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Eldre"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Innspel"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Eg er sikker eg vil sletta dette"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Du er i ferd med å sletta ein annan brukar sine mediefiler. Trå varsamt."
diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
index 31cb860c..5b7445f7 100644
--- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
index 047e598b..11400a2f 100644
--- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/mediagoblin/team/pt_BR/)\n"
"MIME-Version: 1.0\n"
@@ -20,28 +20,19 @@ msgstr ""
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Arquivo inválido para esse tipo de mídia"
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nome de Usuário"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Senha"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Senhas devem ser iguais."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Confirmar senha"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-"Digite novamente aqui para ter certeza que não houve erros de digitação"
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Endereço de email"
@@ -54,10 +45,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Desculpe, um usuário com este nome já existe."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Desculpe, esse endereço de email já está em uso."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Desculpe, um usuário com esse email já esta cadastrado"
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -65,15 +56,28 @@ msgstr ""
"O seu endereço de e-mail foi verificado. Você pode agora fazer login, editar"
" seu perfil, e enviar imagens!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "A chave de verificação ou nome usuário estão incorretos."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr " "
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Você já verifico seu email!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "O email de verificação foi reenviado."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -81,73 +85,127 @@ msgstr ""
"Não foi possível enviar o email de recuperação de senha, pois seu nome de "
"usuário está inativo ou o email da sua conta não foi confirmado."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Título"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Descrição desse trabalho"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Etiquetas"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Arquivo"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "O arquivo não pode estar vazio"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"A parte título da URL dessa mídia. Geralmente não é necessário alterar isso."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biografia"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Website"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Senha antiga"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Uma entrada com esse arquivo já existe para esse usuário"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Você está editando a mídia de outro usuário. Tenha cuidado."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Você está editando um perfil de usuário. Tenha cuidado."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Arquivo inválido para esse tipo de mídia"
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Senha errada"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Arquivo"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Descrição desse trabalho"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Você deve fornecer um arquivo."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "O arquivo não parece ser uma imagem!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Eba! Enviado!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Imagem do goblin 404 aparecendo"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Oops"
@@ -163,33 +221,30 @@ msgstr ""
"Se você está certo de que o endereço está correto, talvez a página que "
"esteja procurando tenha sido apagada ou mudou de endereço"
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Imagem do goblin 404 aparecendo"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Logo MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Enviar mídia"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Adicionar mídia"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
msgstr "Verifique seu email!"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "Sair"
+
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Entrar"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -201,93 +256,53 @@ msgstr ""
msgid "Explore"
msgstr "Explorar"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Olá amante de mídias. MediaGoblin é..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "O lugar perfeito para sua mídia!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Olá, bemvindo ao site de MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Um lugar para as pessoas colaborarem e mostrarem suas criações originais e "
-"derivadas!"
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Livre como a liberdade. (Afinal, somos um projeto <a "
-"href=\"http://gnu.org\">GNU</a>)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Com o objetivo de fazer um mundo melhor através da descentralização e "
-"(eventualmente, em breve) federação!"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Construído para extensibilidade. (Múltiplos tipos de mídia em breve, "
-"incluindo suporte a vídeo) "
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-"Desenvolvido por pessoas como você. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Você pode ajudar a melhorar "
-"esse software</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
+msgstr " "
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Animado para juntar-se a nós?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr " "
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\"> Crie uma conta grátis </a>\n"
-" ou <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Configure seu próprio servidor MediaGoblin</a>\n"
-" "
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Mídia mais recente"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Digite sua nova senha"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Digite seu nome de usuário ou email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Sua senha foi alterada. Tente entrar agora."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Recuperar senha"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Verifique sua caixa de entrada. Mandamos um email com a URL para troca da "
-"senha"
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Mandar instruções"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -315,27 +330,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Autenticação falhou"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Ainda não tem conta?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Crie uma aqui!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Esqueceu sua senha?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Altere-a"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Criar uma conta!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Criar"
@@ -366,36 +377,114 @@ msgid "Cancel"
msgstr "Cancelar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Salvar mudanças"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Editando perfil de %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Mídia marcada como:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Original"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Envie sua mídia"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Enviar"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Mídia de <a href=\"%(user_url)s\"> %(username)s </a> "
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Desculpe, esse usuário não foi encontrado."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Editar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Apagar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -428,29 +517,39 @@ msgstr "Nenhuma mídia em processo"
msgid "These uploads failed to process:"
msgstr "Esses envios não foram processados:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Perfil de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Desculpe, esse usuário não foi encontrado."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Verificação de email necessária"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Quase pronto! Sua conta ainda precisa ser ativada"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "Um email deve chegar em instantes com instruções de como fazê-lo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Caso contrário:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Reenviar email de verificação"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -458,7 +557,7 @@ msgstr ""
"Alguém registrou uma conta com esse nome de usuário, mas ainda precisa ser "
"ativada."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -467,30 +566,29 @@ msgstr ""
"Se você é essa pessoa, mas você perdeu seu e-mail de verificação, você pode "
"<a href=\"%(login_url)s\">efetuar login</a> e reenviá-la."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Perfil de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Aqui é o lugar onde você fala de si para os outros."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Editar perfil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Esse usuário não preencheu seu perfil (ainda)."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Ver todas as mídias de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
@@ -498,11 +596,8 @@ msgstr ""
"Aqui é onde sua mídia vai aparecer, mas parece que você não adicionou nada "
"ainda."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Adicionar mídia"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Aparentemente não há nenhuma mídia aqui ainda..."
@@ -514,31 +609,57 @@ msgstr "ícone feed"
msgid "Atom feed"
msgstr "Atom feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Mais novo"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Mais velho"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Comentário"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Ir a página:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Eu tenho certeza de que quero pagar isso"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Opa, seu comentáio estava vazio."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Seu comentário foi postado!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Você deletou a mídia."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Você vai apagar uma mídia de outro usuário. Tenha cuidado."
diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
index 6e9c8897..5a711266 100644
--- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
index 2598f795..4981e988 100644
--- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
@@ -1,15 +1,16 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
# <gapop@hotmail.com>, 2011.
+# George Pop <gapop@hotmail.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +20,19 @@ msgstr ""
"Language: ro\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Formatul fișierului nu corespunde cu tipul de media selectat."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nume de utilizator"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Parolă"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Parolele trebuie să fie identice."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Reintrodu parola"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Introdu parola din nou pentru verificare."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Adresa de e-mail"
@@ -52,108 +45,174 @@ msgid "Sorry, a user with that name already exists."
msgstr "Ne pare rău, există deja un utilizator cu același nume."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Ne pare rău, această adresă de e-mail este deja rezervată."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Există deja un utilizator înregistrat cu această adresă de e-mail."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-"Adresa ta de e-mail a fost confirmată. Poți să te autentifici, să îți "
+"Adresa ta de e-mail a fost verificată. Poți să te autentifici, să îți "
"completezi profilul și să trimiți imagini!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Cheie de verificare sau user ID incorect."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "Trebuie să fii autentificat ca să știm cui să trimitem mesajul!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Adresa ta de e-mail a fost deja verificată!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "E-mail-ul de verificare a fost retrimis."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
"E-mailul pentru recuperarea parolei nu a putut fi trimis deoarece contul tău"
-" e inactiv sau adresa ta de e-mail nu a fost confirmată."
+" e inactiv sau adresa ta de e-mail nu a fost verificată."
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titlu"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Descrierea acestui fișier"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
-msgstr "Etichete"
+msgstr "Tag-uri"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Identificator"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Identificatorul nu poate să lipsească"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"Partea din adresa acestui fișier corespunzătoare titlului. De regulă nu "
-"trebuie modificată."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biografie"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Sit Web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Vechea parolă"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
"Există deja un entry cu același identificator pentru acest utilizator."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Editezi fișierul unui alt utilizator. Se recomandă prudență."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Editezi profilul unui utilizator. Se recomandă prudență."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Formatul fișierului nu corespunde cu tipul de media selectat."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Parolă incorectă"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Fișier"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Descrierea acestui fișier"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Trebuie să selectezi un fișier."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Fișierul nu pare a fi o imagine!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
-msgstr "Gata, trimis!"
+msgstr "Ura! Trimis!"
+
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Imagine cu elful 404 stresat."
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
-msgstr "Oops!"
+msgstr "Hopa!"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr "Ne pare rău, nu există nicio pagină la această adresă."
+msgstr "Nu există nicio pagină la această adresă. Ne pare rău!"
#: mediagoblin/templates/mediagoblin/404.html:26
msgid ""
@@ -163,33 +222,30 @@ msgstr ""
"Dacă ești sigur că adresa e corectă, poate că pagina pe care o cauți a fost "
"mutată sau ștearsă."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Imagine cu elful 404 stresat."
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "logo MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Transmite un fișier media"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Trimite fișier"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Verifică adresa de e-mail!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "verifică e-mail-ul!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "ieșire"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Autentificare"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -201,92 +257,57 @@ msgstr ""
msgid "Explore"
msgstr "Explorează"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Bună! MediaGoblin este..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Locul perfect pentru fișierele tale media!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Un loc unde oamenii colaborează și își expun creațiile originale și "
-"derivate!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Liber. (Suntem un proiect <a href=\"http://gnu.org\">GNU</a>, până la urmă.)"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Salut, bine ai venit pe acest site MediaGoblin!"
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Un pas spre o lume mai bună prin descentralizare și (în curând) "
-"federalizare!"
+"Acest site folosește <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un "
+"software excepțional pentru găzduirea fișierelor media."
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Proiectat să fie extensibil. (Software-ul va avea în curând suport pentru "
-"mai multe formate de media, inclusiv pentru video!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Animat de oameni ca tine. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Ne poți ajuta să îmbunătățim"
-" acest software!</a>)"
+"Ca să adăugi propriile tale fișiere, să scrii comentarii, să salvezi "
+"favoritele tale și multe altele, autentifică-te cu contul tău MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Vrei să ni te alături?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Încă nu ai unul? E simplu!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Creează gratuit un cont</a>\n"
-" sau\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">instalează MediaGoblin pe serverul tău</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Cele mai recente fișiere"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Introdu noua parolă"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Introdu numele de utilizator sau adresa de e-mail"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Parola a fost schimbată. Încearcă să te autentifici acum."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Recuperează parola"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Verifică-ți căsuța de e-mail. Ți-am trimis un mesaj cu link-ul pentru "
-"schimbarea parolei."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Trimite instrucțiuni"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -313,27 +334,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Autentificare eșuată!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Nu ai un cont?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Creează-l aici!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Ai uitat parola?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Schimb-o!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Creează un cont!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Creează"
@@ -364,36 +381,114 @@ msgid "Cancel"
msgstr "Anulare"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Salvează modificările"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Editare profil %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Etichete:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Fișier etichetat cu tag-urile: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Original"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Trimite fișierele tale media"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Trimite"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Fișierele lui %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Fișierele media ale lui <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Ne pare rău, nu am găsit utilizatorul căutat."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Editare"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Șterge"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "la"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -425,29 +520,39 @@ msgstr "Niciun fișier în curs de procesare"
msgid "These uploads failed to process:"
msgstr "Aceste fișiere nu au putut fi procesate:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profil %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Ne pare rău, nu am găsit utilizatorul căutat."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr "Este necesară confirmarea adresei de e-mail"
+msgstr "Este necesară verificarea adresei de e-mail"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Aproape gata! Mai trebuie doar să activezi contul."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "Vei primi în scurt timp un e-mail cu instrucțiuni."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Dacă nu-l primești:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Retrimite mesajul de verificare"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -455,7 +560,7 @@ msgstr ""
"Cineva a înregistrat un cont cu acest nume de utilizator, dar contul nu a "
"fost încă activat."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -464,30 +569,29 @@ msgstr ""
"Dacă tu ești persoana respectivă și nu mai ai e-mail-ul de verificare, poți "
"să te <a href=\"%(login_url)s\">autentifici</a> pentru a-l retrimite."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profil %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Aici poți spune altora ceva despre tine."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Editare profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Acest utilizator nu și-a completat (încă) profilul."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Vezi toate fișierele media ale lui %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
@@ -495,11 +599,8 @@ msgstr ""
"Aici vor apărea fișierele tale media, dar se pare că încă nu ai trimis "
"nimic."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Trimite fișier"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Nu pare să existe niciun fișier media deocamdată..."
@@ -511,31 +612,57 @@ msgstr "icon feed"
msgid "Atom feed"
msgstr "feed Atom"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Mai noi"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Mai vechi"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Scrie un comentariu"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Salt la pagina:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Sunt sigur că doresc să șterg"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Hopa, ai uitat să scrii comentariul."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Comentariul tău a fost trimis!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Ai șters acest fișier"
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "Fișierul nu a fost șters deoarece nu ai confirmat că ești sigur."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Urmează să ștergi fișierele media ale unui alt utilizator. Se recomandă "
diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
index 7cfc0b61..3ddb0c8e 100644
--- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
index aacd5ec8..38748a97 100644
--- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: ru\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Ðеправильный формат файла."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Логин"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Пароль"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Пароли должны Ñовпадать."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Подтвердите пароль"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Ðаберите его ещё раз здеÑÑŒ, чтобы избежать опечаток."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
@@ -52,10 +44,12 @@ msgid "Sorry, a user with that name already exists."
msgstr "Извините, пользователь Ñ Ñтим именем уже зарегиÑтрирован."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Извините, Ñтот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты уже занÑÑ‚."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
+"Сожалеем, но на Ñтот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты уже зарегиÑтрирована Ð´Ñ€ÑƒÐ³Ð°Ñ "
+"ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,15 +57,28 @@ msgstr ""
"ÐÐ´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ¹ Ñлектронной потвержден. Ð’Ñ‹ теперь можете войти и начать "
"редактировать Ñвой профиль и загружать новые изображениÑ!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Ðеверный ключ проверки или идентификатор пользователÑ"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "Вам надо предÑтавитьÑÑ, чтобы мы знали, кому отправлÑть Ñообщение!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Ð’Ñ‹ уже потвердили Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "ПереÑлать Ñообщение Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ аккаунта."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -80,75 +87,128 @@ msgstr ""
"ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ неактивна, либо указанный в ней Ð°Ð´Ñ€ÐµÑ Ñлектронной почты не "
"был подтверждён."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Ðазвание"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "ОпиÑание Ñтого произведениÑ"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Метки"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñть адреÑа"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñть адреÑа необходима"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"ЧаÑть адреÑа Ñтого файла, Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð½Ð°Ñ Ð¾Ñ‚ его названиÑ. Её обычно не нужно "
-"изменÑть."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "БиографиÑ"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Сайт"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Старый пароль"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
"У Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ¶Ðµ еÑть файл Ñ Ñ‚Ð°ÐºÐ¾Ð¹ отличительной чаÑтью адреÑа."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Ð’Ñ‹ редактируете файлы другого пользователÑ. Будьте оÑторожны."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Ð’Ñ‹ редактируете профиль пользователÑ. Будьте оÑторожны."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Ðеправильный формат файла."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Ðеправильный пароль"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Файл"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "ОпиÑание Ñтого произведениÑ"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Вы должны загрузить файл."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Файл, похоже, не ÑвлÑетÑÑ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¾Ð¹!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Ура! Файл загружен!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Изображение 404 нервничающего гоблина"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Ой!"
@@ -160,35 +220,32 @@ msgstr "КажетÑÑ, такой Ñтраницы не ÑущеÑтвует. Ð
msgid ""
"If you're sure the address is correct, maybe the page you're looking for has"
" been moved or deleted."
-msgstr "Возможно, Ñтраница которую вы ищете была удалена или переехала."
-
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Изображение 404 нервничающего гоблина"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
+msgstr "Возможно, Ñтраница, которую вы ищете, была удалена или переехала."
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Символ MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Загрузить файл"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Добавить файлы"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "завершение ÑеанÑа"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Войти"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -198,89 +255,61 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:24
msgid "Explore"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Привет, любитель мультимедиа! MediaGoblin…"
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Отличное меÑто Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… файлов!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"МеÑто Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы ÑовмеÑтно работать или проÑто показать Ñвои "
-"оригинальные и/или заимÑтвованные ÑозданиÑ!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr "Свободное ПО. (Мы же проект <a href=\"http://gnu.org\">GNU</a>.)"
+msgstr "Смотреть"
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Попытка Ñделать мир лучше Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ децентрализации и (надеемÑÑ, что Ñкоро!)"
-" интеграции!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Привет! Добро пожаловать на наш MediaGoblin’овый Ñайт!"
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"РаÑÑчитан на раÑширÑемоÑть. (Ð’ программе Ñкоро должна поÑвитьÑÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° "
-"других видов мультимедиа, таких как видео!)"
+"Этот Ñайт работает на <a href=\"http://mediagoblin.org\">MediaGoblin</a>, "
+"необыкновенно замечательном ПО Ð´Ð»Ñ Ñ…Ð¾Ñтинга мультимедийных файлов."
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"ПоддерживаетÑÑ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ же, как и ты. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Ты можешь помочь Ñделать Ñто"
-" ПО лучше!</a>)"
+"Ð”Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑобÑтвенных файлов, комментированиÑ, Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑпиÑка любимых "
+"файлов и Ñ‚. п. вы можете предÑтавитьÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вашей MediaGoblin’овой "
+"учётной запиÑи."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "У Ð²Ð°Ñ ÐµÑ‘ ещё нет? Ðе проблема!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Самые новые файлы"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Введите Ñвой новый пароль"
-
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Введите Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
-
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Отправить инÑтрукцию"
+
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
msgid ""
@@ -294,32 +323,37 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
+"Привет, %(username)s,\n"
+"\n"
+"чтобы Ñменить Ñвой пароль от GNU MediaGoblin, откройте\n"
+"Ñледующий URL вашим вебâ€Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"ЕÑли вы думаете, что Ñто какаÑâ€Ñ‚о ошибка, то игнорируйте\n"
+"Ñто Ñообщение и продолжайте быть ÑчаÑтливым гоблином!"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½ÐµÑƒÑпешна!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Ещё нету аккаунта?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Создайте здеÑÑŒ!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Забыли Ñвой пароль?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Смените его!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Создать аккаунт!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Создать"
@@ -350,36 +384,114 @@ msgid "Cancel"
msgstr "Отменить"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Сохранить изменениÑ"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Редактирование Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Файлы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Файлы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Оригинал"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Загрузить файл(ы)"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Подтвердить"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Файлы %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Файлы Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Извините, но такой пользователь не найден."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Изменить"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Удалить"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "в"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -412,38 +524,48 @@ msgstr "Ðету файлов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸"
msgid "These uploads failed to process:"
msgstr "Обработка Ñтих файлов вызвала ошибку:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Профиль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Извините, но такой пользователь не найден."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Ðужно подтверждение почтового адреÑа"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Почти закончили! Теперь надо активировать ваш аккаунт."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Через пару мгновений на Ð°Ð´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ¹ Ñлектронной почты должно прийти "
"Ñообщение Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐ¸Ð¼Ð¸ инÑтрукциÑми."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "РеÑли нет, то:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr ""
"Повторно отправить Ñообщение Ð´Ð»Ñ Ð¿Ð¾Ð´Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr "Ктоâ€Ñ‚о Ñоздал аккаунт Ñ Ñтим именем, но его еще надо активировать."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -452,40 +574,36 @@ msgstr ""
"ЕÑли Ñто были вы, и еÑли вы потерÑли Ñообщение Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°, "
"то вы можете <a href=\"%(login_url)s\">войти</a> и отправить его повторно."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Профиль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "ЗдеÑÑŒ вы можете раÑÑказать о Ñебе."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Редактировать профиль"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Это пользователь не заполнил Ñвой профайл (пока)."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Смотреть вÑе файлы %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "Ваши файлы поÑвÑÑ‚ÑÑ Ð·Ð´ÐµÑÑŒ, когда вы их добавите."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Добавить файлы"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Пока что тут файлов нет…"
@@ -497,31 +615,57 @@ msgstr "значок ленты"
msgid "Atom feed"
msgstr "лента в формате Atom"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Более новые"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Более Ñтарые"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Комментарий"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Перейти к Ñтранице:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Я уверен, что хочу удалить Ñто"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Ой, ваш комментарий был пуÑÑ‚."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Ваш комментарий размещён!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Вы удалили файл."
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "Файл не удалён, так как вы не подтвердили Ñвою уверенноÑть галочкой."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Ð’Ñ‹ на пороге ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° другого пользователÑ. Будьте оÑторожны."
diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
index 684c850a..2d3f505f 100644
--- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
index d3196b9c..53ad3080 100644
--- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: sk\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Odovzdaný nesprávny súbor pre daný typ média."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Prihlasovacie meno"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Heslo"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Heslá sa musia zhodovať."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Potvrdiť heslo"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Prepíš ho sem opätovne kvôli uisteniu, že nedošlo k preklepu."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "E-mailová adresa"
@@ -52,10 +44,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "PrepáÄ, rovnaké prihlasovacie meno už niekto používa."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "PrepáÄ, daná e-mailová adresa už bola pri registrácii využitá."
+msgid "Sorry, a user with that email address already exists."
+msgstr "PrepáÄ, používateľ s rovnakou e-mailovou adresou už existuje."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,88 +55,158 @@ msgstr ""
"Tvoja e-mailová adresa bola úspeÅ¡ne overená. MôžeÅ¡ sa hneÄ prihlásiÅ¥, "
"upraviť svoj profil a vkladať výtvory! "
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
-msgstr "Nesprávny overovací kÄ¾ÃºÄ alebo používateľské ID"
+msgstr "Nesprávny overovací kÄ¾ÃºÄ alebo používateľský identifikátor"
+
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"Aby sme ti mohli zaslať e-mailovú správu, je potrebné byť prihláseným!"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Tvoja e-mailová adresa už bola raz overená!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
-msgstr "Opätovne zaslať overovaciu správu."
+msgstr "Opätovne zaslať overovaciu správu na e-mail."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
-"Nebolo ti možné zaslať správu ohľadom obnovy hesla, nakoľko je tvoje "
-"používateľské meno buÄ neaktívne alebo e-mailová adresa úÄtu neoverená."
+"Nebolo ti možné zaslať e-mailovú správu ohľadom obnovy hesla, nakoľko je "
+"tvoje používateľské meno buÄ neaktívne alebo e-mailová adresa úÄtu "
+"neoverená."
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Nadpis"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Charakteristika tohto diela"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
-msgstr "Štítky"
+msgstr "ZnaÄky"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Unikátna ÄasÅ¥ adresy"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
-msgstr "Unikátna ÄasÅ¥ adresy musí byÅ¥ vyplnená"
+msgstr "Unikátna ÄasÅ¥ adresy nesmie byÅ¥ prázdna"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
-msgstr "Titulná ÄasÅ¥ URL odkazu média. ZvyÄajne to meniÅ¥ nemusíš."
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Webstránka"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Staré heslo"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Položku s rovnakou unikátnou ÄasÅ¥ou adresy už niekde máš."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
-msgstr "Upravuješ médiá niekoho iného. Pristupuj opatrne."
+msgstr "Upravuješ médiá niekoho iného. Dbaj na to."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
-msgstr "Upravuješ používateľský profil. Pristupuj opatrne."
+msgstr "Upravuješ používateľský profil. Dbaj na to."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Odovzdaný nesprávny súbor pre daný typ média."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Nesprávne heslo"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Súbor"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Charakteristika diela"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
-msgstr "Poskytni súbor."
-
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Súbor najskôr nie je obrázkom!"
+msgstr "Musíš poskytnúť súbor."
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Juchú! Úspešne vložené!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Obrázok stresujúceho goblina pri chybovom kóde Ä. 404"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Ajaj!"
@@ -160,33 +222,30 @@ msgstr ""
"Ak vieš s istotou, že adresa je správna, tak najskôr bola hľadaná stánka "
"presunutá alebo zmazaná."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Obrázok stresujúceho goblina pri chybovom kóde Ä. 404"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin logo"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Vložiť výtvor"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Pridať výtvor"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Over si e-mailovú adresu!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "over si svoj e-mail!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "odhlásiť sa"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Prihlásenie"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -198,93 +257,57 @@ msgstr ""
msgid "Explore"
msgstr "Preskúmať"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Vitaj medzi nami, kreatívne stvorenie! MediaGoblin je..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Parádne miesto pre tvoje výtvory!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Miesto pre ľudí, vhodné na spoluprácu a vystavovanie tak originálnych, ako "
-"aj odvodených kreácií!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Voľné, vo význame slobody. (Koniec-koncov, sme predsa <a "
-"href=\"http://gnu.org\">GNU</a> projekt.)"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Ahoj, vitaj na tejto MediaGoblin stránke!"
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Zo snahou spraviÅ¥ svet lepším miestom vÄaka decentralizácii a (eventuálne, "
-"už Äoskoro!) federácii!"
+"Táto stránka používa <a href=\"http://mediagoblin.org\">MediaGoblin</a>, "
+"výnimoÄne skvelý kus softvéru na hostovanie médií."
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"S dôrazom na rozšíriteľnosÅ¥. (Podpora pre rozliÄné typy médií v tomto "
-"softvéri už Äoskoro, nevynímajúc videá!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Existujeme aj vÄaka ľudom ako si ty. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Môžeš nám pomôcť softvér "
-"vylepšiť!</a>)"
+"Pre pridanie vlastných výtvorov, vloženie komentárov, uloženie svojich "
+"obľúbených položiek a viac, sa musíš prihlásiÅ¥ so svojim MediaGoblin úÄtom."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Tak Äo, chceÅ¡ sa pridaÅ¥?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Ešte žiaden nemáš? Je to jednoduché!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">VytvoriÅ¥ bezplatný úÄet</a>\n"
-" alebo\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Sprevádzkovať MediaGoblin na vlastnom serveri</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "NajÄerstvejÅ¡ie výtvory"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Vlož svoje nové heslo"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Vlož svoje používateľské meno alebo e-mailovú adresu"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Heslo ti bolo zmenené. Skús sa prihlásiť teraz."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Obnoviť heslo"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Skontroluj si e-mailovú schránku. Bol ti zaslaná správa s URL odkazom pre "
-"zmenu tvojho hesla."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Zaslať postup"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -301,38 +324,33 @@ msgid ""
msgstr ""
"Ahoj %(username)s,\n"
"\n"
-"pre zmenu svojho hesla k GNU MediaGoblin úÄtu, otvor nasledujúci URL odkaz vo \n"
-"svojom prehliadaÄi:\n"
+"pre zmenu svojho hesla k GNU MediaGoblin úÄtu, otvor nasledujúci odkaz vo svojom prehliadaÄi:\n"
"\n"
"%(verification_url)s\n"
"\n"
-"Pokiaľ si myslíš, že došlo k omylu, tak jednoducho ignoruj túto správu a neprestávaj byť šťastným goblinom!"
+"Pokiaľ si myslíš, že doÅ¡lo k omylu, tak jednoducho ignoruj túto správu a buÄ Å¡Å¥astným goblinom!"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "Prihlásenie zlyhalo!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "EÅ¡te nemáš úÄet?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
-msgstr "Vytvoriť jeden tu!"
+msgstr "Vytvor si jeden tu!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Zabudnuté heslo?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Zmeniť ho!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "VytvoriÅ¥ úÄet!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Vytvoriť"
@@ -348,7 +366,7 @@ msgid ""
msgstr ""
"Ahoj %(username)s,\n"
"\n"
-"pre aktiváciu tvojho GNU MediaGoblin úÄtu, otvor nasledujúci URL odkaz vo\n"
+"pre aktiváciu tvojho GNU MediaGoblin úÄtu, otvor nasledujúci odkaz vo\n"
"svojom prehliadaÄi:\n"
"\n"
"%(verification_url)s"
@@ -364,36 +382,114 @@ msgid "Cancel"
msgstr "Zrušiť"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Uložiť zmeny"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Úprava profilu, ktorý vlastní %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Výtvor znaÄený Å¡títkami:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Výtvory oznaÄené ako: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Originál"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Vlož svoj výtvor"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Vložiť"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Výtvory, ktoré vlastní %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
-msgstr "<a href=\"%(user_url)s\">Výtvory, ktoré vlastní %(username)s</a>"
+msgstr "Výtvory, ktoré vlastní <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "PrepáÄ, používateľské meno nenájdené."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Upraviť"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Odstrániť"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "o"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -406,48 +502,58 @@ msgstr "Odstrániť navždy"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
-msgstr "Sekcia spracovania médií"
+msgstr "Sekcia spracovania výtvorov"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
msgid ""
"You can track the state of media being processed for your gallery here."
-msgstr "Tu môžeš sledovať priebeh spracovania médií pre svoju galériu."
+msgstr "Tu môžeš sledovať priebeh spracovania výtvorov pre svoju galériu."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
msgid "Media in-processing"
-msgstr "Médiá v procese spracovania"
+msgstr "Výtvory sa spracúvajú"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
-msgstr "Žiadne médiá v procese spracovania"
+msgstr "Žiadne výtvory sa nespracúvajú"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
-msgstr "Nasledovné vloženia neprešli spracovaním:"
+msgstr "Nasledovné nahratia neprešli spracovaním:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profil, ktorý vlastní %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "PrepáÄ, zadané používateľské meno nenájdené."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Potrebné overenie e-mailovej adresy"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Takmer hotovo! EÅ¡te ti musí byÅ¥ aktivovaný úÄet."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
-msgstr "E-mailová správa s popisom ako to spraviť, by mala onedlho doraziť."
+msgstr "E-mailová správa s popisom ako to spraviť, by mal zanedlho doraziť."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "V prípade, že sa tak nestalo:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
-msgstr "Opätovne zaslať overovaciu správu"
+msgstr "Opätovne zaslať overovaciu správu na e-mail"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -455,52 +561,48 @@ msgstr ""
"ÚÄet s týmto prihlasovacím menom je už registrovaný, avÅ¡ak eÅ¡te stále "
"neaktívny."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr ""
-"Pokiaľ si to ty, ale už nemáš overovaciu správu, tak sa môžeš <a "
+"Pokiaľ si to ty, ale už nemáš overovaciu e-mailovú správu, tak sa môžeš <a "
"href=\"%(login_url)s\">prihlásiť</a> a preposlať si ju."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profil, ktorý vlastní %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
-msgstr "Povedz tu o sebe ostatným."
+msgstr "Miesto, kde smieÅ¡ povedaÅ¥ Äo to o sebe ostatným."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Upraviť profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
-msgstr "DotyÄná osoba eÅ¡te nevyplnila svoj profil (zatiaľ)."
+msgstr "DotyÄný používateľ eÅ¡te nevyplnil svoj profil (zatiaľ)."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Zhliadnuť všetky výtvory, ktoré vlastní %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
"VÅ¡etky tvoje výtvory sa objavia práve tu, ale zatiaľ nemáš niÄ pridané."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Pridať výtvor"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
-msgstr "Najskôr tu ešte nebudú žiadne výtvory..."
+msgstr "Najskôr sa tu ešte nenachádzajú žiadne výtvory..."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
@@ -510,32 +612,58 @@ msgstr "ikona ÄítaÄky"
msgid "Atom feed"
msgstr "ČítaÄka Atom"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Novšie"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Prejsť na stránku:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Staršie"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Komentár"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "JednoznaÄne to chcem odstrániÅ¥"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Ajaj, tvoj komentár bol prázdny."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Tvoj komentár bol zaslaný!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Výtvor bol tebou odstránený."
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "Výtvor nebol odstránený, nakoľko chýbalo tvoje potvrdenie."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
-msgstr "Chystáš sa odstrániť výtvory niekoho iného. Pristupuj opatrne."
+msgstr "Chystáš sa odstrániť výtvory niekoho iného. Dbaj na to."
diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
index 52e3d632..73bb4113 100644
--- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
index cba4fdd0..c5d3104c 100644
--- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Za vrsto vsebine je bila podana napaÄna datoteka."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Uporabniško ime"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Geslo"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Gesli morata biti enaki."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Potrdite geslo"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "E-poštni naslov"
@@ -52,10 +44,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Oprostite, uporabnik s tem imenom že obstaja."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Oprostite, ta e-poštni naslov je že v uporabi."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,86 +55,154 @@ msgstr ""
"Vaš e-poštni naslov je bil potrjen. Sedaj se lahko prijavite, uredite svoj "
"profil in pošljete slike."
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Potrditveni kljuÄ ali uporabniÅ¡ka identifikacija je napaÄna"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Ponovno pošiljanje potrditvene e-pošte."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Naslov"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Oznake"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Oznaka"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Oznaka ne sme biti prazna"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biografija"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Spletna stran"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Vnos s to oznako za tega uporabnika že obstaja."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Urejate vsebino drugega uporabnika. Nadaljujte pazljivo."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Urejate uporabniški profil. Nadaljujte pazljivo."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Za vrsto vsebine je bila podana napaÄna datoteka."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Datoteka"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr ""
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Podati morate datoteko."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Kot kaže datoteka ni slika."
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Juhej! Poslano."
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Slika napake 404 s paniÄnim Å¡kratom"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Opa!"
@@ -158,33 +218,30 @@ msgstr ""
"ÄŒe ste v toÄnost naslova prepriÄani, je bila iskana stran morda premaknjena "
"ali pa izbrisana."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Slika napake 404 s paniÄnim Å¡kratom"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Logotip MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Pošlji vsebino"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Dodaj vsebino"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Preverite svojo e-pošto."
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Prijava"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -194,85 +251,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Pozdravljen, ljubitelj veÄpredstavnostnih vsebin! MediaGoblin je ..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Popolno mesto za vaÅ¡e veÄpredstavnostne vsebine."
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Mesto, kjer ljudje lahko sodelujejo in razkazujejo originalne in predelane "
-"stvaritve."
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-"Ustvarjen z namenom izboljÅ¡ati svet, s pomoÄjo decentralizacije in (kmalu) "
-"federacije."
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Zgrajen za razÅ¡irjanje. (Kmalu bodo na voljo dodatne vrste vsebin, vkljuÄno "
-"podpora za video)"
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Sad dela ljudi, kot ste vi. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Pri izboljševanju nam lahko "
-"pomagate tudi vi.</a>)"
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -293,27 +317,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Prijava ni uspela."
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Å e nimate raÄuna?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Ustvarite si ga."
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Ustvarite raÄun."
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Ustvari"
@@ -345,36 +365,114 @@ msgid "Cancel"
msgstr "PrekliÄi"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Shrani spremembe"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Urejanje profila – %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Vsebina oznaÄena z:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Pošljite svojo vsebino"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Pošlji"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Vsebina uporabnika <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Oprostite, tega uporabnika ni bilo moÄ najti."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -406,29 +504,39 @@ msgstr "V obdelavi ni nobene vsebine"
msgid "These uploads failed to process:"
msgstr "Teh vsebin ni bilo moÄ obdelati:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profil – %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Oprostite, tega uporabnika ni bilo moÄ najti."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Potrebna je potrditev prek e-pošte"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Skoraj ste zakljuÄili. Svoj raÄun morate le Å¡e aktivirati."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "V kratkem bi morali prejeti e-pošto z navodili, kako to storiti."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "ÄŒe je ne prejmete:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Ponovno pošlji potrditveno e-pošto"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -436,7 +544,7 @@ msgstr ""
"Nekdo je s tem uporabniÅ¡kim imenom že registriral raÄun, vendar mora biti Å¡e"
" aktiviran."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -445,40 +553,36 @@ msgstr ""
"Če ste ta oseba vi, a ste izgubili potrditveno e-pošto, se lahko <a "
"href=\"%(login_url)s\">prijavite</a> in jo ponovno pošljete."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profil – %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Na tem mestu lahko drugim poveste nekaj o sebi."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Uredi profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Ta uporabnik še ni izpolnil svojega profila."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Prikaži vso vsebino uporabnika %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "Tu bo prikazana vaÅ¡a vsebina, a trenutno Å¡e niste dodali niÄ."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Dodaj vsebino"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Videti je, da tu še ni nobene vsebine ..."
@@ -490,31 +594,57 @@ msgstr "Ikona vira"
msgid "Atom feed"
msgstr "Ikona Atom"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Komentar"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
index d2649938..2a99cb53 100644
--- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
index b4b2fb7b..cdfdad05 100644
--- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\n"
"MIME-Version: 1.0\n"
@@ -18,27 +18,19 @@ msgstr ""
"Language: sr\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
-msgid "Username"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
-msgid "Password"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
msgstr ""
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
+msgid "Username"
msgstr ""
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
+msgid "Password"
msgstr ""
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr ""
@@ -51,95 +43,163 @@ msgid "Sorry, a user with that name already exists."
msgstr ""
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
+msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr ""
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/submit/forms.py:25
-msgid "File"
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
msgstr ""
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
msgstr ""
-#: mediagoblin/submit/views.py:46
-msgid "You must provide a file."
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
+#: mediagoblin/submit/forms.py:25
+msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:50
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr ""
@@ -153,33 +213,30 @@ msgid ""
" been moved or deleted."
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:47
-msgid "MediaGoblin logo"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -189,76 +246,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
+msgid "Don't have one yet? It's easy!"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -279,27 +312,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr ""
@@ -325,35 +354,113 @@ msgid "Cancel"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
+msgid "Add your media"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
+msgid "Add"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
@@ -386,75 +493,81 @@ msgstr ""
msgid "These uploads failed to process:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
@@ -466,31 +579,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
index 2ae7c510..d647e373 100644
--- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
index 3ee44b18..acace870 100644
--- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n"
"MIME-Version: 1.0\n"
@@ -20,27 +20,19 @@ msgstr ""
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Ogiltig fil för mediatypen."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Användarnamn"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Lösenord"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Lösenorden måste vara identiska."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Bekräfta lösenord"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Skriv in det igen för att undvika stavfel."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "E-postadress"
@@ -53,10 +45,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "En användare med det användarnamnet finns redan."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Den e-postadressen är redan tagen."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -64,15 +56,28 @@ msgstr ""
"Din e-postadress är verifierad. Du kan nu logga in, redigera din profil och "
"ladda upp filer!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Verifieringsnyckeln eller användar-IDt är fel."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Skickade ett nytt verifierings-email."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -80,72 +85,127 @@ msgstr ""
"Kunde inte skicka e-poståterställning av lösenord eftersom ditt användarnamn"
" är inaktivt eller kontots e-postadress har inte verifierats."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Beskrivning av verket"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Taggar"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Sökvägsnamn"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Sökvägsnamnet kan inte vara tomt"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
-msgstr "Sökvägstitlen för din media. Du brukar inte behöva ändra denna."
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Presentation"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Hemsida"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Ett inlägg med det sökvägsnamnet existerar redan."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Var försiktig, du redigerar någon annans inlägg."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Var försiktig, du redigerar en annan användares profil."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Ogiltig fil för mediatypen."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Beskrivning av verket"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Du måste ange en fil"
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Filen verkar inte vara en giltig bildfil!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Tjohoo! Upladdat!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Bild av stressat 404-troll."
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Ojoj!"
@@ -161,33 +221,30 @@ msgstr ""
"Om du är säker på att adressen stämmer så kanske sidan du letar efter har "
"flyttats eller tagits bort."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Bild av stressat 404-troll."
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin-logotyp"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Ladda upp"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Lägg till media"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Verifiera din e-postadress!"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Logga in"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -199,97 +256,53 @@ msgstr ""
msgid "Explore"
msgstr "Utforska"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Hej där mediaentusiast, MediaGoblin..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Är ett perfekt ställe för din media!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Är ett ställe för människor att samarbeta och visa upp originella och "
-"härrörande verk."
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-"Är fritt som i frihet. (Vi är ju ett <a "
-"href=\"http://gnu.org\">GNU</a>-projekt.)"
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Arbetar för att göra världen till ett bättre ställe genom decentralisering "
-"och (så småningom, kommer snart!) -- Google Translate säger "
-"\"sammanslutning\", <em>en: <a "
-"href=\"http://en.wikipedia.org/wiki/Federation_(information_technology)\">federation</a></em>"
-" "
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Byggd för utbyggbarhet. (Flera mediatyper kommer snart till MediaGoblin, "
-"bland annat video!)"
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
msgstr ""
-"Drivs av människor som du. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Du kan hjälpa os forbättra "
-"MediaGoblin!</a>)"
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Nyfiken att gå med oss?"
-
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Skapa ett konto gratis</a>\n"
-"\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Installera MediaGoblin på din egen server</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Senast medier"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Fyll i ditt lösenord"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Fyll i ditt användarnamn eller lösenord"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Ditt lösenord är nu ändrat. Testa att logga in nu."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
-"Kolla din inkorg. Vi har skickat ett e-postmeddelande med en webbadress för "
-"att ändra ditt lösenord."
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -317,27 +330,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Inloggning misslyckades!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Har du inget konto än?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Skapa ett här!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Glömt ditt lösenord?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Ändra!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Skapa ett konto!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Skapa"
@@ -368,36 +377,114 @@ msgid "Cancel"
msgstr "Avbryt"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Spara ändringar"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Redigerar %(username)ss profil"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Media taggat med:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Ladda upp"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Skicka"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>s media"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Ledsen, hittar ingen sådan användare."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -429,30 +516,40 @@ msgstr "Ingen media under behandling"
msgid "These uploads failed to process:"
msgstr "De här behandlingarna misslyckades:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)ss profil"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Ledsen, hittar ingen sådan användare."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "E-postadressverifiering krävs."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Nästan klar! Ditt konto behöver bara aktiveras."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Ett e-postmeddelande med instruktioner kommer att hamna hos dig inom kort."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Om det inte skulle göra det:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Skicka ett nytt e-postmeddelande"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -460,7 +557,7 @@ msgstr ""
"Någon har redan registrerat ett konto med det här användarnamnet men det har"
" inte aktiverats."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -470,30 +567,29 @@ msgstr ""
"detaljer om hur du verifierar ditt konto så kan du <a "
"href=\"%(login_url)s\">logga in</a> och begära ett nytt."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)ss profil"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Här kan du berätta för andra om dig själv."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Redigera profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Den här användaren har inte fyllt i sin profilsida ännu."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Se all media från %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
@@ -501,11 +597,8 @@ msgstr ""
"Här kommer din media att dyka upp, du verkar inte ha lagt till någonting "
"ännu."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Lägg till media"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Det verkar inte finnas någon media här ännu."
@@ -517,31 +610,57 @@ msgstr "feed-ikon"
msgid "Atom feed"
msgstr "Atom-feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Nyare"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Äldre"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Kommentar"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Jag är säker på att jag vill radera detta"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Du tänker radera en annan användares media. Var försiktig."
diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..5480404c
--- /dev/null
+++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..14e12315
--- /dev/null
+++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,637 @@
+# Translations template for PROJECT.
+# Copyright (C) 2012 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# వీవెనౠ<veeven@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+"Language: te\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
+msgid "Username"
+msgstr "వాడà±à°•à°°à°¿ పేరà±"
+
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
+msgid "Password"
+msgstr "సంకేతపదం"
+
+#: mediagoblin/auth/forms.py:34
+msgid "Email address"
+msgstr "ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾"
+
+#: mediagoblin/auth/views.py:55
+msgid "Sorry, registration is disabled on this instance."
+msgstr ""
+
+#: mediagoblin/auth/views.py:73
+msgid "Sorry, a user with that name already exists."
+msgstr ""
+
+#: mediagoblin/auth/views.py:77
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
+
+#: mediagoblin/auth/views.py:180
+msgid ""
+"Your email address has been verified. You may now login, edit your profile, "
+"and submit images!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:186
+msgid "The verification key or user id is incorrect"
+msgstr ""
+
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
+msgid "Resent your verification email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
+msgid "Title"
+msgstr "శీరà±à°·à°¿à°•"
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
+msgid "Tags"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
+msgid "Slug"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:38
+msgid "The slug can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:39
+msgid ""
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:46
+msgid "Bio"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
+msgid "Website"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
+msgid "An entry with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:86
+msgid "You are editing another user's media. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:156
+msgid "You are editing a user's profile. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
+
+#: mediagoblin/submit/forms.py:25
+msgid "File"
+msgstr ""
+
+#: mediagoblin/submit/views.py:50
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:128
+msgid "Woohoo! Submitted!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
+msgid "Oops!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:24
+msgid "There doesn't seem to be a page at this address. Sorry!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:26
+msgid ""
+"If you're sure the address is correct, maybe the page you're looking for has"
+" been moved or deleted."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/auth/login.html:27
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
+msgid "Log in"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:86
+msgid ""
+"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU</a> project"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:29
+msgid ""
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:32
+#, python-format
+msgid ""
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:40
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
+#, python-format
+msgid ""
+"Hi %(username)s,\n"
+"\n"
+"to change your GNU MediaGoblin password, open the following URL in \n"
+"your web browser:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you think this is an error, just ignore this email and continue being\n"
+"a happy goblin!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:30
+msgid "Logging in failed!"
+msgstr "à°ªà±à°°à°µà±‡à°¶à°‚ విఫలమయà±à°¯à°¿à°‚ది!"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
+msgid "Don't have an account yet?"
+msgstr "మీకౠఇంకా ఖాతా లేదా?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+msgid "Create one here!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
+msgid "Forgot your password?"
+msgstr "మీ సంకేతపదానà±à°¨à°¿ మరà±à°šà°¿à°ªà±‹à°¯à°¾à°°à°¾?"
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
+msgid "Create an account!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
+msgid "Create"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19
+#, python-format
+msgid ""
+"Hi %(username)s,\n"
+"\n"
+"to activate your GNU MediaGoblin account, open the following URL in\n"
+"your web browser:\n"
+"\n"
+"%(verification_url)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:29
+#, python-format
+msgid "Editing %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
+msgid "Cancel"
+msgstr "à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
+msgid "Save changes"
+msgstr "మారà±à°ªà±à°²à°¨à± à°­à°¦à±à°°à°ªà°°à°šà±"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
+#, python-format
+msgid "Editing %(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:26
+msgid "Add your media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
+msgid "Media processing panel"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
+msgid ""
+"You can track the state of media being processed for your gallery here."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
+msgid "Media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
+msgid "No media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
+msgid "These uploads failed to process:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
+msgid "Email verification needed"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
+msgid "Almost done! Your account still needs to be activated."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
+msgid ""
+"An email should arrive in a few moments with instructions on how to do so."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+msgid "In case it doesn't:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
+msgid "Resend verification email"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
+msgid ""
+"Someone has registered an account with this username, but it still has to be"
+" activated."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
+#, python-format
+msgid ""
+"If you are that person but you've lost your verification email, you can <a "
+"href=\"%(login_url)s\">log in</a> and resend it."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+msgid "Here's a spot to tell others about yourself."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
+msgid "Edit profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
+msgid "This user hasn't filled in their profile (yet)."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
+#, python-format
+msgid "View all of %(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
+msgid ""
+"This is where your media will appear, but you don't seem to have added "
+"anything yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
+msgid "There doesn't seem to be any media here yet..."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
+msgid "feed icon"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
+msgid "Atom feed"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:198
+msgid "You are about to delete another user's media. Proceed with caution."
+msgstr ""
+
+
diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
index e3751aeb..a7820c49 100644
--- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
index c664adbe..2864ef8a 100644
--- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
@@ -4,14 +4,14 @@
#
# Translators:
# <chc@citi.sinica.edu.tw>, 2011.
-# Harry Chen <harryhow@gmail.com>, 2011.
+# Harry Chen <harryhow@gmail.com>, 2011, 2012.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
-"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"POT-Creation-Date: 2011-12-04 10:24-0600\n"
+"PO-Revision-Date: 2012-01-03 16:35+0000\n"
+"Last-Translator: Harry Chen <harryhow@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,6 +20,10 @@ msgstr ""
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0\n"
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "指定錯誤的媒體類別ï¼"
+
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "使用者å稱"
@@ -53,8 +57,8 @@ msgid "Sorry, a user with that name already exists."
msgstr "抱歉, 這個使用者å稱已經存在."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "抱歉,這個電å­éƒµä»¶å·²ç¶“被其他人使用了。"
+msgid "Sorry, a user with that email address already exists."
+msgstr "抱歉,此電å­éƒµä»¶å·²è¢«è¨»å†Šäº†ã€‚"
#: mediagoblin/auth/views.py:179
msgid ""
@@ -66,11 +70,19 @@ msgstr "你的電å­éƒµä»¶ä½å€å·²è¢«èªè­‰. ä½ ç¾åœ¨å°±å¯ä»¥ç™»å…¥, 編輯ä½
msgid "The verification key or user id is incorrect"
msgstr "èªè­‰ç¢¼æˆ–是使用者帳號錯誤"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:203
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "你必須登入,我們æ‰çŸ¥é“ä¿¡è¦é€çµ¦èª°ï¼"
+
+#: mediagoblin/auth/views.py:211
+msgid "You've already verified your email address!"
+msgstr "你的電å­éƒµä»¶å·²ç¶“確èªäº†ï¼"
+
+#: mediagoblin/auth/views.py:224
msgid "Resent your verification email."
msgstr "é‡é€èªè­‰ä¿¡."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:265
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -84,42 +96,62 @@ msgstr "標題"
msgid "Tags"
msgstr "標籤"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34
+msgid "Seperate tags by commas."
+msgstr "用逗點分開標籤。"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "自訂字串"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "自訂字串ä¸èƒ½ç©ºç™½"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:35
msgid ""
"The title part of this media's URL. You usually don't need to change this."
msgstr "此媒體網å€çš„å稱。你通常ä¸éœ€è¦è®Šå‹•這個的。"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "自我介紹"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "網站"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:49
+msgid "Old password"
+msgstr "舊的密碼"
+
+#: mediagoblin/edit/forms.py:52
+msgid "New Password"
+msgstr "新的密碼"
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "這個自訂字串已經被其他人用了"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "你正在編輯他人的媒體檔案. 請謹慎處ç†."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "你正在編輯一ä½ç”¨æˆ¶çš„æª”案. 請謹慎處ç†."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "指定錯誤的媒體類別ï¼"
+#: mediagoblin/edit/views.py:171
+msgid "Wrong password"
+msgstr "密碼錯誤"
+
+#: mediagoblin/edit/views.py:192
+msgid "Profile edited!"
+msgstr "個人資料已被編輯了ï¼"
+
+#: mediagoblin/media_types/__init__.py:65
+msgid "Could not find any file extension in \"{filename}\""
+msgstr "找ä¸åˆ°ä»»ä½• \"{filename}\" 的附檔å。"
#: mediagoblin/submit/forms.py:25
msgid "File"
@@ -129,18 +161,18 @@ msgstr "檔案"
msgid "Description of this work"
msgstr "這個作å“çš„æè¿°"
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:49
msgid "You must provide a file."
msgstr "ä½ å¿…é ˆæä¾›ä¸€å€‹æª”案"
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "æª”æ¡ˆä¼¼ä¹Žä¸æ˜¯ä¸€å€‹åœ–片喔!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:127
msgid "Woohoo! Submitted!"
msgstr "呼呼! é€å‡ºåŽ»åš•!"
+#: mediagoblin/submit/views.py:133
+msgid "Invalid file type."
+msgstr "䏿­£ç¢ºçš„æª”案格å¼"
+
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
msgstr "糟糕ï¼"
@@ -159,29 +191,29 @@ msgstr "如果你確定這個ä½å€æ˜¯æ­£ç¢ºçš„,或許你在找的網é å·²ç¶“
msgid "Image of 404 goblin stressing out"
msgstr "Image of 404 goblin stressing out"
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:49
msgid "MediaGoblin logo"
msgstr "MediaGoblin 標誌"
-#: mediagoblin/templates/mediagoblin/base.html:52
+#: mediagoblin/templates/mediagoblin/base.html:54
msgid "Submit media"
msgstr "éžäº¤åª’é«”"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "ç¢ºèªæ‚¨çš„é›»å­éƒµä»¶!"
+#: mediagoblin/templates/mediagoblin/base.html:65
+msgid "Verify your email!"
+msgstr "確èªä½ çš„é›»å­éƒµä»¶"
+
+#: mediagoblin/templates/mediagoblin/base.html:72
+msgid "log out"
+msgstr "登出"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "登入"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:91
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -194,62 +226,39 @@ msgid "Explore"
msgstr "探索"
#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "å—¨ï¼å¤šåª’體檔案愛好者ï¼MediaGoblin是..."
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "å˜¿ï¼æ­¡è¿Žä¾†åˆ° 媒體怪ç¸(MediaGoblin) 網站"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "你的媒體檔案的最佳所在ï¼"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
+msgstr ""
+"此網站正é‹è¡Œ <a href=\"http://mediagoblin.org\">媒體怪ç¸(MediaGoblin)</a>, "
+"他是一個超讚的媒體分享架站軟體."
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr "這是一個å¯ä»¥è®“人們共åŒå±•示他們的創作ã€è¡ç”Ÿä½œå“的地方ï¼"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
+msgstr "ä½ å¯ä»¥ç”¨ åª’é«”æ€ªç¸ å¸³è™Ÿç™»å…¥ï¼ŒåŠ å…¥ä½ è‡ªå·±çš„åª’é«”æª”æ¡ˆï¼ŒåŠ å…¥è©•èªžï¼ŒæŠŠä½ çš„æœ€æ„›å„²å­˜èµ·ä¾†ã€‚"
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr "å…費但是我們更é‡è¦–自由 (畢竟我們是個 <a href=\"http://gnu.org\">GNU</a> 專案)"
+msgid "Don't have one yet? It's easy!"
+msgstr "還沒有嗎?其實éžå¸¸ç°¡å–®ï¼"
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr "目的是è¦é€éŽåˆ†æ•£å¼ä¸”自由的方å¼è®“這個世界更美好ï¼(總有一天,它很快會到來的ï¼)"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr "天生的擴充性。(軟體將支æ´å¤šç¨®å¤šåª’體格å¼, 也支æ´å½±éŸ³æª”案ï¼)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-"ç”±åƒä½ ä¸€æ¨£çš„人們製作 (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">ä½ å¯ä»¥å¹«æˆ‘們改進軟體!</a>)"
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "è¿«ä¸äºŸå¾…想è¦åŠ å…¥æˆ‘å€‘ï¼Ÿ"
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">建立一個å…費帳號</a>\n"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">在這網站建立帳號</a>\n"
" 或是\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">在你的伺æœå™¨ä¸Šè¨­ç«‹ MediaGoblin</a>"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">建立一個自己的媒體怪ç¸(MedaiGoblin)</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:44
msgid "Most recent media"
msgstr "最新的媒體"
@@ -257,9 +266,18 @@ msgstr "最新的媒體"
msgid "Enter your new password"
msgstr "輸入你的新密碼"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "輸入你的帳號或是電å­éƒµä»¶"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Submit"
+msgstr "é€å‡º"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "找回密碼"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "é€å‡ºæŒ‡ç¤º"
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
msgid "Your password has been changed. Try to log in now."
@@ -295,22 +313,18 @@ msgstr ""
msgid "Logging in failed!"
msgstr "登入失敗ï¼"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "還沒有帳號嗎?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "在這裡建立一個å§!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "忘了密碼嗎?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "變更ï¼"
-
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "建立一個帳號!"
@@ -355,27 +369,54 @@ msgstr "儲存變更"
msgid "Editing %(username)s's profile"
msgstr "編輯 %(username)s'的檔案中"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "媒體檔案被標籤為:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "此媒體被標識為:%(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:19
+msgid "Original"
+msgstr "原始的"
#: mediagoblin/templates/mediagoblin/submit/start.html:26
msgid "Submit yer media"
msgstr "éžäº¤ä½ çš„媒體檔案"
-#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "é€å‡º"
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "%(username)s的媒體"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>的媒體檔案"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "抱歉,找ä¸åˆ°é€™å€‹ä½¿ç”¨è€…."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:57
+#, python-format
+msgid "By <a href=\"%(user_url)s\">%(username)s</a> on %(date)s"
+msgstr "ç”± <a href=\"%(user_url)s\">%(username)s</a> æ–¼ %(date)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:67
+msgid "Post a comment"
+msgstr "刊登評論"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:85
+msgid "at"
+msgstr "在"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
+msgid "Post comment!"
+msgstr "刊登評論ï¼"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:124
+msgid "Edit"
+msgstr "編輯"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:130
+msgid "Delete"
+msgstr "刪除"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -407,75 +448,80 @@ msgstr "沒有正在處ç†ä¸­çš„媒體"
msgid "These uploads failed to process:"
msgstr "無法處ç†é€™äº›æ›´æ–°"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)s的個人檔案"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "抱歉,找ä¸åˆ°é€™å€‹ä½¿ç”¨è€…."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "需è¦èªè­‰é›»å­éƒµä»¶"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "幾乎完æˆäº†ï¼ä½†ä½ çš„帳號ä»ç„¶éœ€è¦è¢«å•Ÿç”¨ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "馬上會有一å°é›»å­éƒµä»¶å‘Šè¨´ä½ å¦‚何åš."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "å‡è¨­å®ƒç„¡æ³•:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "é‡é€èªè­‰ä¿¡"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr "有人用了這個帳號登錄了,但是這個帳號ä»éœ€è¦è¢«å•Ÿç”¨ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr "如果你就是那個人, 但是éºå¤±äº†èªè­‰ä¿¡, ä½ å¯ä»¥<a href=\"%(login_url)s\">登入</a> 然後é‡é€ä¸€æ¬¡."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)s的個人檔案"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "這是一個地方,能讓你å‘他人介紹自己。"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:119
msgid "Edit profile"
msgstr "編輯個人檔案"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:107
msgid "This user hasn't filled in their profile (yet)."
msgstr "這個使用者還沒(來得åŠ)填寫個人檔案。"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:133
#, python-format
msgid "View all of %(username)s's media"
msgstr "查看%(username)s的全部媒體檔案"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:146
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "這個地方是你的媒體檔案會出ç¾çš„地方,但是你似乎還沒有加入任何æ±è¥¿ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:152
msgid "Add media"
msgstr "新增媒體檔案"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:158
msgid "There doesn't seem to be any media here yet..."
msgstr "似乎還沒有任何的媒體檔案..."
@@ -495,6 +541,18 @@ msgstr "新一點"
msgid "Older"
msgstr "舊一點"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:50
+msgid "Go to page:"
+msgstr "è·³åˆ°é æ•¸ï¼š"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "Tagged with"
+msgstr "被標籤為"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "and"
+msgstr "且"
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "è©•è«–"
@@ -503,15 +561,23 @@ msgstr "è©•è«–"
msgid "I am sure I want to delete this"
msgstr "我確定我想è¦åˆªé™¤"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "啊,你的留言是空的。"
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "你的留言已經刊登ï¼"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "你已刪除此媒體檔案。"
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "此媒體檔案尚未被刪除因為你還沒有確èªä½ çœŸçš„è¦åˆªé™¤ã€‚"
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "你在刪除其他人的媒體檔案。請å°å¿ƒè™•ç†å–”。"
diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py
index b7f52595..23c1c26d 100644
--- a/mediagoblin/init/__init__.py
+++ b/mediagoblin/init/__init__.py
@@ -23,14 +23,18 @@ from mediagoblin.init.config import (
read_mediagoblin_config, generate_validation_report)
from mediagoblin import mg_globals
from mediagoblin.mg_globals import setup_globals
-from mediagoblin.db.open import setup_connection_and_db_from_config
-from mediagoblin.db.util import MigrationManager
+from mediagoblin.db.open import setup_connection_and_db_from_config, \
+ check_db_migrations_current
from mediagoblin.workbench import WorkbenchManager
from mediagoblin.storage import storage_system_from_config
-class Error(Exception): pass
-class ImproperlyConfigured(Error): pass
+class Error(Exception):
+ pass
+
+
+class ImproperlyConfigured(Error):
+ pass
def setup_global_and_app_config(config_path):
@@ -52,32 +56,14 @@ def setup_global_and_app_config(config_path):
def setup_database():
app_config = mg_globals.app_config
- # This MUST be imported so as to set up the appropriate migrations!
- from mediagoblin.db import migrations
-
# Set up the database
connection, db = setup_connection_and_db_from_config(app_config)
- # Init the migration number if necessary
- migration_manager = MigrationManager(db)
- migration_manager.install_migration_version_if_missing()
-
- # Tiny hack to warn user if our migration is out of date
- if not migration_manager.database_at_latest_migration():
- db_migration_num = migration_manager.database_current_migration()
- latest_migration_num = migration_manager.latest_migration()
- if db_migration_num < latest_migration_num:
- print (
- "*WARNING:* Your migrations are out of date, "
- "maybe run ./bin/gmg migrate?")
- elif db_migration_num > latest_migration_num:
- print (
- "*WARNING:* Your migrations are out of date... "
- "in fact they appear to be from the future?!")
+ check_db_migrations_current(db)
setup_globals(
- db_connection = connection,
- database = db)
+ db_connection=connection,
+ database=db)
return connection, db
@@ -99,10 +85,10 @@ def get_jinja_loader(user_template_path=None):
def get_staticdirector(app_config):
- if app_config.has_key('direct_remote_path'):
+ if 'direct_remote_path' in app_config:
return staticdirect.RemoteStaticDirect(
app_config['direct_remote_path'].strip())
- elif app_config.has_key('direct_remote_paths'):
+ elif 'direct_remote_paths' in app_config:
direct_remote_path_lines = app_config[
'direct_remote_paths'].strip().splitlines()
return staticdirect.MultiRemoteStaticDirect(
@@ -126,8 +112,8 @@ def setup_storage():
queue_store = storage_system_from_config(global_config[key_long])
setup_globals(
- public_store = public_store,
- queue_store = queue_store)
+ public_store=public_store,
+ queue_store=queue_store)
return public_store, queue_store
@@ -137,7 +123,7 @@ def setup_workbench():
workbench_manager = WorkbenchManager(app_config['workbench_path'])
- setup_globals(workbench_manager = workbench_manager)
+ setup_globals(workbench_manager=workbench_manager)
def setup_beaker_cache():
diff --git a/mediagoblin/init/celery/__init__.py b/mediagoblin/init/celery/__init__.py
index c58b1305..1eb21d7a 100644
--- a/mediagoblin/init/celery/__init__.py
+++ b/mediagoblin/init/celery/__init__.py
@@ -18,7 +18,7 @@ import os
import sys
-MANDATORY_CELERY_IMPORTS = ['mediagoblin.process_media']
+MANDATORY_CELERY_IMPORTS = ['mediagoblin.processing']
DEFAULT_SETTINGS_MODULE = 'mediagoblin.init.celery.dummy_settings_module'
@@ -40,25 +40,25 @@ def setup_celery_from_config(app_config, global_config,
- set_environ: if set, this will CELERY_CONFIG_MODULE to the
settings_module
"""
- if global_config.has_key('celery'):
+ if 'celery' in global_config:
celery_conf = global_config['celery']
else:
celery_conf = {}
-
+
celery_settings = {}
# set up mongodb stuff
celery_settings['CELERY_RESULT_BACKEND'] = 'mongodb'
- if not celery_settings.has_key('BROKER_BACKEND'):
+ if 'BROKER_BACKEND' not in celery_settings:
celery_settings['BROKER_BACKEND'] = 'mongodb'
celery_mongo_settings = {}
- if app_config.has_key('db_host'):
+ if 'db_host' in app_config:
celery_mongo_settings['host'] = app_config['db_host']
if celery_settings['BROKER_BACKEND'] == 'mongodb':
celery_settings['BROKER_HOST'] = app_config['db_host']
- if app_config.has_key('db_port'):
+ if 'db_port' in app_config:
celery_mongo_settings['port'] = app_config['db_port']
if celery_settings['BROKER_BACKEND'] == 'mongodb':
celery_settings['BROKER_PORT'] = app_config['db_port']
@@ -84,6 +84,6 @@ def setup_celery_from_config(app_config, global_config,
for key, value in celery_settings.iteritems():
setattr(this_module, key, value)
-
+
if set_environ:
os.environ['CELERY_CONFIG_MODULE'] = settings_module
diff --git a/mediagoblin/init/celery/from_celery.py b/mediagoblin/init/celery/from_celery.py
index 3e5adb98..05669b67 100644
--- a/mediagoblin/init/celery/from_celery.py
+++ b/mediagoblin/init/celery/from_celery.py
@@ -44,7 +44,7 @@ def setup_self(check_environ_for_conf=True, module_name=OUR_MODULENAME,
if not os.path.exists(mgoblin_conf_file):
raise IOError(
"MEDIAGOBLIN_CONFIG not set or file does not exist")
-
+
# By setting the environment variable here we should ensure that
# this is the module that gets set up.
os.environ['CELERY_CONFIG_MODULE'] = module_name
diff --git a/mediagoblin/init/config.py b/mediagoblin/init/config.py
index 029a0956..ae232e91 100644
--- a/mediagoblin/init/config.py
+++ b/mediagoblin/init/config.py
@@ -73,7 +73,7 @@ def read_mediagoblin_config(config_path, config_spec=CONFIG_SPEC_PATH):
# For now the validator just works with the default functions,
# but in the future if we want to add additional validation/configuration
# functions we'd add them to validator.functions here.
- #
+ #
# See also:
# http://www.voidspace.org.uk/python/validate.html#adding-functions
validator = Validator()
diff --git a/mediagoblin/listings/routing.py b/mediagoblin/listings/routing.py
index b72bd015..234f2595 100644
--- a/mediagoblin/listings/routing.py
+++ b/mediagoblin/listings/routing.py
@@ -25,4 +25,3 @@ tag_routes = [
Route('mediagoblin.listings.tag_atom_feed', "/{tag}/atom/",
controller="mediagoblin.listings.views:tag_atom_feed"),
]
-
diff --git a/mediagoblin/listings/views.py b/mediagoblin/listings/views.py
index 01aad803..ca8e8229 100644
--- a/mediagoblin/listings/views.py
+++ b/mediagoblin/listings/views.py
@@ -47,7 +47,7 @@ def tag_listing(request, page):
{u'state': u'processed',
u'tags.slug': tag_slug})
cursor = cursor.sort('created', DESCENDING)
-
+
pagination = Pagination(page, cursor)
media_entries = pagination()
@@ -64,6 +64,7 @@ def tag_listing(request, page):
ATOM_DEFAULT_NR_OF_UPDATED_ITEMS = 15
+
def tag_atom_feed(request):
"""
generates the atom feed with the tag images
@@ -76,17 +77,33 @@ def tag_atom_feed(request):
cursor = cursor.sort('created', DESCENDING)
cursor = cursor.limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS)
+ """
+ ATOM feed id is a tag URI (see http://en.wikipedia.org/wiki/Tag_URI)
+ """
feed = AtomFeed(
"MediaGoblin: Feed for tag '%s'" % tag_slug,
feed_url=request.url,
- url=request.host_url)
-
+ id='tag:'+request.host+',2011:gallery.tag-%s' % tag_slug,
+ links=[{'href': request.urlgen(
+ 'mediagoblin.listings.tags_listing',
+ qualified=True, tag=tag_slug ),
+ 'rel': 'alternate',
+ 'type': 'text/html'}])
for entry in cursor:
feed.add(entry.get('title'),
entry.get('description_html'),
+ id=entry.url_for_self(request.urlgen,qualified=True),
content_type='html',
- author=entry.uploader()['username'],
+ author={'name': entry.get_uploader.username,
+ 'uri': request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ qualified=True, user=entry.get_uploader.username)},
updated=entry.get('created'),
- url=entry.url_for_self(request.urlgen))
+ links=[{
+ 'href':entry.url_for_self(
+ request.urlgen,
+ qualified=True),
+ 'rel': 'alternate',
+ 'type': 'text/html'}])
return feed.get_response()
diff --git a/mediagoblin/meddleware/__init__.py b/mediagoblin/meddleware/__init__.py
new file mode 100644
index 00000000..7ba70d87
--- /dev/null
+++ b/mediagoblin/meddleware/__init__.py
@@ -0,0 +1,32 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ENABLED_MEDDLEWARE = (
+ 'mediagoblin.meddleware.noop:NoOpMeddleware',
+ 'mediagoblin.meddleware.csrf:CsrfMeddleware',
+ )
+
+
+class BaseMeddleware(object):
+
+ def __init__(self, mg_app):
+ self.app = mg_app
+
+ def process_request(self, request, controller):
+ pass
+
+ def process_response(self, request, response):
+ pass
diff --git a/mediagoblin/middleware/csrf.py b/mediagoblin/meddleware/csrf.py
index 7a5e352e..a4e4e5c6 100644
--- a/mediagoblin/middleware/csrf.py
+++ b/mediagoblin/meddleware/csrf.py
@@ -21,6 +21,7 @@ from webob.exc import HTTPForbidden
from wtforms import Form, HiddenField, validators
from mediagoblin import mg_globals
+from mediagoblin.meddleware import BaseMeddleware
# Use the system (hardware-based) random number generator if it exists.
# -- this optimization is lifted from Django
@@ -30,6 +31,13 @@ else:
getrandbits = random.getrandbits
+def csrf_exempt(func):
+ """Decorate a Controller to exempt it from CSRF protection."""
+
+ func.csrf_enabled = False
+ return func
+
+
class CsrfForm(Form):
"""Simple form to handle rendering a CSRF token and confirming it
is included in the POST."""
@@ -42,13 +50,16 @@ def render_csrf_form_token(request):
"""Render the CSRF token in a format suitable for inclusion in a
form."""
+ if 'CSRF_TOKEN' not in request.environ:
+ return None
+
form = CsrfForm(csrf_token=request.environ['CSRF_TOKEN'])
return form.csrf_token
-class CsrfMiddleware(object):
- """CSRF Protection Middleware
+class CsrfMeddleware(BaseMeddleware):
+ """CSRF Protection Meddleware
Adds a CSRF Cookie to responses and verifies that it is present
and matches the form token for non-safe requests.
@@ -57,10 +68,7 @@ class CsrfMiddleware(object):
CSRF_KEYLEN = 64
SAFE_HTTP_METHODS = ("GET", "HEAD", "OPTIONS", "TRACE")
- def __init__(self, mg_app):
- self.app = mg_app
-
- def process_request(self, request):
+ def process_request(self, request, controller):
"""For non-safe requests, confirm that the tokens are present
and match.
"""
@@ -77,9 +85,11 @@ class CsrfMiddleware(object):
# if this is a non-"safe" request (ie, one that could have
# side effects), confirm that the CSRF tokens are present and
# valid
- if request.method not in self.SAFE_HTTP_METHODS \
- and ('gmg.verify_csrf' in request.environ or
- 'paste.testing' not in request.environ):
+ if (getattr(controller, 'csrf_enabled', True) and
+ request.method not in self.SAFE_HTTP_METHODS and
+ ('gmg.verify_csrf' in request.environ or
+ 'paste.testing' not in request.environ)
+ ):
return self.verify_tokens(request)
@@ -98,7 +108,7 @@ class CsrfMiddleware(object):
httponly=True)
# update the Vary header
- response.vary = (response.vary or []) + ['Cookie']
+ response.vary = (getattr(response, 'vary', None) or []) + ['Cookie']
def _make_token(self, request):
"""Generate a new token to use for CSRF protection."""
diff --git a/mediagoblin/middleware/noop.py b/mediagoblin/meddleware/noop.py
index 28380232..f5376494 100644
--- a/mediagoblin/middleware/noop.py
+++ b/mediagoblin/meddleware/noop.py
@@ -14,12 +14,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-class NoOpMiddleware(object):
- def __init__(self, mg_app):
- self.app = mg_app
+from mediagoblin.meddleware import BaseMeddleware
- def process_request(self, request):
+
+class NoOpMeddleware(BaseMeddleware):
+
+ def process_request(self, request, controller):
pass
def process_response(self, request, response):
diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py
new file mode 100644
index 00000000..e7eb1dde
--- /dev/null
+++ b/mediagoblin/media_types/__init__.py
@@ -0,0 +1,88 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import os
+import sys
+
+from mediagoblin import mg_globals
+from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
+
+
+class FileTypeNotSupported(Exception):
+ pass
+
+class InvalidFileType(Exception):
+ pass
+
+
+def get_media_types():
+ """
+ Generator, yields the available media types
+ """
+ for media_type in mg_globals.app_config['media_types']:
+ yield media_type
+
+
+def get_media_managers():
+ '''
+ Generator, yields all enabled media managers
+ '''
+ for media_type in get_media_types():
+ __import__(media_type)
+
+ yield media_type, sys.modules[media_type].MEDIA_MANAGER
+
+
+def get_media_manager(_media_type):
+ '''
+ Get the MEDIA_MANAGER based on a media type string
+
+ Example::
+ get_media_type('mediagoblin.media_types.image')
+ '''
+ if not _media_type:
+ return False
+
+ for media_type, manager in get_media_managers():
+ if media_type in _media_type:
+ return manager
+
+ # Nope? Then raise an error
+ raise FileTypeNotSupported(
+ "MediaManager not in enabled types. Check media_types in config?")
+
+
+def get_media_type_and_manager(filename):
+ '''
+ Get the media type and manager based on a filename
+ '''
+ if filename.find('.') > 0:
+ # Get the file extension
+ ext = os.path.splitext(filename)[1].lower()
+ else:
+ raise InvalidFileType(
+ _(u'Could not extract any file extension from "{filename}"').format(
+ filename=filename))
+
+ for media_type, manager in get_media_managers():
+ # Omit the dot from the extension and match it against
+ # the media manager
+ if ext[1:] in manager['accepted_extensions']:
+ return media_type, manager
+ else:
+ raise FileTypeNotSupported(
+ # TODO: Provide information on which file types are supported
+ _(u'Sorry, I don\'t support that file type :('))
diff --git a/mediagoblin/media_types/ascii/__init__.py b/mediagoblin/media_types/ascii/__init__.py
new file mode 100644
index 00000000..21b31d0e
--- /dev/null
+++ b/mediagoblin/media_types/ascii/__init__.py
@@ -0,0 +1,27 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from mediagoblin.media_types.ascii.processing import process_ascii
+
+
+MEDIA_MANAGER = {
+ "human_readable": "ASCII",
+ "processor": process_ascii, # alternately a string,
+ # 'mediagoblin.media_types.image.processing'?
+ "display_template": "mediagoblin/media_displays/ascii.html",
+ "default_thumb": "images/media_thumbs/ascii.jpg",
+ "accepted_extensions": [
+ "txt"]}
diff --git a/mediagoblin/media_types/ascii/asciitoimage.py b/mediagoblin/media_types/ascii/asciitoimage.py
new file mode 100644
index 00000000..39c75a19
--- /dev/null
+++ b/mediagoblin/media_types/ascii/asciitoimage.py
@@ -0,0 +1,172 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import Image
+import ImageFont
+import ImageDraw
+import logging
+import pkg_resources
+import os
+
+_log = logging.getLogger(__name__)
+
+class AsciiToImage(object):
+ '''
+ Converter of ASCII art into image files, preserving whitespace
+
+ kwargs:
+ - font: Path to font file
+ default: fonts/Inconsolata.otf
+ - font_size: Font size, ``int``
+ default: 11
+ '''
+
+ # Font file path
+ _font = None
+
+ _font_size = 11
+
+ # ImageFont instance
+ _if = None
+
+ # ImageFont
+ _if_dims = None
+
+ # Image instance
+ _im = None
+
+ def __init__(self, **kw):
+ if kw.get('font'):
+ self._font = kw.get('font')
+ else:
+ self._font = pkg_resources.resource_filename(
+ 'mediagoblin.media_types.ascii',
+ os.path.join('fonts', 'Inconsolata.otf'))
+
+ if kw.get('font_size'):
+ self._font_size = kw.get('font_size')
+
+ _log.info('Setting font to {0}, size {1}'.format(
+ self._font,
+ self._font_size))
+
+ self._if = ImageFont.truetype(
+ self._font,
+ self._font_size)
+
+ # ,-,-^-'-^'^-^'^-'^-.
+ # ( I am a wall socket )Oo, ___
+ # `-.,.-.,.-.-.,.-.--' ' `
+ # Get the size, in pixels of the '.' character
+ self._if_dims = self._if.getsize('.')
+ # `---'
+
+ def convert(self, text, destination):
+ # TODO: Detect if text is a file-like, if so, act accordingly
+ im = self._create_image(text)
+
+ # PIL's Image.save will handle both file-likes and paths
+ if im.save(destination):
+ _log.info('Saved image in {0}'.format(
+ destination))
+
+ def _create_image(self, text):
+ '''
+ Write characters to a PIL image canvas.
+
+ TODO:
+ - Character set detection and decoding,
+ http://pypi.python.org/pypi/chardet
+ '''
+ # TODO: Account for alternative line endings
+ lines = text.split('\n')
+
+ line_lengths = [len(i) for i in lines]
+
+ # Calculate destination size based on text input and character size
+ im_dims = (
+ max(line_lengths) * self._if_dims[0],
+ len(line_lengths) * self._if_dims[1])
+
+ _log.info('Destination image dimensions will be {0}'.format(
+ im_dims))
+
+ im = Image.new(
+ 'RGBA',
+ im_dims,
+ (255, 255, 255, 0))
+
+ draw = ImageDraw.Draw(im)
+
+ char_pos = [0, 0]
+
+ for line in lines:
+ line_length = len(line)
+
+ _log.debug('Writing line at {0}'.format(char_pos))
+
+ for _pos in range(0, line_length):
+ char = line[_pos]
+
+ px_pos = self._px_pos(char_pos)
+
+ _log.debug('Writing character "{0}" at {1} (px pos {2}'.format(
+ char,
+ char_pos,
+ px_pos))
+
+ draw.text(
+ px_pos,
+ char,
+ font=self._if,
+ fill=(0, 0, 0, 255))
+
+ char_pos[0] += 1
+
+ # Reset X position, increment Y position
+ char_pos[0] = 0
+ char_pos[1] += 1
+
+ return im
+
+ def _px_pos(self, char_pos):
+ '''
+ Helper function to calculate the pixel position based on
+ character position and character dimensions
+ '''
+ px_pos = [0, 0]
+ for index, val in zip(range(0, len(char_pos)), char_pos):
+ px_pos[index] = char_pos[index] * self._if_dims[index]
+
+ return px_pos
+
+
+if __name__ == "__main__":
+ import urllib
+ txt = urllib.urlopen('file:///home/joar/Dropbox/ascii/install-all-the-dependencies.txt')
+
+ _log.setLevel(logging.DEBUG)
+ logging.basicConfig()
+
+ converter = AsciiToImage()
+
+ converter.convert(txt.read(), '/tmp/test.png')
+
+ '''
+ im, x, y, duration = renderImage(h, 10)
+ print "Rendered image in %.5f seconds" % duration
+ im.save('tldr.png', "PNG")
+ '''
diff --git a/mediagoblin/media_types/ascii/fonts/Inconsolata.otf b/mediagoblin/media_types/ascii/fonts/Inconsolata.otf
new file mode 120000
index 00000000..4e742b5e
--- /dev/null
+++ b/mediagoblin/media_types/ascii/fonts/Inconsolata.otf
@@ -0,0 +1 @@
+../../../../extlib/inconsolata/Inconsolata.otf \ No newline at end of file
diff --git a/mediagoblin/media_types/ascii/processing.py b/mediagoblin/media_types/ascii/processing.py
new file mode 100644
index 00000000..a74690c1
--- /dev/null
+++ b/mediagoblin/media_types/ascii/processing.py
@@ -0,0 +1,93 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import asciitoimage
+import chardet
+import os
+import Image
+
+from mediagoblin import mg_globals as mgg
+from mediagoblin.processing import create_pub_filepath, THUMB_SIZE
+
+
+def process_ascii(entry):
+ '''
+ Code to process a txt file
+ '''
+ workbench = mgg.workbench_manager.create_workbench()
+ # Conversions subdirectory to avoid collisions
+ conversions_subdir = os.path.join(
+ workbench.dir, 'conversions')
+ os.mkdir(conversions_subdir)
+
+ queued_filepath = entry['queued_media_file']
+ queued_filename = workbench.localized_file(
+ mgg.queue_store, queued_filepath,
+ 'source')
+
+ queued_file = file(queued_filename, 'rb')
+
+ with queued_file:
+ queued_file_charset = chardet.detect(queued_file.read())
+
+ queued_file.seek(0) # Rewind the queued file
+
+ thumb_filepath = create_pub_filepath(
+ entry, 'thumbnail.png')
+
+ tmp_thumb_filename = os.path.join(
+ conversions_subdir, thumb_filepath[-1])
+
+ converter = asciitoimage.AsciiToImage()
+
+ thumb = converter._create_image(
+ queued_file.read())
+
+ with file(tmp_thumb_filename, 'w') as thumb_file:
+ thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS)
+ thumb.save(thumb_file)
+
+ mgg.public_store.copy_local_to_storage(
+ tmp_thumb_filename, thumb_filepath)
+
+ queued_file.seek(0)
+
+ original_filepath = create_pub_filepath(entry, queued_filepath[-1])
+
+ with mgg.public_store.get_file(original_filepath, 'wb') \
+ as original_file:
+ original_file.write(queued_file.read())
+
+
+ queued_file.seek(0) # Rewind *again*
+
+ unicode_filepath = create_pub_filepath(entry, 'unicode.txt')
+
+ with mgg.public_store.get_file(unicode_filepath, 'wb') \
+ as unicode_file:
+ unicode_file.write(
+ unicode(queued_file.read().decode(
+ queued_file_charset['encoding'])).encode(
+ 'ascii',
+ 'xmlcharrefreplace'))
+
+ mgg.queue_store.delete_file(queued_filepath)
+ entry['queued_media_file'] = []
+ media_files_dict = entry.setdefault('media_files', {})
+ media_files_dict['thumb'] = thumb_filepath
+ media_files_dict['unicode'] = unicode_filepath
+ media_files_dict['original'] = original_filepath
+
+ entry.save()
diff --git a/mediagoblin/media_types/image/__init__.py b/mediagoblin/media_types/image/__init__.py
new file mode 100644
index 00000000..3b63d8eb
--- /dev/null
+++ b/mediagoblin/media_types/image/__init__.py
@@ -0,0 +1,26 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from mediagoblin.media_types.image.processing import process_image
+
+
+MEDIA_MANAGER = {
+ "human_readable": "Image",
+ "processor": process_image, # alternately a string,
+ # 'mediagoblin.media_types.image.processing'?
+ "display_template": "mediagoblin/media_displays/image.html",
+ "default_thumb": "images/media_thumbs/image.jpg",
+ "accepted_extensions": ["jpg", "jpeg", "png", "gif", "tiff"]}
diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py
new file mode 100644
index 00000000..cf90388f
--- /dev/null
+++ b/mediagoblin/media_types/image/processing.py
@@ -0,0 +1,109 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import Image
+import os
+
+from mediagoblin import mg_globals as mgg
+
+from mediagoblin.processing import BadMediaFail, \
+ create_pub_filepath, THUMB_SIZE, MEDIUM_SIZE
+
+################################
+# Media processing initial steps
+################################
+
+
+def process_image(entry):
+ """
+ Code to process an image
+ """
+ workbench = mgg.workbench_manager.create_workbench()
+ # Conversions subdirectory to avoid collisions
+ conversions_subdir = os.path.join(
+ workbench.dir, 'conversions')
+ os.mkdir(conversions_subdir)
+
+ queued_filepath = entry.queued_media_file
+ queued_filename = workbench.localized_file(
+ mgg.queue_store, queued_filepath,
+ 'source')
+
+ filename_bits = os.path.splitext(queued_filename)
+ basename = os.path.split(filename_bits[0])[1]
+ extension = filename_bits[1].lower()
+
+ try:
+ thumb = Image.open(queued_filename)
+ except IOError:
+ raise BadMediaFail()
+
+ thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS)
+
+ # Copy the thumb to the conversion subdir, then remotely.
+ thumb_filename = 'thumbnail' + extension
+ thumb_filepath = create_pub_filepath(entry, thumb_filename)
+ tmp_thumb_filename = os.path.join(
+ conversions_subdir, thumb_filename)
+ with file(tmp_thumb_filename, 'w') as thumb_file:
+ thumb.save(thumb_file)
+ mgg.public_store.copy_local_to_storage(
+ tmp_thumb_filename, thumb_filepath)
+
+ # If the size of the original file exceeds the specified size of a `medium`
+ # file, a `medium.jpg` files is created and later associated with the media
+ # entry.
+ medium = Image.open(queued_filename)
+ medium_processed = False
+
+ if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]:
+ medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS)
+
+ medium_filename = 'medium' + extension
+ medium_filepath = create_pub_filepath(entry, medium_filename)
+ tmp_medium_filename = os.path.join(
+ conversions_subdir, medium_filename)
+
+ with file(tmp_medium_filename, 'w') as medium_file:
+ medium.save(medium_file)
+
+ mgg.public_store.copy_local_to_storage(
+ tmp_medium_filename, medium_filepath)
+
+ medium_processed = True
+
+ # we have to re-read because unlike PIL, not everything reads
+ # things in string representation :)
+ queued_file = file(queued_filename, 'rb')
+
+ with queued_file:
+ #create_pub_filepath(entry, queued_filepath[-1])
+ original_filepath = create_pub_filepath(entry, basename + extension)
+
+ with mgg.public_store.get_file(original_filepath, 'wb') \
+ as original_file:
+ original_file.write(queued_file.read())
+
+ mgg.queue_store.delete_file(queued_filepath)
+ entry.queued_media_file = []
+ media_files_dict = entry.setdefault('media_files', {})
+ media_files_dict['thumb'] = thumb_filepath
+ media_files_dict['original'] = original_filepath
+ if medium_processed:
+ media_files_dict['medium'] = medium_filepath
+
+ # clean up workbench
+ workbench.destroy_self()
diff --git a/mediagoblin/media_types/video/__init__.py b/mediagoblin/media_types/video/__init__.py
new file mode 100644
index 00000000..a970ab01
--- /dev/null
+++ b/mediagoblin/media_types/video/__init__.py
@@ -0,0 +1,27 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from mediagoblin.media_types.video.processing import process_video
+
+
+MEDIA_MANAGER = {
+ "human_readable": "Video",
+ "processor": process_video, # alternately a string,
+ # 'mediagoblin.media_types.image.processing'?
+ "display_template": "mediagoblin/media_displays/video.html",
+ "default_thumb": "images/media_thumbs/video.jpg",
+ "accepted_extensions": [
+ "mp4", "mov", "webm", "avi", "3gp", "3gpp", "mkv", "ogv", "ogg"]}
diff --git a/mediagoblin/media_types/video/devices/web-advanced.json b/mediagoblin/media_types/video/devices/web-advanced.json
new file mode 100644
index 00000000..ce1d22ff
--- /dev/null
+++ b/mediagoblin/media_types/video/devices/web-advanced.json
@@ -0,0 +1,505 @@
+{
+ "make": "Generic",
+ "model": "Web Browser (Advanced)",
+ "description": "Media for World Wide Web",
+ "version": "0.1",
+ "author": {
+ "name": "Dionisio E Alonso",
+ "email": "dealonso@gmail.com"
+ },
+ "icon": "file://web.svg",
+ "default": "WebM 480p",
+ "presets": [
+ {
+ "name": "H.264 720p",
+ "extension": "mp4",
+ "container": "qtmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "qtmux",
+ "width": [
+ 960, 1280
+ ],
+ "height": [
+ 720, 720
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "qtmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+ {
+ "name": "WebM 720p",
+ "extension": "webm",
+ "container": "webmmux",
+ "icon": "file://web-webm.svg",
+ "vcodec": {
+ "name": "vp8enc",
+ "container": "webmmux",
+ "width": [
+ 960, 1280
+ ],
+ "height": [
+ 720, 720
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "quality=5.75 threads=%(threads)s speed=2"
+ ]
+ },
+ "acodec": {
+ "name": "vorbisenc",
+ "container": "webmmux",
+ "width": [
+ 8, 32
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "quality=0.3"
+ ]
+ }
+ },
+ {
+ "name": "Flash Video 720p",
+ "extension": "flv",
+ "icon": "file://web-flv.png",
+ "container": "flvmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "flvmux",
+ "width": [
+ 960, 1280
+ ],
+ "height": [
+ 720, 720
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "flvmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+
+ {
+ "name": "H.264 576p",
+ "extension": "mp4",
+ "container": "qtmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "qtmux",
+ "width": [
+ 768, 1024
+ ],
+ "height": [
+ 576, 576
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "qtmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+ {
+ "name": "WebM 576p",
+ "extension": "webm",
+ "container": "webmmux",
+ "icon": "file://web-webm.svg",
+ "vcodec": {
+ "name": "vp8enc",
+ "container": "webmmux",
+ "width": [
+ 768, 1024
+ ],
+ "height": [
+ 576, 576
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "quality=5.75 threads=%(threads)s speed=2"
+ ]
+ },
+ "acodec": {
+ "name": "vorbisenc",
+ "container": "webmmux",
+ "width": [
+ 8, 32
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "quality=0.3"
+ ]
+ }
+ },
+ {
+ "name": "Flash Video 576p",
+ "extension": "flv",
+ "icon": "file://web-flv.png",
+ "container": "flvmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "flvmux",
+ "width": [
+ 768, 1024
+ ],
+ "height": [
+ 576, 576
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "flvmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+
+ {
+ "name": "H.264 480p",
+ "extension": "mp4",
+ "container": "qtmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "qtmux",
+ "width": [
+ 640, 854
+ ],
+ "height": [
+ 480, 480
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "qtmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+ {
+ "name": "WebM 480p",
+ "extension": "webm",
+ "container": "webmmux",
+ "icon": "file://web-webm.svg",
+ "vcodec": {
+ "name": "vp8enc",
+ "container": "webmmux",
+ "width": [
+ 640, 854
+ ],
+ "height": [
+ 480, 480
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "quality=5.75 threads=%(threads)s speed=2"
+ ]
+ },
+ "acodec": {
+ "name": "vorbisenc",
+ "container": "webmmux",
+ "width": [
+ 8, 32
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "quality=0.3"
+ ]
+ }
+ },
+ {
+ "name": "Flash Video 480p",
+ "extension": "flv",
+ "icon": "file://web-flv.png",
+ "container": "flvmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "flvmux",
+ "width": [
+ 640, 854
+ ],
+ "height": [
+ 480, 480
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "flvmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+
+ {
+ "name": "H.264 360p",
+ "extension": "mp4",
+ "container": "qtmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "qtmux",
+ "width": [
+ 480, 640
+ ],
+ "height": [
+ 360, 360
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "qtmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+ {
+ "name": "WebM 360p",
+ "extension": "webm",
+ "container": "webmmux",
+ "icon": "file://web-webm.svg",
+ "vcodec": {
+ "name": "vp8enc",
+ "container": "webmmux",
+ "width": [
+ 480, 640
+ ],
+ "height": [
+ 360, 360
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "quality=5.75 threads=%(threads)s speed=2"
+ ]
+ },
+ "acodec": {
+ "name": "vorbisenc",
+ "container": "webmmux",
+ "width": [
+ 8, 32
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "quality=0.3"
+ ]
+ }
+ },
+ {
+ "name": "Flash Video 360p",
+ "extension": "flv",
+ "icon": "file://web-flv.png",
+ "container": "flvmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "flvmux",
+ "width": [
+ 480, 640
+ ],
+ "height": [
+ 360, 360
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "flvmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ }
+ ]
+}
diff --git a/mediagoblin/media_types/video/devices/web-flv.png b/mediagoblin/media_types/video/devices/web-flv.png
new file mode 100644
index 00000000..b75699f4
--- /dev/null
+++ b/mediagoblin/media_types/video/devices/web-flv.png
Binary files differ
diff --git a/mediagoblin/media_types/video/devices/web-webm.svg b/mediagoblin/media_types/video/devices/web-webm.svg
new file mode 100644
index 00000000..4e5b3e97
--- /dev/null
+++ b/mediagoblin/media_types/video/devices/web-webm.svg
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg2816"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="web-webm.svg">
+ <defs
+ id="defs2818">
+ <linearGradient
+ id="linearGradient3656">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3658" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3660" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3632">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.54901963;"
+ offset="0"
+ id="stop3634" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3636" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3622">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3624" />
+ <stop
+ style="stop-color:#d3d7cf;stop-opacity:1;"
+ offset="1"
+ id="stop3626" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3600">
+ <stop
+ style="stop-color:#8ae234;stop-opacity:1;"
+ offset="0"
+ id="stop3602" />
+ <stop
+ style="stop-color:#4e9a06;stop-opacity:1;"
+ offset="1"
+ id="stop3604" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective2824" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3600"
+ id="linearGradient3606"
+ x1="20.256382"
+ y1="2.546674"
+ x2="20.256382"
+ y2="46.881901"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3622"
+ id="linearGradient3628"
+ x1="21.2349"
+ y1="7.948472"
+ x2="21.2349"
+ y2="40.191879"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3632"
+ id="linearGradient3638"
+ x1="6.4826794"
+ y1="4.543263"
+ x2="25.363527"
+ y2="35.227882"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-0.35355339)" />
+ <inkscape:perspective
+ id="perspective3693"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3600-5"
+ id="linearGradient3606-9"
+ x1="20.256382"
+ y1="2.546674"
+ x2="20.256382"
+ y2="46.881901"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3600-5">
+ <stop
+ style="stop-color:#8ae234;stop-opacity:1;"
+ offset="0"
+ id="stop3602-7" />
+ <stop
+ style="stop-color:#4e9a06;stop-opacity:1;"
+ offset="1"
+ id="stop3604-2" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3731">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.82730657"
+ id="feGaussianBlur3733" />
+ </filter>
+ <inkscape:perspective
+ id="perspective3749"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3782"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="20.51741"
+ inkscape:cy="22.534228"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1099"
+ inkscape:window-height="834"
+ inkscape:window-x="801"
+ inkscape:window-y="106"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3608" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2821">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="star"
+ style="fill:#000000;fill-opacity:0.2869955;stroke:none;filter:url(#filter3731)"
+ id="path3598-4"
+ sodipodi:sides="3"
+ sodipodi:cx="13.857143"
+ sodipodi:cy="24.714287"
+ sodipodi:r1="25.596954"
+ sodipodi:r2="12.798477"
+ sodipodi:arg1="0"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 39.454098,24.714287 20.256381,35.798093 1.0586662,46.8819 l 0,-22.167614 0,-22.1676119 19.1977168,11.0838069 19.197715,11.083806 z"
+ transform="matrix(1.0537808,0,0,1.0537808,3.6163385,-1.9600717)" />
+ <path
+ sodipodi:type="star"
+ style="fill:url(#linearGradient3606);fill-opacity:1;stroke:#366a04;stroke-width:1.05497880999999993;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-linejoin:round"
+ id="path3598"
+ sodipodi:sides="3"
+ sodipodi:cx="13.857143"
+ sodipodi:cy="24.714287"
+ sodipodi:r1="25.596954"
+ sodipodi:r2="12.798477"
+ sodipodi:arg1="0"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 39.454098,24.714287 20.256381,35.798093 1.0586662,46.8819 l 0,-22.167614 0,-22.1676119 19.1977168,11.0838069 19.197715,11.083806 z"
+ transform="matrix(0.94788634,0,0,0.94788634,5.0257749,0.56128794)" />
+ <path
+ style="fill:url(#linearGradient3628);stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 6.5304575,9.646791 8.7347075,20.091724 4.674611,-18.160553 4.525987,2.612472 3.885316,12.559503 4.403755,-7.765833 1.744319,1.009296 -2.127799,9.211229 -6.155446,3.554753 -4.028978,-9.439016 -2.255629,13.086534 -5.852703,3.373025 -7.5584205,-9.989634 0.01028,-20.1435 z"
+ id="path3620"
+ sodipodi:nodetypes="cccccccccccccc" />
+ <path
+ style="fill:none;stroke:url(#linearGradient3638);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 6.9826793,42.785087 0,-38.0953773 32.9068657,18.9987873"
+ id="path3630"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="M 6.6184028,8.6135689 15.026019,28.134068 19.45616,10.995613"
+ id="path3739"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="m 25.081121,14.552251 3.345117,11.020499 3.93014,-6.825955"
+ id="path3739-5"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="m 6.6291261,30.85266 7.0710679,9.280777"
+ id="path3772"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="m 34.736621,20.290253 -2.032932,8.794642"
+ id="path3772-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="m 20.594485,35.934991 1.811961,-10.650796 3.270369,7.778174"
+ id="path3796"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/mediagoblin/media_types/video/devices/web.svg b/mediagoblin/media_types/video/devices/web.svg
new file mode 100644
index 00000000..c0c68244
--- /dev/null
+++ b/mediagoblin/media_types/video/devices/web.svg
@@ -0,0 +1,982 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"
+ sodipodi:docname="internet-web-browser.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective156" />
+ <linearGradient
+ id="linearGradient4750">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4752" />
+ <stop
+ style="stop-color:#fefefe;stop-opacity:1.0000000;"
+ offset="0.37931034"
+ id="stop4758" />
+ <stop
+ style="stop-color:#1d1d1d;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop4754" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4350">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4352" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4354" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3962"
+ id="radialGradient3968"
+ gradientTransform="scale(0.999989,1.000011)"
+ cx="18.247644"
+ cy="15.716079"
+ fx="18.247644"
+ fy="15.716079"
+ r="29.993349"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4114"
+ id="radialGradient4120"
+ gradientTransform="scale(1.643990,0.608276)"
+ cx="15.115514"
+ cy="63.965388"
+ fx="15.115514"
+ fy="63.965388"
+ r="12.289036"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4126"
+ id="radialGradient4132"
+ gradientTransform="scale(0.999989,1.000011)"
+ cx="15.601279"
+ cy="12.142302"
+ fx="15.601279"
+ fy="12.142302"
+ r="43.526714"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4350"
+ id="radialGradient4356"
+ gradientTransform="scale(1.179536,0.847791)"
+ cx="11.826907"
+ cy="10.476453"
+ fx="11.826907"
+ fy="10.476453"
+ r="32.664848"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4750"
+ id="radialGradient4756"
+ gradientTransform="scale(1.036822,0.964486)"
+ cx="18.633780"
+ cy="17.486208"
+ fx="18.934305"
+ fy="17.810213"
+ r="40.692665"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1460"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1462"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1466"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1468"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1470"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1474"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1476"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1478"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1482"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1484"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1486"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1490"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1492"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1494"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1498"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1500"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1502"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1506"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1508"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1510"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1514"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1516"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1518"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1522"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1524"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1526"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1528"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1530"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1532"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1534"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1536"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1538"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1540"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1542"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1544"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1546"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1550"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1552"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1554"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1558"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="9.8994949"
+ inkscape:cx="25.799661"
+ inkscape:cy="24.622653"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1440"
+ inkscape:window-height="823"
+ inkscape:window-x="0"
+ inkscape:window-y="30"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Globe</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>globe</rdf:li>
+ <rdf:li>international</rdf:li>
+ <rdf:li>web</rdf:li>
+ <rdf:li>www</rdf:li>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>network</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient4120);fill-opacity:1.0000000;stroke:none;stroke-opacity:1.0000000"
+ id="path4112"
+ sodipodi:cx="24.849752"
+ sodipodi:cy="38.908627"
+ sodipodi:rx="20.203051"
+ sodipodi:ry="7.4751287"
+ d="M 45.052803 38.908627 A 20.203051 7.4751287 0 1 1 4.6467018,38.908627 A 20.203051 7.4751287 0 1 1 45.052803 38.908627 z"
+ transform="matrix(1.000000,0.000000,0.000000,1.243244,0.000000,-10.27241)" />
+ <path
+ style="fill:url(#radialGradient3968);fill-opacity:1.0000000;fill-rule:nonzero;stroke:#39396c;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+ d="M 43.959853,23.485499 C 43.959853,34.195217 35.277750,42.877222 24.569505,42.877222 C 13.860279,42.877222 5.1786663,34.195119 5.1786663,23.485499 C 5.1786663,12.776272 13.860279,4.0951517 24.569505,4.0951517 C 35.277750,4.0951517 43.959853,12.776272 43.959853,23.485499 L 43.959853,23.485499 z "
+ id="path3214" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.42159382;fill:url(#radialGradient4356);fill-opacity:1.0000000;stroke:none;stroke-opacity:1.0000000"
+ id="path4348"
+ sodipodi:cx="17.778685"
+ sodipodi:cy="15.271057"
+ sodipodi:rx="12.929953"
+ sodipodi:ry="9.2934036"
+ d="M 30.708637 15.271057 A 12.929953 9.2934036 0 1 1 4.8487320,15.271057 A 12.929953 9.2934036 0 1 1 30.708637 15.271057 z"
+ transform="matrix(0.835938,0.000000,0.000000,1.000000,9.886868,0.000000)" />
+ <g
+ id="g4136"
+ style="fill:#000000;fill-opacity:0.71345031;fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
+ transform="matrix(0.982371,0.000000,0.000000,0.982371,0.121079,0.232914)">
+ <g
+ id="g4138">
+ <g
+ id="g4142">
+ <path
+ d="M 44.071300,20.714400 C 44.071300,20.977100 44.071300,20.714400 44.071300,20.714400 L 43.526400,21.331600 C 43.192400,20.938000 42.817400,20.607000 42.436600,20.261300 L 41.600700,20.384300 L 40.837000,19.521000 L 40.837000,20.589400 L 41.491300,21.084500 L 41.926800,21.577700 L 42.508800,20.919500 C 42.655300,21.193900 42.799800,21.468300 42.945300,21.742700 L 42.945300,22.565000 L 42.290000,23.305200 L 41.090800,24.128400 L 40.182600,25.034700 L 39.600600,24.374500 L 39.891600,23.634300 L 39.310500,22.976100 L 38.329100,20.878400 L 37.493200,19.933100 L 37.274400,20.179200 L 37.602500,21.372600 L 38.219700,22.071800 C 38.572200,23.089400 38.920900,24.062000 39.383800,25.034700 C 40.101600,25.034700 40.778300,24.958500 41.491200,24.868700 L 41.491200,25.444900 L 40.619100,27.584100 L 39.819300,28.488400 L 39.165000,29.888800 C 39.165000,30.656400 39.165000,31.424000 39.165000,32.191500 L 39.383800,33.097800 L 39.020500,33.508000 L 38.219700,34.002100 L 37.383800,34.701300 L 38.075200,35.482600 L 37.129900,36.306800 L 37.311500,36.840000 L 35.893500,38.445500 L 34.949200,38.445500 L 34.149400,38.939600 L 33.639600,38.939600 L 33.639600,38.281400 L 33.422800,36.963000 C 33.141500,36.136800 32.848600,35.316500 32.550700,34.496200 C 32.550700,33.890700 32.586800,33.291100 32.623000,32.685700 L 32.987300,31.863400 L 32.477500,30.875100 L 32.514600,29.517700 L 31.823200,28.736400 L 32.168900,27.605500 L 31.606400,26.967300 L 30.624000,26.967300 L 30.296900,26.597200 L 29.315500,27.214900 L 28.916100,26.761300 L 28.006900,27.543000 C 27.389700,26.843300 26.771500,26.144100 26.153400,25.444900 L 25.426800,23.716400 L 26.081100,22.730100 L 25.717800,22.319000 L 26.516600,20.425400 C 27.172900,19.609000 27.858400,18.825800 28.551800,18.039700 L 29.788100,17.710600 L 31.169000,17.546500 L 32.114300,17.793600 L 33.459000,19.150000 L 33.931700,18.615800 L 34.585000,18.533800 L 35.821300,18.944900 L 36.766600,18.944900 L 37.420900,18.368700 L 37.711900,17.957600 L 37.056600,17.546500 L 35.965800,17.464500 C 35.663100,17.044600 35.381800,16.603200 35.022400,16.230100 L 34.658100,16.394200 L 34.512600,17.464500 L 33.858300,16.724300 L 33.713800,15.900100 L 32.987200,15.325900 L 32.695200,15.325900 L 33.422700,16.148200 L 33.131700,16.888400 L 32.550600,17.052500 L 32.913900,16.312300 L 32.258600,15.984200 L 31.678500,15.326000 L 30.586700,15.572100 L 30.442200,15.900200 L 29.787900,16.312300 L 29.424600,17.217600 L 28.516400,17.669700 L 28.116000,17.217600 L 27.680500,17.217600 L 27.680500,15.736200 L 28.625800,15.242100 L 29.352400,15.242100 L 29.205900,14.666900 L 28.625800,14.090700 L 29.606300,13.884600 L 30.151200,13.268400 L 30.586700,12.527200 L 31.387500,12.527200 L 31.168700,11.952000 L 31.678500,11.622900 L 31.678500,12.281100 L 32.768300,12.527200 L 33.858100,11.622900 L 33.931300,11.210800 L 34.875600,10.553100 C 34.533800,10.595600 34.192000,10.626800 33.858000,10.717700 L 33.858000,9.9766000 L 34.221300,9.1538000 L 33.858000,9.1538000 L 33.059600,9.8940000 L 32.840800,10.305600 L 33.059600,10.882300 L 32.695300,11.868600 L 32.114200,11.539500 L 31.606400,10.964300 L 30.805600,11.539500 L 30.514600,10.223600 L 31.895500,9.3188000 L 31.895500,8.8247000 L 32.768500,8.2490000 L 34.149400,7.9194000 L 35.094700,8.2490000 L 36.838800,8.5781000 L 36.403300,9.0713000 L 35.458000,9.0713000 L 36.403300,10.058600 L 37.129900,9.2363000 L 37.350600,8.8745000 C 37.350600,8.8745000 40.137700,11.372500 41.730500,14.105000 C 43.323300,16.838400 44.071300,20.060100 44.071300,20.714400 z "
+ id="path4144" />
+ </g>
+ </g>
+ <g
+ id="g4146">
+ <g
+ id="g4150">
+ <path
+ d="M 26.070300,9.2363000 L 25.997100,9.7295000 L 26.506900,10.058600 L 27.378000,9.4829000 L 26.942500,8.9892000 L 26.360500,9.3188000 L 26.070500,9.2363000"
+ id="path4152" />
+ </g>
+ </g>
+ <g
+ id="g4154">
+ <g
+ id="g4158">
+ <path
+ d="M 26.870100,5.8633000 L 24.979500,5.1226000 L 22.799800,5.3692000 L 20.109400,6.1094000 L 19.600600,6.6035000 L 21.272500,7.7549000 L 21.272500,8.4131000 L 20.618200,9.0713000 L 21.491200,10.800300 L 22.071300,10.470200 L 22.799800,9.3188000 C 23.922800,8.9716000 24.929700,8.5781000 25.997100,8.0844000 L 26.870100,5.8632000"
+ id="path4160" />
+ </g>
+ </g>
+ <g
+ id="g4162">
+ <g
+ id="g4166">
+ <path
+ d="M 28.833000,12.774900 L 28.542000,12.033700 L 28.032200,12.198700 L 28.178700,13.103000 L 28.833000,12.774900"
+ id="path4168" />
+ </g>
+ </g>
+ <g
+ id="g4170">
+ <g
+ id="g4174">
+ <path
+ d="M 29.123000,12.608900 L 28.977500,13.597200 L 29.777300,13.432200 L 30.358400,12.857000 L 29.849600,12.362900 C 29.678700,11.907800 29.482400,11.483000 29.268500,11.046500 L 28.833000,11.046500 L 28.833000,11.539700 L 29.123000,11.868800 L 29.123000,12.609000"
+ id="path4176" />
+ </g>
+ </g>
+ <g
+ id="g4178">
+ <g
+ id="g4182">
+ <path
+ d="M 18.365200,28.242200 L 17.783200,27.089900 L 16.692900,26.843300 L 16.111400,25.280800 L 14.657800,25.444900 L 13.422400,24.540600 L 12.113300,25.692000 L 12.113300,25.873600 C 11.717300,25.759300 11.230500,25.743700 10.877900,25.526900 L 10.586900,24.704600 L 10.586900,23.799300 L 9.7148000,23.881300 C 9.7876000,23.305100 9.8598000,22.729900 9.9331000,22.153800 L 9.4238000,22.153800 L 8.9155000,22.812000 L 8.4062000,23.058100 L 7.6791000,22.647900 L 7.6063000,21.742600 L 7.7518000,20.755300 L 8.8426000,19.933000 L 9.7147000,19.933000 L 9.8597000,19.438900 L 10.950000,19.685000 L 11.749800,20.673300 L 11.895300,19.026800 L 13.276600,17.875400 L 13.785400,16.641000 L 14.803000,16.229900 L 15.384500,15.407600 L 16.692600,15.159600 L 17.347400,14.173300 C 16.693100,14.173300 16.038800,14.173300 15.384500,14.173300 L 16.620300,13.597100 L 17.491900,13.597100 L 18.728200,13.185000 L 18.873700,12.692800 L 18.437200,12.280700 L 17.928400,12.115700 L 18.073900,11.622500 L 17.710600,10.882300 L 16.838000,11.210400 L 16.983500,10.552700 L 15.965900,9.9765000 L 15.166600,11.374400 L 15.238900,11.868500 L 14.439600,12.198600 L 13.930300,13.267900 L 13.712500,12.280600 L 12.331200,11.704400 L 12.112900,10.964200 L 13.930300,9.8939000 L 14.730100,9.1537000 L 14.802900,8.2489000 L 14.366900,8.0018000 L 13.785400,7.9193000 L 13.422100,8.8246000 C 13.422100,8.8246000 12.814200,8.9437000 12.657900,8.9823000 C 10.661800,10.821700 6.6286000,14.792400 5.6916000,22.288500 C 5.7287000,22.462300 6.3708000,23.470100 6.3708000,23.470100 L 7.8972000,24.374400 L 9.4236000,24.786500 L 10.078400,25.609700 L 11.095500,26.349900 L 11.677000,26.267900 L 12.113000,26.464200 L 12.113000,26.597000 L 11.531900,28.160000 L 11.095400,28.818200 L 11.240900,29.148300 L 10.877600,30.380700 L 12.186200,32.767400 L 13.494300,33.919700 L 14.076300,34.742000 L 14.003100,36.470500 L 14.439600,37.456800 L 14.003100,39.349400 C 14.003100,39.349400 13.968900,39.337700 14.024600,39.527100 C 14.080800,39.716600 16.353700,40.978300 16.498200,40.870900 C 16.642200,40.761500 16.765300,40.665800 16.765300,40.665800 L 16.620300,40.255600 L 17.201400,39.679400 L 17.419700,39.103200 L 18.365000,38.773100 L 19.091600,36.962600 L 18.873800,36.470400 L 19.381600,35.730200 L 20.472400,35.482200 L 21.054400,34.165800 L 20.908900,32.521300 L 21.781000,31.286900 L 21.926500,30.052500 C 20.733100,29.460700 19.549500,28.851300 18.365000,28.242000"
+ id="path4184" />
+ </g>
+ </g>
+ <g
+ id="g4186">
+ <g
+ id="g4190">
+ <path
+ d="M 16.765600,9.5649000 L 17.492200,10.058600 L 18.074200,10.058600 L 18.074200,9.4829000 L 17.347600,9.1538000 L 16.765600,9.5649000"
+ id="path4192" />
+ </g>
+ </g>
+ <g
+ id="g4194">
+ <g
+ id="g4198">
+ <path
+ d="M 14.876000,8.9072000 L 14.512200,9.8120000 L 15.239300,9.8120000 L 15.603100,8.9892000 C 15.916600,8.7675000 16.228600,8.5444000 16.547900,8.3310000 L 17.275000,8.5781000 C 17.759400,8.9072000 18.243800,9.2363000 18.728600,9.5649000 L 19.456100,8.9072000 L 18.655800,8.5781000 L 18.292000,7.8374000 L 16.911100,7.6728000 L 16.838300,7.2612000 L 16.184000,7.4262000 L 15.893600,8.0020000 L 15.529800,7.2613000 L 15.384800,7.5904000 L 15.457600,8.4132000 L 14.876000,8.9072000"
+ id="path4200" />
+ </g>
+ </g>
+ <g
+ id="g4202">
+ <g
+ style="opacity:0.75000000"
+ id="g4204">
+ <path
+ id="path4206"
+ d="" />
+ </g>
+ <g
+ id="g4208">
+ <path
+ id="path4210"
+ d="" />
+ </g>
+ </g>
+ <g
+ id="g4212">
+ <g
+ style="opacity:0.75000000"
+ id="g4214">
+ <path
+ id="path4216"
+ d="" />
+ </g>
+ <g
+ id="g4218">
+ <path
+ id="path4220"
+ d="" />
+ </g>
+ </g>
+ <g
+ id="g4222">
+ <g
+ id="g4226">
+ <path
+ d="M 17.492200,6.8496000 L 17.856000,6.5210000 L 18.583100,6.3564000 C 19.081100,6.1142000 19.581100,5.9511000 20.109500,5.7802000 L 19.819500,5.2865000 L 18.881000,5.4213000 L 18.437600,5.8632000 L 17.706600,5.9692000 L 17.056700,6.2744000 L 16.740800,6.4272000 L 16.547900,6.6855000 L 17.492200,6.8496000"
+ id="path4228" />
+ </g>
+ </g>
+ <g
+ id="g4230">
+ <g
+ id="g4234">
+ <path
+ d="M 18.728500,14.666500 L 19.165000,14.008300 L 18.510200,13.515100 L 18.728500,14.666500"
+ id="path4236" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g3216"
+ style="color:#000000;fill:url(#radialGradient1460);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0179454;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ transform="matrix(0.982371,0.000000,0.000000,0.982371,-8.095179e-2,3.088300e-2)">
+ <g
+ id="g3218"
+ style="color:#000000;fill:url(#radialGradient1462);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3222"
+ style="color:#000000;fill:url(#radialGradient1466);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 44.071300,20.714400 C 44.071300,20.977100 44.071300,20.714400 44.071300,20.714400 L 43.526400,21.331600 C 43.192400,20.938000 42.817400,20.607000 42.436600,20.261300 L 41.600700,20.384300 L 40.837000,19.521000 L 40.837000,20.589400 L 41.491300,21.084500 L 41.926800,21.577700 L 42.508800,20.919500 C 42.655300,21.193900 42.799800,21.468300 42.945300,21.742700 L 42.945300,22.565000 L 42.290000,23.305200 L 41.090800,24.128400 L 40.182600,25.034700 L 39.600600,24.374500 L 39.891600,23.634300 L 39.310500,22.976100 L 38.329100,20.878400 L 37.493200,19.933100 L 37.274400,20.179200 L 37.602500,21.372600 L 38.219700,22.071800 C 38.572200,23.089400 38.920900,24.062000 39.383800,25.034700 C 40.101600,25.034700 40.778300,24.958500 41.491200,24.868700 L 41.491200,25.444900 L 40.619100,27.584100 L 39.819300,28.488400 L 39.165000,29.888800 C 39.165000,30.656400 39.165000,31.424000 39.165000,32.191500 L 39.383800,33.097800 L 39.020500,33.508000 L 38.219700,34.002100 L 37.383800,34.701300 L 38.075200,35.482600 L 37.129900,36.306800 L 37.311500,36.840000 L 35.893500,38.445500 L 34.949200,38.445500 L 34.149400,38.939600 L 33.639600,38.939600 L 33.639600,38.281400 L 33.422800,36.963000 C 33.141500,36.136800 32.848600,35.316500 32.550700,34.496200 C 32.550700,33.890700 32.586800,33.291100 32.623000,32.685700 L 32.987300,31.863400 L 32.477500,30.875100 L 32.514600,29.517700 L 31.823200,28.736400 L 32.168900,27.605500 L 31.606400,26.967300 L 30.624000,26.967300 L 30.296900,26.597200 L 29.315500,27.214900 L 28.916100,26.761300 L 28.006900,27.543000 C 27.389700,26.843300 26.771500,26.144100 26.153400,25.444900 L 25.426800,23.716400 L 26.081100,22.730100 L 25.717800,22.319000 L 26.516600,20.425400 C 27.172900,19.609000 27.858400,18.825800 28.551800,18.039700 L 29.788100,17.710600 L 31.169000,17.546500 L 32.114300,17.793600 L 33.459000,19.150000 L 33.931700,18.615800 L 34.585000,18.533800 L 35.821300,18.944900 L 36.766600,18.944900 L 37.420900,18.368700 L 37.711900,17.957600 L 37.056600,17.546500 L 35.965800,17.464500 C 35.663100,17.044600 35.381800,16.603200 35.022400,16.230100 L 34.658100,16.394200 L 34.512600,17.464500 L 33.858300,16.724300 L 33.713800,15.900100 L 32.987200,15.325900 L 32.695200,15.325900 L 33.422700,16.148200 L 33.131700,16.888400 L 32.550600,17.052500 L 32.913900,16.312300 L 32.258600,15.984200 L 31.678500,15.326000 L 30.586700,15.572100 L 30.442200,15.900200 L 29.787900,16.312300 L 29.424600,17.217600 L 28.516400,17.669700 L 28.116000,17.217600 L 27.680500,17.217600 L 27.680500,15.736200 L 28.625800,15.242100 L 29.352400,15.242100 L 29.205900,14.666900 L 28.625800,14.090700 L 29.606300,13.884600 L 30.151200,13.268400 L 30.586700,12.527200 L 31.387500,12.527200 L 31.168700,11.952000 L 31.678500,11.622900 L 31.678500,12.281100 L 32.768300,12.527200 L 33.858100,11.622900 L 33.931300,11.210800 L 34.875600,10.553100 C 34.533800,10.595600 34.192000,10.626800 33.858000,10.717700 L 33.858000,9.9766000 L 34.221300,9.1538000 L 33.858000,9.1538000 L 33.059600,9.8940000 L 32.840800,10.305600 L 33.059600,10.882300 L 32.695300,11.868600 L 32.114200,11.539500 L 31.606400,10.964300 L 30.805600,11.539500 L 30.514600,10.223600 L 31.895500,9.3188000 L 31.895500,8.8247000 L 32.768500,8.2490000 L 34.149400,7.9194000 L 35.094700,8.2490000 L 36.838800,8.5781000 L 36.403300,9.0713000 L 35.458000,9.0713000 L 36.403300,10.058600 L 37.129900,9.2363000 L 37.350600,8.8745000 C 37.350600,8.8745000 40.137700,11.372500 41.730500,14.105000 C 43.323300,16.838400 44.071300,20.060100 44.071300,20.714400 z "
+ id="path3224"
+ style="color:#000000;fill:url(#radialGradient1468);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3226"
+ style="color:#000000;fill:url(#radialGradient1470);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3230"
+ style="color:#000000;fill:url(#radialGradient1474);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 26.070300,9.2363000 L 25.997100,9.7295000 L 26.506900,10.058600 L 27.378000,9.4829000 L 26.942500,8.9892000 L 26.360500,9.3188000 L 26.070500,9.2363000"
+ id="path3232"
+ style="color:#000000;fill:url(#radialGradient1476);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3234"
+ style="color:#000000;fill:url(#radialGradient1478);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3238"
+ style="color:#000000;fill:url(#radialGradient1482);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 26.870100,5.8633000 L 24.979500,5.1226000 L 22.799800,5.3692000 L 20.109400,6.1094000 L 19.600600,6.6035000 L 21.272500,7.7549000 L 21.272500,8.4131000 L 20.618200,9.0713000 L 21.491200,10.800300 L 22.071300,10.470200 L 22.799800,9.3188000 C 23.922800,8.9716000 24.929700,8.5781000 25.997100,8.0844000 L 26.870100,5.8632000"
+ id="path3240"
+ style="color:#000000;fill:url(#radialGradient1484);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3242"
+ style="color:#000000;fill:url(#radialGradient1486);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3246"
+ style="color:#000000;fill:url(#radialGradient1490);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 28.833000,12.774900 L 28.542000,12.033700 L 28.032200,12.198700 L 28.178700,13.103000 L 28.833000,12.774900"
+ id="path3248"
+ style="color:#000000;fill:url(#radialGradient1492);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3250"
+ style="color:#000000;fill:url(#radialGradient1494);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3254"
+ style="color:#000000;fill:url(#radialGradient1498);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 29.123000,12.608900 L 28.977500,13.597200 L 29.777300,13.432200 L 30.358400,12.857000 L 29.849600,12.362900 C 29.678700,11.907800 29.482400,11.483000 29.268500,11.046500 L 28.833000,11.046500 L 28.833000,11.539700 L 29.123000,11.868800 L 29.123000,12.609000"
+ id="path3256"
+ style="color:#000000;fill:url(#radialGradient1500);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3258"
+ style="color:#000000;fill:url(#radialGradient1502);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3262"
+ style="color:#000000;fill:url(#radialGradient1506);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 18.365200,28.242200 L 17.783200,27.089900 L 16.692900,26.843300 L 16.111400,25.280800 L 14.657800,25.444900 L 13.422400,24.540600 L 12.113300,25.692000 L 12.113300,25.873600 C 11.717300,25.759300 11.230500,25.743700 10.877900,25.526900 L 10.586900,24.704600 L 10.586900,23.799300 L 9.7148000,23.881300 C 9.7876000,23.305100 9.8598000,22.729900 9.9331000,22.153800 L 9.4238000,22.153800 L 8.9155000,22.812000 L 8.4062000,23.058100 L 7.6791000,22.647900 L 7.6063000,21.742600 L 7.7518000,20.755300 L 8.8426000,19.933000 L 9.7147000,19.933000 L 9.8597000,19.438900 L 10.950000,19.685000 L 11.749800,20.673300 L 11.895300,19.026800 L 13.276600,17.875400 L 13.785400,16.641000 L 14.803000,16.229900 L 15.384500,15.407600 L 16.692600,15.159600 L 17.347400,14.173300 C 16.693100,14.173300 16.038800,14.173300 15.384500,14.173300 L 16.620300,13.597100 L 17.491900,13.597100 L 18.728200,13.185000 L 18.873700,12.692800 L 18.437200,12.280700 L 17.928400,12.115700 L 18.073900,11.622500 L 17.710600,10.882300 L 16.838000,11.210400 L 16.983500,10.552700 L 15.965900,9.9765000 L 15.166600,11.374400 L 15.238900,11.868500 L 14.439600,12.198600 L 13.930300,13.267900 L 13.712500,12.280600 L 12.331200,11.704400 L 12.112900,10.964200 L 13.930300,9.8939000 L 14.730100,9.1537000 L 14.802900,8.2489000 L 14.366900,8.0018000 L 13.785400,7.9193000 L 13.422100,8.8246000 C 13.422100,8.8246000 12.814200,8.9437000 12.657900,8.9823000 C 10.661800,10.821700 6.6286000,14.792400 5.6916000,22.288500 C 5.7287000,22.462300 6.3708000,23.470100 6.3708000,23.470100 L 7.8972000,24.374400 L 9.4236000,24.786500 L 10.078400,25.609700 L 11.095500,26.349900 L 11.677000,26.267900 L 12.113000,26.464200 L 12.113000,26.597000 L 11.531900,28.160000 L 11.095400,28.818200 L 11.240900,29.148300 L 10.877600,30.380700 L 12.186200,32.767400 L 13.494300,33.919700 L 14.076300,34.742000 L 14.003100,36.470500 L 14.439600,37.456800 L 14.003100,39.349400 C 14.003100,39.349400 13.968900,39.337700 14.024600,39.527100 C 14.080800,39.716600 16.353700,40.978300 16.498200,40.870900 C 16.642200,40.761500 16.765300,40.665800 16.765300,40.665800 L 16.620300,40.255600 L 17.201400,39.679400 L 17.419700,39.103200 L 18.365000,38.773100 L 19.091600,36.962600 L 18.873800,36.470400 L 19.381600,35.730200 L 20.472400,35.482200 L 21.054400,34.165800 L 20.908900,32.521300 L 21.781000,31.286900 L 21.926500,30.052500 C 20.733100,29.460700 19.549500,28.851300 18.365000,28.242000"
+ id="path3264"
+ style="color:#000000;fill:url(#radialGradient1508);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3266"
+ style="color:#000000;fill:url(#radialGradient1510);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3270"
+ style="color:#000000;fill:url(#radialGradient1514);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 16.765600,9.5649000 L 17.492200,10.058600 L 18.074200,10.058600 L 18.074200,9.4829000 L 17.347600,9.1538000 L 16.765600,9.5649000"
+ id="path3272"
+ style="color:#000000;fill:url(#radialGradient1516);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3274"
+ style="color:#000000;fill:url(#radialGradient1518);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3278"
+ style="color:#000000;fill:url(#radialGradient1522);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 14.876000,8.9072000 L 14.512200,9.8120000 L 15.239300,9.8120000 L 15.603100,8.9892000 C 15.916600,8.7675000 16.228600,8.5444000 16.547900,8.3310000 L 17.275000,8.5781000 C 17.759400,8.9072000 18.243800,9.2363000 18.728600,9.5649000 L 19.456100,8.9072000 L 18.655800,8.5781000 L 18.292000,7.8374000 L 16.911100,7.6728000 L 16.838300,7.2612000 L 16.184000,7.4262000 L 15.893600,8.0020000 L 15.529800,7.2613000 L 15.384800,7.5904000 L 15.457600,8.4132000 L 14.876000,8.9072000"
+ id="path3280"
+ style="color:#000000;fill:url(#radialGradient1524);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3282"
+ style="color:#000000;fill:url(#radialGradient1526);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ style="opacity:0.75000000;color:#000000;fill:url(#radialGradient1528);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ id="g3284">
+ <path
+ d=""
+ style="color:#000000;fill:url(#radialGradient1530);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ id="path3286" />
+ </g>
+ <g
+ id="g3288"
+ style="color:#000000;fill:url(#radialGradient1532);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d=""
+ id="path3290"
+ style="color:#000000;fill:url(#radialGradient1534);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3292"
+ style="color:#000000;fill:url(#radialGradient1536);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ style="opacity:0.75000000;color:#000000;fill:url(#radialGradient1538);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ id="g3294">
+ <path
+ d=""
+ style="color:#000000;fill:url(#radialGradient1540);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ id="path3296" />
+ </g>
+ <g
+ id="g3298"
+ style="color:#000000;fill:url(#radialGradient1542);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d=""
+ id="path3300"
+ style="color:#000000;fill:url(#radialGradient1544);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3302"
+ style="color:#000000;fill:url(#radialGradient1546);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3306"
+ style="color:#000000;fill:url(#radialGradient1550);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 17.492200,6.8496000 L 17.856000,6.5210000 L 18.583100,6.3564000 C 19.081100,6.1142000 19.581100,5.9511000 20.109500,5.7802000 L 19.819500,5.2865000 L 18.881000,5.4213000 L 18.437600,5.8632000 L 17.706600,5.9692000 L 17.056700,6.2744000 L 16.740800,6.4272000 L 16.547900,6.6855000 L 17.492200,6.8496000"
+ id="path3308"
+ style="color:#000000;fill:url(#radialGradient1552);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3310"
+ style="color:#000000;fill:url(#radialGradient1554);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3314"
+ style="color:#000000;fill:url(#radialGradient1558);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 18.728500,14.666500 L 19.165000,14.008300 L 18.510200,13.515100 L 18.728500,14.666500"
+ id="path3316"
+ style="color:#000000;fill:url(#radialGradient4756);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ </g>
+ <path
+ style="fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient4132);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+ d="M 42.975093,23.485534 C 42.975093,33.651354 34.733915,41.892440 24.569493,41.892440 C 14.404139,41.892440 6.1634261,33.651261 6.1634261,23.485534 C 6.1634261,13.320180 14.404139,5.0799340 24.569493,5.0799340 C 34.733915,5.0799340 42.975093,13.320180 42.975093,23.485534 L 42.975093,23.485534 z "
+ id="path4122" />
+ </g>
+</svg>
diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py
new file mode 100644
index 00000000..49a50647
--- /dev/null
+++ b/mediagoblin/media_types/video/processing.py
@@ -0,0 +1,119 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import tempfile
+import logging
+import os
+
+from mediagoblin import mg_globals as mgg
+from mediagoblin.processing import mark_entry_failed, \
+ THUMB_SIZE, MEDIUM_SIZE, create_pub_filepath
+from . import transcoders
+
+logging.basicConfig()
+
+_log = logging.getLogger(__name__)
+_log.setLevel(logging.DEBUG)
+
+
+def process_video(entry):
+ """
+ Code to process a video
+
+ Much of this code is derived from the arista-transcoder script in
+ the arista PyPI package and changed to match the needs of
+ MediaGoblin
+
+ This function sets up the arista video encoder in some kind of new thread
+ and attaches callbacks to that child process, hopefully, the
+ entry-complete callback will be called when the video is done.
+ """
+ video_config = mgg.global_config['media_type:mediagoblin.media_types.video']
+
+ workbench = mgg.workbench_manager.create_workbench()
+
+ queued_filepath = entry.queued_media_file
+ queued_filename = workbench.localized_file(
+ mgg.queue_store, queued_filepath,
+ 'source')
+
+ medium_filepath = create_pub_filepath(
+ entry,
+ '{original}-640p.webm'.format(
+ original=os.path.splitext(
+ queued_filepath[-1])[0] # Select the
+ ))
+
+ thumbnail_filepath = create_pub_filepath(
+ entry, 'thumbnail.jpg')
+
+
+ # Create a temporary file for the video destination
+ tmp_dst = tempfile.NamedTemporaryFile()
+
+ with tmp_dst:
+ # Transcode queued file to a VP8/vorbis file that fits in a 640x640 square
+ transcoder = transcoders.VideoTranscoder(queued_filename, tmp_dst.name)
+
+ # Push transcoded video to public storage
+ _log.debug('Saving medium...')
+ mgg.public_store.get_file(medium_filepath, 'wb').write(
+ tmp_dst.read())
+ _log.debug('Saved medium')
+
+ entry.media_files['webm_640'] = medium_filepath
+
+ # Save the width and height of the transcoded video
+ entry.media_data['video'] = {
+ u'width': transcoder.dst_data.videowidth,
+ u'height': transcoder.dst_data.videoheight}
+
+ # Create a temporary file for the video thumbnail
+ tmp_thumb = tempfile.NamedTemporaryFile()
+
+ with tmp_thumb:
+ # Create a thumbnail.jpg that fits in a 180x180 square
+ transcoders.VideoThumbnailer(queued_filename, tmp_thumb.name)
+
+ # Push the thumbnail to public storage
+ _log.debug('Saving thumbnail...')
+ mgg.public_store.get_file(thumbnail_filepath, 'wb').write(
+ tmp_thumb.read())
+ _log.debug('Saved thumbnail')
+
+ entry.media_files['thumb'] = thumbnail_filepath
+
+ if video_config['keep_original']:
+ # Push original file to public storage
+ queued_file = file(queued_filename, 'rb')
+
+ with queued_file:
+ original_filepath = create_pub_filepath(
+ entry,
+ queued_filepath[-1])
+
+ with mgg.public_store.get_file(original_filepath, 'wb') as \
+ original_file:
+ _log.debug('Saving original...')
+ original_file.write(queued_file.read())
+ _log.debug('Saved original')
+
+ entry.media_files['original'] = original_filepath
+
+ mgg.queue_store.delete_file(queued_filepath)
+
+ # Save the MediaEntry
+ entry.save()
diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py
new file mode 100644
index 00000000..7071b887
--- /dev/null
+++ b/mediagoblin/media_types/video/transcoders.py
@@ -0,0 +1,658 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import division
+
+import os
+os.putenv('GST_DEBUG_DUMP_DOT_DIR', '/tmp')
+
+import sys
+import logging
+import pdb
+import urllib
+
+_log = logging.getLogger(__name__)
+logging.basicConfig()
+_log.setLevel(logging.DEBUG)
+
+CPU_COUNT = 2
+try:
+ import multiprocessing
+ try:
+ CPU_COUNT = multiprocessing.cpu_count()
+ except NotImplementedError:
+ _log.warning('multiprocessing.cpu_count not implemented')
+ pass
+except ImportError:
+ _log.warning('Could not import multiprocessing, defaulting to 2 CPU cores')
+ pass
+
+try:
+ import gtk
+except:
+ raise Exception('Could not find pygtk')
+
+try:
+ import gobject
+ gobject.threads_init()
+except:
+ raise Exception('gobject could not be found')
+
+try:
+ import pygst
+ pygst.require('0.10')
+ import gst
+ from gst.extend import discoverer
+except:
+ raise Exception('gst/pygst 0.10 could not be found')
+
+
+class VideoThumbnailer:
+ # Declaration of thumbnailer states
+ STATE_NULL = 0
+ STATE_HALTING = 1
+ STATE_PROCESSING = 2
+
+ # The current thumbnailer state
+ state = STATE_NULL
+
+ # This will contain the thumbnailing pipeline
+ thumbnail_pipeline = None
+
+ buffer_probes = {}
+
+ def __init__(self, source_path, dest_path):
+ '''
+ Set up playbin pipeline in order to get video properties.
+
+ Initializes and runs the gobject.MainLoop()
+ '''
+ self.errors = []
+
+ self.source_path = source_path
+ self.dest_path = dest_path
+
+ self.loop = gobject.MainLoop()
+
+ # Set up the playbin. It will be used to discover certain
+ # properties of the input file
+ self.playbin = gst.element_factory_make('playbin')
+
+ self.videosink = gst.element_factory_make('fakesink', 'videosink')
+ self.playbin.set_property('video-sink', self.videosink)
+
+ self.audiosink = gst.element_factory_make('fakesink', 'audiosink')
+ self.playbin.set_property('audio-sink', self.audiosink)
+
+ self.bus = self.playbin.get_bus()
+ self.bus.add_signal_watch()
+ self.watch_id = self.bus.connect('message', self._on_bus_message)
+
+ self.playbin.set_property('uri', 'file:{0}'.format(
+ urllib.pathname2url(self.source_path)))
+
+ self.playbin.set_state(gst.STATE_PAUSED)
+
+ self.run()
+
+ def run(self):
+ self.loop.run()
+
+ def _on_bus_message(self, bus, message):
+ _log.debug(' BUS MESSAGE: {0}'.format(message))
+
+ if message.type == gst.MESSAGE_ERROR:
+ gobject.idle_add(self._on_bus_error)
+
+ elif message.type == gst.MESSAGE_STATE_CHANGED:
+ # The pipeline state has changed
+ # Parse state changing data
+ _prev, state, _pending = message.parse_state_changed()
+
+ _log.debug('State changed: {0}'.format(state))
+
+ if state == gst.STATE_PAUSED:
+ if message.src == self.playbin:
+ gobject.idle_add(self._on_bus_paused)
+
+ def _on_bus_paused(self):
+ '''
+ Set up thumbnailing pipeline
+ '''
+ current_video = self.playbin.get_property('current-video')
+
+ if current_video == 0:
+ _log.debug('Found current video from playbin')
+ else:
+ _log.error('Could not get any current video from playbin!')
+
+ self.duration = self._get_duration(self.playbin)
+ _log.info('Video length: {0}'.format(self.duration / gst.SECOND))
+
+ _log.info('Setting up thumbnailing pipeline')
+ self.thumbnail_pipeline = gst.parse_launch(
+ 'filesrc location="{0}" ! decodebin ! '
+ 'ffmpegcolorspace ! videoscale ! '
+ 'video/x-raw-rgb,depth=24,bpp=24,pixel-aspect-ratio=1/1,width=180 ! '
+ 'fakesink signal-handoffs=True'.format(self.source_path))
+
+ self.thumbnail_bus = self.thumbnail_pipeline.get_bus()
+ self.thumbnail_bus.add_signal_watch()
+ self.thumbnail_watch_id = self.thumbnail_bus.connect(
+ 'message', self._on_thumbnail_bus_message)
+
+ self.thumbnail_pipeline.set_state(gst.STATE_PAUSED)
+
+ #gobject.timeout_add(3000, self._on_timeout)
+
+ return False
+
+ def _on_thumbnail_bus_message(self, bus, message):
+ _log.debug('Thumbnail bus called, message: {0}'.format(message))
+
+ if message.type == gst.MESSAGE_ERROR:
+ _log.error(message)
+ gobject.idle_add(self._on_bus_error)
+
+ if message.type == gst.MESSAGE_STATE_CHANGED:
+ _prev, state, _pending = message.parse_state_changed()
+
+ if (state == gst.STATE_PAUSED and
+ not self.state == self.STATE_PROCESSING and
+ message.src == self.thumbnail_pipeline):
+ _log.info('Pipeline paused, processing')
+ self.state = self.STATE_PROCESSING
+
+ for sink in self.thumbnail_pipeline.sinks():
+ name = sink.get_name()
+ factoryname = sink.get_factory().get_name()
+
+ if factoryname == 'fakesink':
+ sinkpad = sink.get_pad('sink')
+
+ self.buffer_probes[name] = sinkpad.add_buffer_probe(
+ self.buffer_probe_handler, name)
+
+ _log.info('Added buffer probe')
+
+ break
+
+ # Apply the wadsworth constant, fallback to 1 second
+ seek_amount = max(self.duration / 100 * 30, 1 * gst.SECOND)
+
+ _log.debug('seek amount: {0}'.format(seek_amount))
+
+ seek_result = self.thumbnail_pipeline.seek(
+ 1.0,
+ gst.FORMAT_TIME,
+ gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
+ gst.SEEK_TYPE_SET,
+ seek_amount,
+ gst.SEEK_TYPE_NONE,
+ 0)
+
+ if not seek_result:
+ self.errors.append('COULD_NOT_SEEK')
+ _log.error('Couldn\'t seek! result: {0}'.format(
+ seek_result))
+ _log.info(message)
+ self.shutdown()
+ else:
+ pass
+ #self.thumbnail_pipeline.set_state(gst.STATE_PAUSED)
+ #pdb.set_trace()
+
+ def buffer_probe_handler_real(self, pad, buff, name):
+ '''
+ Capture buffers as gdk_pixbufs when told to.
+ '''
+ try:
+ caps = buff.caps
+ if caps is None:
+ _log.error('No caps passed to buffer probe handler!')
+ self.shutdown()
+ return False
+
+ _log.debug('caps: {0}'.format(caps))
+
+ filters = caps[0]
+ width = filters["width"]
+ height = filters["height"]
+
+ pixbuf = gtk.gdk.pixbuf_new_from_data(
+ buff.data, gtk.gdk.COLORSPACE_RGB, False, 8,
+ width, height, width * 3)
+
+ # NOTE: 200x136 is sort of arbitrary. it's larger than what
+ # the ui uses at the time of this writing.
+ # new_width, new_height = scaled_size((width, height), (200, 136))
+
+ #pixbuf = pixbuf.scale_simple(
+ #new_width, new_height, gtk.gdk.INTERP_BILINEAR)
+
+ pixbuf.save(self.dest_path, 'jpeg')
+ _log.info('Saved thumbnail')
+ del pixbuf
+ self.shutdown()
+ except gst.QueryError:
+ pass
+ return False
+
+ def buffer_probe_handler(self, pad, buff, name):
+ '''
+ Proxy function for buffer_probe_handler_real
+ '''
+ gobject.idle_add(
+ lambda: self.buffer_probe_handler_real(pad, buff, name))
+
+ return True
+
+ def _get_duration(self, pipeline, retries=0):
+ '''
+ Get the duration of a pipeline.
+
+ Retries 5 times.
+ '''
+ if retries == 5:
+ return 0
+
+ try:
+ return pipeline.query_duration(gst.FORMAT_TIME)[0]
+ except gst.QueryError:
+ return self._get_duration(pipeline, retries + 1)
+
+ def _on_timeout(self):
+ _log.error('TIMEOUT! DROP EVERYTHING!')
+ self.shutdown()
+
+ def _on_bus_error(self, *args):
+ _log.error('AHAHAHA! Error! args: {0}'.format(args))
+
+ def shutdown(self):
+ '''
+ Tell gobject to call __halt when the mainloop is idle.
+ '''
+ _log.info('Shutting down')
+ self.__halt()
+
+ def __halt(self):
+ '''
+ Halt all pipelines and shut down the main loop
+ '''
+ _log.info('Halting...')
+ self.state = self.STATE_HALTING
+
+ self.__disconnect()
+
+ gobject.idle_add(self.__halt_final)
+
+ def __disconnect(self):
+ _log.debug('Disconnecting...')
+ if not self.playbin is None:
+ self.playbin.set_state(gst.STATE_NULL)
+ for sink in self.playbin.sinks():
+ name = sink.get_name()
+ factoryname = sink.get_factory().get_name()
+
+ _log.debug('Disconnecting {0}'.format(name))
+
+ if factoryname == "fakesink":
+ pad = sink.get_pad("sink")
+ pad.remove_buffer_probe(self.buffer_probes[name])
+ del self.buffer_probes[name]
+
+ self.playbin = None
+
+ if self.bus is not None:
+ self.bus.disconnect(self.watch_id)
+ self.bus = None
+
+
+ def __halt_final(self):
+ _log.info('Done')
+ if self.errors:
+ _log.error(','.join(self.errors))
+
+ self.loop.quit()
+
+
+class VideoTranscoder:
+ '''
+ Video transcoder
+
+ Transcodes the SRC video file to a VP8 WebM video file at DST
+
+ - Does the same thing as VideoThumbnailer, but produces a WebM vp8
+ and vorbis video file.
+ - The VideoTranscoder exceeds the VideoThumbnailer in the way
+ that it was refined afterwards and therefore is done more
+ correctly.
+ '''
+ def __init__(self, src, dst, **kwargs):
+ _log.info('Initializing VideoTranscoder...')
+
+ self.loop = gobject.MainLoop()
+ self.source_path = src
+ self.destination_path = dst
+
+ # Options
+ self.destination_dimensions = kwargs.get('dimensions') or (640, 640)
+ self._progress_callback = kwargs.get('progress_callback') or None
+
+ if not type(self.destination_dimensions) == tuple:
+ raise Exception('dimensions must be tuple: (width, height)')
+
+ self._setup()
+ self._run()
+
+ def _setup(self):
+ self._setup_discover()
+ self._setup_pipeline()
+
+ def _run(self):
+ _log.info('Discovering...')
+ self.discoverer.discover()
+ _log.info('Done')
+
+ _log.debug('Initializing MainLoop()')
+ self.loop.run()
+
+ def _setup_discover(self):
+ _log.debug('Setting up discoverer')
+ self.discoverer = discoverer.Discoverer(self.source_path)
+
+ # Connect self.__discovered to the 'discovered' event
+ self.discoverer.connect('discovered', self.__discovered)
+
+ def __discovered(self, data, is_media):
+ '''
+ Callback for media discoverer.
+ '''
+ if not is_media:
+ self.__stop()
+ raise Exception('Could not discover {0}'.format(self.source_path))
+
+ _log.debug('__discovered, data: {0}'.format(data.__dict__))
+
+ self.data = data
+
+ # Launch things that should be done after discovery
+ self._link_elements()
+ self.__setup_videoscale_capsfilter()
+
+ # Tell the transcoding pipeline to start running
+ self.pipeline.set_state(gst.STATE_PLAYING)
+ _log.info('Transcoding...')
+
+ def _setup_pipeline(self):
+ _log.debug('Setting up transcoding pipeline')
+ # Create the pipeline bin.
+ self.pipeline = gst.Pipeline('VideoTranscoderPipeline')
+
+ # Create all GStreamer elements, starting with
+ # filesrc & decoder
+ self.filesrc = gst.element_factory_make('filesrc', 'filesrc')
+ self.filesrc.set_property('location', self.source_path)
+ self.pipeline.add(self.filesrc)
+
+ self.decoder = gst.element_factory_make('decodebin2', 'decoder')
+ self.decoder.connect('new-decoded-pad', self._on_dynamic_pad)
+ self.pipeline.add(self.decoder)
+
+ # Video elements
+ self.videoqueue = gst.element_factory_make('queue', 'videoqueue')
+ self.pipeline.add(self.videoqueue)
+
+ self.videorate = gst.element_factory_make('videorate', 'videorate')
+ self.pipeline.add(self.videorate)
+
+ self.ffmpegcolorspace = gst.element_factory_make(
+ 'ffmpegcolorspace', 'ffmpegcolorspace')
+ self.pipeline.add(self.ffmpegcolorspace)
+
+ self.videoscale = gst.element_factory_make('ffvideoscale', 'videoscale')
+ #self.videoscale.set_property('method', 2) # I'm not sure this works
+ #self.videoscale.set_property('add-borders', 0)
+ self.pipeline.add(self.videoscale)
+
+ self.capsfilter = gst.element_factory_make('capsfilter', 'capsfilter')
+ self.pipeline.add(self.capsfilter)
+
+ self.vp8enc = gst.element_factory_make('vp8enc', 'vp8enc')
+ self.vp8enc.set_property('quality', 6)
+ self.vp8enc.set_property('threads', 2)
+ self.pipeline.add(self.vp8enc)
+
+ # Audio elements
+ self.audioqueue = gst.element_factory_make('queue', 'audioqueue')
+ self.pipeline.add(self.audioqueue)
+
+ self.audiorate = gst.element_factory_make('audiorate', 'audiorate')
+ self.audiorate.set_property('tolerance', 80000000)
+ self.pipeline.add(self.audiorate)
+
+ self.audioconvert = gst.element_factory_make('audioconvert', 'audioconvert')
+ self.pipeline.add(self.audioconvert)
+
+ self.audiocapsfilter = gst.element_factory_make('capsfilter', 'audiocapsfilter')
+ audiocaps = ['audio/x-raw-float']
+ self.audiocapsfilter.set_property(
+ 'caps',
+ gst.caps_from_string(
+ ','.join(audiocaps)))
+ self.pipeline.add(self.audiocapsfilter)
+
+ self.vorbisenc = gst.element_factory_make('vorbisenc', 'vorbisenc')
+ self.vorbisenc.set_property('quality', 1)
+ self.pipeline.add(self.vorbisenc)
+
+ # WebMmux & filesink
+ self.webmmux = gst.element_factory_make('webmmux', 'webmmux')
+ self.pipeline.add(self.webmmux)
+
+ self.filesink = gst.element_factory_make('filesink', 'filesink')
+ self.filesink.set_property('location', self.destination_path)
+ self.pipeline.add(self.filesink)
+
+ # Progressreport
+ self.progressreport = gst.element_factory_make(
+ 'progressreport', 'progressreport')
+ # Update every second
+ self.progressreport.set_property('update-freq', 1)
+ self.progressreport.set_property('silent', True)
+ self.pipeline.add(self.progressreport)
+
+ def _link_elements(self):
+ '''
+ Link all the elements
+
+ This code depends on data from the discoverer and is called
+ from __discovered
+ '''
+ _log.debug('linking elements')
+ # Link the filesrc element to the decoder. The decoder then emits
+ # 'new-decoded-pad' which links decoded src pads to either a video
+ # or audio sink
+ self.filesrc.link(self.decoder)
+
+ # Link all the video elements in a row to webmmux
+ gst.element_link_many(
+ self.videoqueue,
+ self.videorate,
+ self.ffmpegcolorspace,
+ self.videoscale,
+ self.capsfilter,
+ self.vp8enc,
+ self.webmmux)
+
+ if self.data.is_audio:
+ # Link all the audio elements in a row to webmux
+ gst.element_link_many(
+ self.audioqueue,
+ self.audiorate,
+ self.audioconvert,
+ self.audiocapsfilter,
+ self.vorbisenc,
+ self.webmmux)
+
+ gst.element_link_many(
+ self.webmmux,
+ self.progressreport,
+ self.filesink)
+
+ # Setup the message bus and connect _on_message to the pipeline
+ self._setup_bus()
+
+
+ def _on_dynamic_pad(self, dbin, pad, islast):
+ '''
+ Callback called when ``decodebin2`` has a pad that we can connect to
+ '''
+ # Intersect the capabilities of the video sink and the pad src
+ # Then check if they have no common capabilities.
+ if self.ffmpegcolorspace.get_pad_template('sink')\
+ .get_caps().intersect(pad.get_caps()).is_empty():
+ # It is NOT a video src pad.
+ pad.link(self.audioqueue.get_pad('sink'))
+ else:
+ # It IS a video src pad.
+ pad.link(self.videoqueue.get_pad('sink'))
+
+ def _setup_bus(self):
+ self.bus = self.pipeline.get_bus()
+ self.bus.add_signal_watch()
+ self.bus.connect('message', self._on_message)
+
+ def __setup_videoscale_capsfilter(self):
+ '''
+ Sets up the output format (width, height) for the video
+ '''
+ caps = ['video/x-raw-yuv', 'pixel-aspect-ratio=1/1', 'framerate=30/1']
+
+ if self.data.videoheight > self.data.videowidth:
+ # Whoa! We have ourselves a portrait video!
+ caps.append('height={0}'.format(
+ self.destination_dimensions[1]))
+ else:
+ # It's a landscape, phew, how normal.
+ caps.append('width={0}'.format(
+ self.destination_dimensions[0]))
+
+ self.capsfilter.set_property(
+ 'caps',
+ gst.caps_from_string(
+ ','.join(caps)))
+
+ def _on_message(self, bus, message):
+ _log.debug((bus, message, message.type))
+
+ t = message.type
+
+ if t == gst.MESSAGE_EOS:
+ self._discover_dst_and_stop()
+ _log.info('Done')
+
+ elif t == gst.MESSAGE_ELEMENT:
+ if message.structure.get_name() == 'progress':
+ data = dict(message.structure)
+
+ if self._progress_callback:
+ self._progress_callback(data)
+
+ _log.info('{percent}% done...'.format(
+ percent=data.get('percent')))
+ _log.debug(data)
+
+ elif t == gst.MESSAGE_ERROR:
+ _log.error((bus, message))
+ self.__stop()
+
+ def _discover_dst_and_stop(self):
+ self.dst_discoverer = discoverer.Discoverer(self.destination_path)
+
+ self.dst_discoverer.connect('discovered', self.__dst_discovered)
+
+ self.dst_discoverer.discover()
+
+
+ def __dst_discovered(self, data, is_media):
+ self.dst_data = data
+
+ self.__stop()
+
+ def __stop(self):
+ _log.debug(self.loop)
+
+ # Stop executing the pipeline
+ self.pipeline.set_state(gst.STATE_NULL)
+
+ # This kills the loop, mercifully
+ gobject.idle_add(self.__stop_mainloop)
+
+ def __stop_mainloop(self):
+ '''
+ Wrapper for gobject.MainLoop.quit()
+
+ This wrapper makes us able to see if self.loop.quit has been called
+ '''
+ _log.info('Terminating MainLoop')
+
+ self.loop.quit()
+
+
+if __name__ == '__main__':
+ os.nice(19)
+ from optparse import OptionParser
+
+ parser = OptionParser(
+ usage='%prog [-v] -a [ video | thumbnail ] SRC DEST')
+
+ parser.add_option('-a', '--action',
+ dest='action',
+ help='One of "video" or "thumbnail"')
+
+ parser.add_option('-v',
+ dest='verbose',
+ action='store_true',
+ help='Output debug information')
+
+ parser.add_option('-q',
+ dest='quiet',
+ action='store_true',
+ help='Dear program, please be quiet unless *error*')
+
+ (options, args) = parser.parse_args()
+
+ if options.verbose:
+ _log.setLevel(logging.DEBUG)
+ else:
+ _log.setLevel(logging.INFO)
+
+ if options.quiet:
+ _log.setLevel(logging.ERROR)
+
+ _log.debug(args)
+
+ if not len(args) == 2:
+ parser.print_help()
+ sys.exit()
+
+ if options.action == 'thumbnail':
+ VideoThumbnailer(*args)
+ elif options.action == 'video':
+ def cb(data):
+ print('I\'m a callback!')
+ transcoder = VideoTranscoder(*args, progress_callback=cb)
diff --git a/mediagoblin/messages.py b/mediagoblin/messages.py
index dc82fbf6..054d46c0 100644
--- a/mediagoblin/messages.py
+++ b/mediagoblin/messages.py
@@ -20,11 +20,13 @@ SUCCESS = 'success'
WARNING = 'warning'
ERROR = 'error'
+
def add_message(request, level, text):
messages = request.session.setdefault('messages', [])
messages.append({'level': level, 'text': text})
request.session.save()
+
def fetch_messages(request, clear_from_session=True):
messages = request.session.get('messages')
if messages and clear_from_session:
diff --git a/mediagoblin/process_media/errors.py b/mediagoblin/process_media/errors.py
deleted file mode 100644
index 8003ffaf..00000000
--- a/mediagoblin/process_media/errors.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
-
-class BaseProcessingFail(Exception):
- """
- Base exception that all other processing failure messages should
- subclass from.
-
- You shouldn't call this itself; instead you should subclass it
- and provid the exception_path and general_message applicable to
- this error.
- """
- general_message = u''
-
- @property
- def exception_path(self):
- return u"%s:%s" % (
- self.__class__.__module__, self.__class__.__name__)
-
- def __init__(self, **metadata):
- self.metadata = metadata or {}
-
-
-class BadMediaFail(BaseProcessingFail):
- """
- Error that should be raised when an inappropriate file was given
- for the media type specified.
- """
- general_message = _(u'Invalid file given for media type.')
diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/processing.py
index 2b9eed6e..cbac8030 100644
--- a/mediagoblin/process_media/__init__.py
+++ b/mediagoblin/processing.py
@@ -14,14 +14,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import Image
-
from celery.task import Task
-from celery import registry
from mediagoblin.db.util import ObjectId
from mediagoblin import mg_globals as mgg
-from mediagoblin.process_media.errors import BaseProcessingFail, BadMediaFail
+
+from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
+
+from mediagoblin.media_types import get_media_manager
THUMB_SIZE = 180, 180
@@ -31,7 +31,7 @@ MEDIUM_SIZE = 640, 640
def create_pub_filepath(entry, filename):
return mgg.public_store.get_unique_filepath(
['media_entries',
- unicode(entry['_id']),
+ unicode(entry._id),
filename])
@@ -41,6 +41,8 @@ def create_pub_filepath(entry, filename):
class ProcessMedia(Task):
"""
+ DEPRECATED -- This now resides in the individual media plugins
+
Pass this entry off for processing.
"""
def run(self, media_id):
@@ -53,37 +55,39 @@ class ProcessMedia(Task):
# Try to process, and handle expected errors.
try:
- process_image(entry)
+ #__import__(entry.media_type)
+ manager = get_media_manager(entry.media_type)
+ manager['processor'](entry)
except BaseProcessingFail, exc:
- mark_entry_failed(entry[u'_id'], exc)
+ mark_entry_failed(entry._id, exc)
return
+ except ImportError, exc:
+ mark_entry_failed(entry[u'_id'], exc)
- entry['state'] = u'processed'
+ entry.state = u'processed'
entry.save()
def on_failure(self, exc, task_id, args, kwargs, einfo):
"""
If the processing failed we should mark that in the database.
- Assuming that the exception raised is a subclass of BaseProcessingFail,
- we can use that to get more information about the failure and store that
- for conveying information to users about the failure, etc.
+ Assuming that the exception raised is a subclass of
+ BaseProcessingFail, we can use that to get more information
+ about the failure and store that for conveying information to
+ users about the failure, etc.
"""
entry_id = args[0]
mark_entry_failed(entry_id, exc)
-process_media = registry.tasks[ProcessMedia.name]
-
-
def mark_entry_failed(entry_id, exc):
"""
Mark a media entry as having failed in its conversion.
- Uses the exception that was raised to mark more information. If the
- exception is a derivative of BaseProcessingFail then we can store extra
- information that can be useful for users telling them why their media failed
- to process.
+ Uses the exception that was raised to mark more information. If
+ the exception is a derivative of BaseProcessingFail then we can
+ store extra information that can be useful for users telling them
+ why their media failed to process.
Args:
- entry_id: The id of the media entry
@@ -111,69 +115,29 @@ def mark_entry_failed(entry_id, exc):
u'fail_metadata': {}}})
-def process_image(entry):
- """
- Code to process an image
+class BaseProcessingFail(Exception):
"""
- workbench = mgg.workbench_manager.create_workbench()
-
- queued_filepath = entry['queued_media_file']
- queued_filename = workbench.localized_file(
- mgg.queue_store, queued_filepath,
- 'source')
-
- try:
- thumb = Image.open(queued_filename)
- except IOError:
- raise BadMediaFail()
+ Base exception that all other processing failure messages should
+ subclass from.
- thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS)
- # ensure color mode is compatible with jpg
- if thumb.mode != "RGB":
- thumb = thumb.convert("RGB")
-
- thumb_filepath = create_pub_filepath(entry, 'thumbnail.jpg')
- thumb_file = mgg.public_store.get_file(thumb_filepath, 'w')
-
- with thumb_file:
- thumb.save(thumb_file, "JPEG", quality=90)
-
- # If the size of the original file exceeds the specified size of a `medium`
- # file, a `medium.jpg` files is created and later associated with the media
- # entry.
- medium = Image.open(queued_filename)
- medium_processed = False
-
- if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]:
- medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS)
-
- if medium.mode != "RGB":
- medium = medium.convert("RGB")
-
- medium_filepath = create_pub_filepath(entry, 'medium.jpg')
- medium_file = mgg.public_store.get_file(medium_filepath, 'w')
-
- with medium_file:
- medium.save(medium_file, "JPEG", quality=90)
- medium_processed = True
-
- # we have to re-read because unlike PIL, not everything reads
- # things in string representation :)
- queued_file = file(queued_filename, 'rb')
+ You shouldn't call this itself; instead you should subclass it
+ and provid the exception_path and general_message applicable to
+ this error.
+ """
+ general_message = u''
- with queued_file:
- original_filepath = create_pub_filepath(entry, queued_filepath[-1])
+ @property
+ def exception_path(self):
+ return u"%s:%s" % (
+ self.__class__.__module__, self.__class__.__name__)
- with mgg.public_store.get_file(original_filepath, 'wb') as original_file:
- original_file.write(queued_file.read())
+ def __init__(self, **metadata):
+ self.metadata = metadata or {}
- mgg.queue_store.delete_file(queued_filepath)
- entry['queued_media_file'] = []
- media_files_dict = entry.setdefault('media_files', {})
- media_files_dict['thumb'] = thumb_filepath
- media_files_dict['original'] = original_filepath
- if medium_processed:
- media_files_dict['medium'] = medium_filepath
- # clean up workbench
- workbench.destroy_self()
+class BadMediaFail(BaseProcessingFail):
+ """
+ Error that should be raised when an inappropriate file was given
+ for the media type specified.
+ """
+ general_message = _(u'Invalid file given for media type.')
diff --git a/mediagoblin/routing.py b/mediagoblin/routing.py
index ae56f8cb..bd727db5 100644
--- a/mediagoblin/routing.py
+++ b/mediagoblin/routing.py
@@ -21,6 +21,8 @@ from mediagoblin.submit.routing import submit_routes
from mediagoblin.user_pages.routing import user_routes
from mediagoblin.edit.routing import edit_routes
from mediagoblin.listings.routing import tag_routes
+from mediagoblin.webfinger.routing import webfinger_well_known_routes, \
+ webfinger_routes
def get_mapper():
@@ -36,5 +38,7 @@ def get_mapper():
mapping.extend(user_routes, '/u')
mapping.extend(edit_routes, '/edit')
mapping.extend(tag_routes, '/tag')
+ mapping.extend(webfinger_well_known_routes, '/.well-known')
+ mapping.extend(webfinger_routes, '/api/webfinger')
return mapping
diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css
index 0dadacd0..efd7b561 100644
--- a/mediagoblin/static/css/base.css
+++ b/mediagoblin/static/css/base.css
@@ -29,12 +29,10 @@ body {
background-color: #111;
background-image: url("../images/background.png");
color: #C3C3C3;
- font-family: sans-serif;
padding: none;
margin: 0px;
height: 100%;
- font: 16px "HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif;
- font-family:'Lato', sans-serif;
+ font: 16px 'Lato', 'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;
}
form {
@@ -44,24 +42,35 @@ form {
/* text styles */
-h1{
- margin-bottom: 15px;
+h1,h2,h3,p {
+ margin-bottom: 20px;
+}
+
+h1,h2,h3 {
+ font-weight: bold;
+}
+
+h1 {
margin-top: 15px;
color: #fff;
font-size: 1.875em;
}
-h2{
+h2 {
font-size: 1.375em;
margin-top: 20px;
color: #fff;
}
-h3{
+h3 {
border-bottom: 1px solid #333;
font-size: 1.125em;
}
+p {
+ margin-top: 0px;
+}
+
a {
color: #86D4B1;
}
@@ -81,67 +90,100 @@ input, textarea {
/* website structure */
-.mediagoblin_body {
- position: relative;
- min-height: 100%;
+.container {
+ margin: auto;
+ width: 96%;
+ max-width: 940px;
}
-.mediagoblin_header {
+header {
+ width: 100%;
height: 36px;
padding-top: 14px;
margin-bottom: 20px;
border-bottom: 1px solid #333;
}
-a.mediagoblin_logo{
+.header_right {
+ float: right;
+}
+
+a.logo {
color: #fff;
font-weight: bold;
+ margin-right: 8px;
}
-.header_submit, .header_submit_highlight{
- color: #272727;
- background-color: #aaa;
- background-image: -webkit-gradient(linear, left top, left bottom, from(##D2D2D2), to(#aaa));
- background-image: -webkit-linear-gradient(top, #D2D2D2, #aaa);
- background-image: -moz-linear-gradient(top, #D2D2D2, #aaa);
- background-image: -ms-linear-gradient(top, #D2D2D2, #aaa);
- background-image: -o-linear-gradient(top, #D2D2D2, #aaa);
- background-image: linear-gradient(top, #D2D2D2, #aaa);
- box-shadow: 0px 0px 4px #000;
- border-radius: 3px;
- margin: 8px;
- padding: 3px 8px;
- text-decoration: none;
- border: medium none;
- font-style: normal;
- font-weight: bold;
- font-size: 1em;
+.logo img {
+ vertical-align: middle;
}
-.header_submit_highlight{
-background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109, 173, 144));
+.mediagoblin_content {
+ width: 100%;
+ padding-bottom: 74px;
}
-.mediagoblin_footer {
+footer {
+ width: 100%;
height: 30px;
border-top: 1px solid #333;
bottom: 0px;
padding-top: 8px;
text-align: center;
font-size: 0.875em;
+ clear: both;
}
-.mediagoblin_content {
- padding-bottom: 74px;
+.media_pane {
+ width: 640px;
+ margin-left: 0px;
+ margin-right: 10px;
+ float: left;
}
-.mediagoblin_header_right {
- float: right;
+.media_sidebar {
+ width: 280px;
+ margin-left: 10px;
+ margin-right: 0px;
+ float: left;
+}
+
+.profile_sidebar {
+ width: 340px;
+ margin-right: 10px;
+ float: left;
+}
+
+.profile_showcase {
+ width: 580px;
+ margin-left: 10px;
+ float: left;
}
/* common website elements */
-.button, .cancel_link {
+.button_action, .button_action_highlight {
+ display: inline-block;
+ color: #c3c3c3;
+ background-color: #363636;
+ border: 1px solid;
+ border-color: #464646 #2B2B2B #252525;
+ border-radius: 4px;
+ padding: 3px 8px;
+ font-size: 16px;
+ text-decoration: none;
+ font-style: normal;
+ font-weight: bold;
+ cursor: pointer;
+}
+
+.button_action_highlight {
+ background-color: #86D4B1;
+ border-color: #A2DEC3 #6CAA8E #5C9179;
+ color: #283F35;
+}
+
+.button_form, .cancel_link {
height: 32px;
min-width: 99px;
background-color: #86d4b1;
@@ -174,34 +216,61 @@ background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109,
background-image: linear-gradient(top, #D2D2D2, #aaa);
}
-.pagination{
+.pagination {
text-align: center;
}
-.pagination_arrow{
+.pagination_arrow {
margin: 5px;
}
-.empty_space{
- background-color: #222;
+.empty_space {
+ background-image: url("../images/empty_back.png");
font-style: italic;
text-align: center;
height: 160px;
padding-top: 70px;
}
+.right_align {
+ float: right;
+}
+
+textarea#comment_content {
+ resize: vertical;
+ width: 634px;
+ height: 90px;
+ border: none;
+ background-color: #f1f1f1;
+ padding: 3px;
+}
+
+.clear {
+ clear: both;
+ display: block;
+ overflow: hidden;
+ visibility: hidden;
+ width: 0;
+ height: 0;
+}
+
/* forms */
-.form_box {
+.form_box,.form_box_xl {
background-color: #222;
background-image: url("../images/background_lines.png");
background-repeat: repeat-x;
- padding-bottom: 30px;
- padding-top: 30px;
- margin-left: auto;
- margin-right: auto;
+ padding: 3% 5%;
display: block;
float: none;
+ width: 90%;
+ max-width: 340px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.form_box_xl {
+ max-width: 460px;
}
.edit_box {
@@ -212,7 +281,11 @@ text-align: center;
width: 100%;
}
-.form_field_label,.form_field_input {
+.form_field_input {
+ margin-bottom: 10px;
+}
+
+.form_field_label {
margin-bottom: 4px;
}
@@ -237,6 +310,15 @@ text-align: center;
text-align: right;
}
+#password_boolean {
+ margin-top: 4px;
+ width: 20px;
+}
+
+textarea#description, textarea#bio {
+ resize: vertical;
+}
+
/* comments */
.comment_author {
@@ -245,8 +327,20 @@ text-align: center;
font-size: 0.9em;
}
+.comment_content {
+ margin-bottom: 30px;
+}
+
.comment_content p {
- margin-bottom: 4px;
+ margin-bottom: 0px;
+}
+
+textarea#comment_content {
+ width: 634px;
+ height: 90px;
+ border: none;
+ background-color: #f1f1f1;
+ padding: 3px;
}
/* media galleries */
@@ -268,41 +362,51 @@ text-align: center;
/* media detail */
-h2.media_title{
+h2.media_title {
margin-bottom: 0px;
}
-p.media_uploader{
+p.media_specs {
font-size: 0.9em;
+ border-top: 1px solid #222;
+ padding: 10px 0px;
+ color: #888;
+}
+
+.no_html5 {
+ background: black;
+ color: white;
+ text-align: center;
+ height: 160px;
+ padding: 130px 10px 20px 10px;
}
/* icons */
-img.media_icon{
+img.media_icon {
margin: 0 4px;
vertical-align: sub;
}
/* navigation */
-.navigation_button{
- width: 139px;
+.navigation_button {
+ width: 135px;
display: block;
float: left;
text-align: center;
- background-color: #222;
+ background-color: #1d1d1d;
+ border: 1px solid;
+ border-color: #2c2c2c #232323 #1a1a1a;
+ border-radius: 4px;
text-decoration: none;
- padding: 12px 0pt;
- font-size: 2em;
+ padding: 12px 0 16px;
+ font-size: 1.4em;
margin: 0 0 20px
}
-p.navigation_button{
- color: #272727;
-}
-
-.navigation_left{
- margin-right: 2px;
+.navigation_left {
+ margin-right: 6px;
}
/* messages */
@@ -310,6 +414,7 @@ p.navigation_button{
ul.mediagoblin_messages {
list-style: none inside;
color: #f7f7f7;
+ padding: 0;
}
.mediagoblin_messages li {
@@ -368,3 +473,37 @@ table.media_panel th {
margin-top: 10px;
margin-left: 10px;
}
+
+/* ASCII art */
+
+@font-face {
+ font-family: Inconsolata;
+ src: local('Inconsolata'), url('../fonts/Inconsolata.otf') format('opentype')
+}
+
+.ascii-wrapper pre {
+ font-family: Inconsolata, monospace;
+ line-height: 1em;
+}
+
+/* Media queries and other responsivisivity */
+@media screen and (max-width: 680px) {
+ .media_pane {
+ width: 100%;
+ margin: 0px;
+ }
+ img.media_image {
+ width: 100%;
+ }
+}
+
+@media screen and (max-width: 960px) {
+ .profile_sidebar {
+ width: 100%;
+ margin: 0px;
+ }
+ .profile_showcase {
+ width: 100%;
+ margin: 0px;
+ }
+}
diff --git a/mediagoblin/static/css/extlib/960_16_col.css b/mediagoblin/static/css/extlib/960_16_col.css
deleted file mode 120000
index d4e43898..00000000
--- a/mediagoblin/static/css/extlib/960_16_col.css
+++ /dev/null
@@ -1 +0,0 @@
-../../../../extlib/960.gs/960_16_col.css \ No newline at end of file
diff --git a/mediagoblin/static/css/extlib/reset.css b/mediagoblin/static/css/extlib/reset.css
index 65d06d34..6084e137 120000
--- a/mediagoblin/static/css/extlib/reset.css
+++ b/mediagoblin/static/css/extlib/reset.css
@@ -1 +1 @@
-../../../../extlib/960.gs/reset.css \ No newline at end of file
+../../../../extlib/reset/reset.css \ No newline at end of file
diff --git a/mediagoblin/static/css/extlib/text.css b/mediagoblin/static/css/extlib/text.css
deleted file mode 120000
index 2d864de4..00000000
--- a/mediagoblin/static/css/extlib/text.css
+++ /dev/null
@@ -1 +0,0 @@
-../../../../extlib/960.gs/text.css \ No newline at end of file
diff --git a/mediagoblin/static/fonts/Inconsolata.otf b/mediagoblin/static/fonts/Inconsolata.otf
new file mode 120000
index 00000000..777be657
--- /dev/null
+++ b/mediagoblin/static/fonts/Inconsolata.otf
@@ -0,0 +1 @@
+../../../extlib/inconsolata/Inconsolata.otf \ No newline at end of file
diff --git a/mediagoblin/static/images/empty_back.png b/mediagoblin/static/images/empty_back.png
new file mode 100644
index 00000000..3522ddd3
--- /dev/null
+++ b/mediagoblin/static/images/empty_back.png
Binary files differ
diff --git a/mediagoblin/static/images/icon_comment.png b/mediagoblin/static/images/icon_comment.png
new file mode 100644
index 00000000..76860a92
--- /dev/null
+++ b/mediagoblin/static/images/icon_comment.png
Binary files differ
diff --git a/mediagoblin/static/images/icon_delete.png b/mediagoblin/static/images/icon_delete.png
deleted file mode 100644
index 9d76a5db..00000000
--- a/mediagoblin/static/images/icon_delete.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/icon_edit.png b/mediagoblin/static/images/icon_edit.png
deleted file mode 100644
index 480c73ad..00000000
--- a/mediagoblin/static/images/icon_edit.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/media_thumbs/video.jpg b/mediagoblin/static/images/media_thumbs/video.jpg
new file mode 100644
index 00000000..841dc796
--- /dev/null
+++ b/mediagoblin/static/images/media_thumbs/video.jpg
Binary files differ
diff --git a/mediagoblin/static/images/navigation_end.png b/mediagoblin/static/images/navigation_end.png
deleted file mode 100644
index b2f27296..00000000
--- a/mediagoblin/static/images/navigation_end.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/navigation_left.png b/mediagoblin/static/images/navigation_left.png
deleted file mode 100644
index d1645120..00000000
--- a/mediagoblin/static/images/navigation_left.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/navigation_right.png b/mediagoblin/static/images/navigation_right.png
deleted file mode 100644
index d4caa7b8..00000000
--- a/mediagoblin/static/images/navigation_right.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/pagination_left.png b/mediagoblin/static/images/pagination_left.png
deleted file mode 100644
index 56a26596..00000000
--- a/mediagoblin/static/images/pagination_left.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/pagination_right.png b/mediagoblin/static/images/pagination_right.png
deleted file mode 100644
index 84f8abba..00000000
--- a/mediagoblin/static/images/pagination_right.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/js/comment_show.js b/mediagoblin/static/js/comment_show.js
new file mode 100644
index 00000000..2212b9ad
--- /dev/null
+++ b/mediagoblin/static/js/comment_show.js
@@ -0,0 +1,9 @@
+$(document).ready(function(){
+ $('#form_comment').hide();
+ $('#button_addcomment').click(function(){
+ $(this).fadeOut('fast');
+ $('#form_comment').slideDown(function(){
+ $('#comment_content').focus();
+ });
+ });
+});
diff --git a/mediagoblin/static/js/extlib/html5shiv.js b/mediagoblin/static/js/extlib/html5shiv.js
new file mode 120000
index 00000000..ca7358c7
--- /dev/null
+++ b/mediagoblin/static/js/extlib/html5shiv.js
@@ -0,0 +1 @@
+../../../../extlib/html5shiv/html5shiv.js \ No newline at end of file
diff --git a/mediagoblin/static/js/extlib/jquery.js b/mediagoblin/static/js/extlib/jquery.js
new file mode 120000
index 00000000..d78f5cc3
--- /dev/null
+++ b/mediagoblin/static/js/extlib/jquery.js
@@ -0,0 +1 @@
+../../../../extlib/jquery/jquery.js \ No newline at end of file
diff --git a/mediagoblin/static/js/show_password.js b/mediagoblin/static/js/show_password.js
new file mode 100644
index 00000000..519b29c1
--- /dev/null
+++ b/mediagoblin/static/js/show_password.js
@@ -0,0 +1,19 @@
+$(document).ready(function(){
+ $("#password").after('<input type="text" value="" name="password_clear" id="password_clear" /><label><input type="checkbox" id="password_boolean" />Show password</label>');
+ $('#password_clear').hide();
+ $('#password_boolean').click(function(){
+ if($('#password_boolean').prop("checked")) {
+ $('#password_clear').val($('#password').val());
+ $('#password').hide();
+ $('#password_clear').show();
+ } else {
+ $('#password').val($('#password_clear').val());
+ $('#password_clear').hide();
+ $('#password').show();
+ };
+ });
+ $('#password,#password_clear').keyup(function(){
+ $('#password').val($(this).val());
+ $('#password_clear').val($(this).val());
+ });
+});
diff --git a/mediagoblin/staticdirect.py b/mediagoblin/staticdirect.py
index 58175881..2bddb160 100644
--- a/mediagoblin/staticdirect.py
+++ b/mediagoblin/staticdirect.py
@@ -14,31 +14,34 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import pkg_resources
-import urlparse
-
####################################
# Staticdirect infrastructure.
# Borrowed largely from cc.engine
# by Chris Webber & Creative Commons
-#
+#
# This needs documentation!
####################################
import pkg_resources
-import urlparse
+import logging
+
+_log = logging.getLogger(__name__)
+
class StaticDirect(object):
def __init__(self):
self.cache = {}
def __call__(self, filepath):
- if self.cache.has_key(filepath):
+ if filepath in self.cache:
return self.cache[filepath]
+ if not pkg_resources.resource_exists('mediagoblin',
+ 'static' + filepath):
+ _log.info("StaticDirect resource %r not found locally",
+ filepath)
static_direction = self.cache[filepath] = self.get(filepath)
return static_direction
-
def get(self, filepath):
# should be implemented by the individual staticdirector
diff --git a/mediagoblin/storage/__init__.py b/mediagoblin/storage/__init__.py
index 9e592b9e..0840614b 100644
--- a/mediagoblin/storage/__init__.py
+++ b/mediagoblin/storage/__init__.py
@@ -169,6 +169,18 @@ class StorageInterface(object):
with file(dest_path, 'wb') as dest_file:
dest_file.write(source_file.read())
+ def copy_local_to_storage(self, filename, filepath):
+ """
+ Copy this file from locally to the storage system.
+
+ This is kind of the opposite of copy_locally. It's likely you
+ could override this method with something more appropriate to
+ your storage system.
+ """
+ with self.get_file(filepath, 'wb') as dest_file:
+ with file(filename, 'rb') as source_file:
+ dest_file.write(source_file.read())
+
###########
# Utilities
diff --git a/mediagoblin/storage/cloudfiles.py b/mediagoblin/storage/cloudfiles.py
index b1dd9450..51b73579 100644
--- a/mediagoblin/storage/cloudfiles.py
+++ b/mediagoblin/storage/cloudfiles.py
@@ -27,6 +27,7 @@ from mediagoblin.storage import StorageInterface, clean_listy_filepath
import cloudfiles
import mimetypes
+
class CloudFilesStorage(StorageInterface):
'''
OpenStack/Rackspace Cloud's Swift/CloudFiles support
@@ -97,8 +98,14 @@ class CloudFilesStorage(StorageInterface):
def delete_file(self, filepath):
# TODO: Also delete unused directories if empty (safely, with
# checks to avoid race conditions).
- self.container.delete_object(
- self._resolve_filepath(filepath))
+ try:
+ self.container.delete_object(
+ self._resolve_filepath(filepath))
+ except cloudfiles.container.ResponseError:
+ pass
+ finally:
+ pass
+
def file_url(self, filepath):
return '/'.join([
diff --git a/mediagoblin/storage/filestorage.py b/mediagoblin/storage/filestorage.py
index 22d6eb5a..a904865f 100644
--- a/mediagoblin/storage/filestorage.py
+++ b/mediagoblin/storage/filestorage.py
@@ -20,6 +20,7 @@ from mediagoblin.storage import (
NoWebServing)
import os
+import shutil
import urlparse
@@ -76,3 +77,16 @@ class BasicFileStorage(StorageInterface):
def get_local_path(self, filepath):
return self._resolve_filepath(filepath)
+
+ def copy_local_to_storage(self, filename, filepath):
+ """
+ Copy this file from locally to the storage system.
+ """
+ # Make directories if necessary
+ if len(filepath) > 1:
+ directory = self._resolve_filepath(filepath[:-1])
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+ shutil.copy(
+ filename, self.get_local_path(filepath))
diff --git a/mediagoblin/submit/__init__.py b/mediagoblin/submit/__init__.py
index 576bd0f5..ba347c69 100644
--- a/mediagoblin/submit/__init__.py
+++ b/mediagoblin/submit/__init__.py
@@ -13,5 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py
index be85b9a9..08234822 100644
--- a/mediagoblin/submit/forms.py
+++ b/mediagoblin/submit/forms.py
@@ -27,10 +27,15 @@ class SubmitStartForm(wtforms.Form):
_('Title'),
[wtforms.validators.Length(min=0, max=500)])
description = wtforms.TextAreaField(
- _('Description of this work'))
+ _('Description of this work'),
+ description=_("""You can use
+ <a href="http://daringfireball.net/projects/markdown/basics">
+ Markdown</a> for formatting."""))
tags = wtforms.TextField(
_('Tags'),
- [tag_length_validator])
+ [tag_length_validator],
+ description=_(
+ "Separate tags by commas."))
license = wtforms.SelectField(
_('License'),
choices=licenses_as_choices())
diff --git a/mediagoblin/submit/security.py b/mediagoblin/submit/security.py
index 9d62a36e..6708baf7 100644
--- a/mediagoblin/submit/security.py
+++ b/mediagoblin/submit/security.py
@@ -16,9 +16,9 @@
from mimetypes import guess_type
-
ALLOWED = ['image/jpeg', 'image/png', 'image/tiff', 'image/gif']
+
def check_filetype(posted_file):
if not guess_type(posted_file.filename)[0] in ALLOWED:
return False
diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py
index ecfa9943..c3f5699e 100644
--- a/mediagoblin/submit/views.py
+++ b/mediagoblin/submit/views.py
@@ -19,6 +19,8 @@ import uuid
from os.path import splitext
from cgi import FieldStorage
+from celery import registry
+
from werkzeug.utils import secure_filename
from mediagoblin.db.util import ObjectId
@@ -27,8 +29,10 @@ from mediagoblin.tools.translate import pass_to_ugettext as _
from mediagoblin.tools.response import render_to_response, redirect
from mediagoblin.decorators import require_active_login
from mediagoblin.submit import forms as submit_forms, security
-from mediagoblin.process_media import process_media, mark_entry_failed
+from mediagoblin.processing import mark_entry_failed, ProcessMedia
from mediagoblin.messages import add_message, SUCCESS
+from mediagoblin.media_types import get_media_type_and_manager, \
+ InvalidFileType, FileTypeNotSupported
@require_active_login
@@ -39,93 +43,108 @@ def submit_start(request):
submit_form = submit_forms.SubmitStartForm(request.POST)
if request.method == 'POST' and submit_form.validate():
- if not (request.POST.has_key('file')
+ if not ('file' in request.POST
and isinstance(request.POST['file'], FieldStorage)
and request.POST['file'].file):
submit_form.file.errors.append(
_(u'You must provide a file.'))
- elif not security.check_filetype(request.POST['file']):
- submit_form.file.errors.append(
- _(u"The file doesn't seem to be an image!"))
else:
- filename = request.POST['file'].filename
-
- # create entry and save in database
- entry = request.db.MediaEntry()
- entry['_id'] = ObjectId()
- entry['title'] = (
- unicode(request.POST['title'])
- or unicode(splitext(filename)[0]))
-
- entry['description'] = unicode(request.POST.get('description'))
- entry['description_html'] = cleaned_markdown_conversion(
- entry['description'])
-
- entry['license'] = (
- unicode(request.POST.get('license'))
- or '')
-
- entry['media_type'] = u'image' # heh
- entry['uploader'] = request.user['_id']
-
- # Process the user's folksonomy "tags"
- entry['tags'] = convert_to_tag_list_of_dicts(
- request.POST.get('tags'))
-
- # Generate a slug from the title
- entry.generate_slug()
-
- # Now store generate the queueing related filename
- queue_filepath = request.app.queue_store.get_unique_filepath(
- ['media_entries',
- unicode(entry['_id']),
- secure_filename(filename)])
-
- # queue appropriately
- queue_file = request.app.queue_store.get_file(
- queue_filepath, 'wb')
-
- with queue_file:
- queue_file.write(request.POST['file'].file.read())
-
- # Add queued filename to the entry
- entry['queued_media_file'] = queue_filepath
-
- # We generate this ourselves so we know what the taks id is for
- # retrieval later.
- # (If we got it off the task's auto-generation, there'd be a risk of
- # a race condition when we'd save after sending off the task)
- task_id = unicode(uuid.uuid4())
- entry['queued_task_id'] = task_id
-
- # Save now so we have this data before kicking off processing
- entry.save(validate=True)
-
- # Pass off to processing
- #
- # (... don't change entry after this point to avoid race
- # conditions with changes to the document via processing code)
try:
- process_media.apply_async(
- [unicode(entry['_id'])], {},
- task_id=task_id)
- except BaseException as exc:
- # The purpose of this section is because when running in "lazy"
- # or always-eager-with-exceptions-propagated celery mode that
- # the failure handling won't happen on Celery end. Since we
- # expect a lot of users to run things in this way we have to
- # capture stuff here.
- #
- # ... not completely the diaper pattern because the exception is
- # re-raised :)
- mark_entry_failed(entry[u'_id'], exc)
- # re-raise the exception
- raise
+ filename = request.POST['file'].filename
+ media_type, media_manager = get_media_type_and_manager(filename)
+
+ # create entry and save in database
+ entry = request.db.MediaEntry()
+ entry['_id'] = ObjectId()
+ entry.media_type = unicode(media_type)
+ entry.title = (
+ unicode(request.POST['title'])
+ or unicode(splitext(filename)[0]))
+
+ entry.description = unicode(request.POST.get('description'))
+ entry.description_html = cleaned_markdown_conversion(
+ entry.description)
+
+ entry['license'] = (
+ unicode(request.POST.get('license'))
+ or '')
+
+ entry.uploader = request.user._id
+
+ # Process the user's folksonomy "tags"
+ entry['tags'] = convert_to_tag_list_of_dicts(
+ request.POST.get('tags'))
+
+ # Generate a slug from the title
+ entry.generate_slug()
- add_message(request, SUCCESS, _('Woohoo! Submitted!'))
- return redirect(request, "mediagoblin.user_pages.user_home",
- user = request.user['username'])
+ # Now store generate the queueing related filename
+ queue_filepath = request.app.queue_store.get_unique_filepath(
+ ['media_entries',
+ unicode(entry._id),
+ secure_filename(filename)])
+
+ # queue appropriately
+ queue_file = request.app.queue_store.get_file(
+ queue_filepath, 'wb')
+
+ with queue_file:
+ queue_file.write(request.POST['file'].file.read())
+
+ # Add queued filename to the entry
+ entry.queued_media_file = queue_filepath
+
+ # We generate this ourselves so we know what the taks id is for
+ # retrieval later.
+
+ # (If we got it off the task's auto-generation, there'd be
+ # a risk of a race condition when we'd save after sending
+ # off the task)
+ task_id = unicode(uuid.uuid4())
+ entry['queued_task_id'] = task_id
+
+ # Save now so we have this data before kicking off processing
+ entry.save(validate=True)
+
+ # Pass off to processing
+ #
+ # (... don't change entry after this point to avoid race
+ # conditions with changes to the document via processing code)
+ process_media = registry.tasks[ProcessMedia.name]
+ try:
+ process_media.apply_async(
+ [unicode(entry._id)], {},
+ task_id=task_id)
+ except BaseException as exc:
+ # The purpose of this section is because when running in "lazy"
+ # or always-eager-with-exceptions-propagated celery mode that
+ # the failure handling won't happen on Celery end. Since we
+ # expect a lot of users to run things in this way we have to
+ # capture stuff here.
+ #
+ # ... not completely the diaper pattern because the
+ # exception is re-raised :)
+ mark_entry_failed(entry._id, exc)
+ # re-raise the exception
+ raise
+
+ add_message(request, SUCCESS, _('Woohoo! Submitted!'))
+
+ return redirect(request, "mediagoblin.user_pages.user_home",
+ user=request.user.username)
+ except Exception as e:
+ '''
+ This section is intended to catch exceptions raised in
+ mediagobling.media_types
+ '''
+
+ if isinstance(e, InvalidFileType) or \
+ isinstance(e, FileTypeNotSupported):
+ submit_form.file.errors.append(
+ e)
+ else:
+ raise
return render_to_response(
request,
diff --git a/mediagoblin/templates/mediagoblin/404.html b/mediagoblin/templates/mediagoblin/404.html
index 7db68941..392c14f5 100644
--- a/mediagoblin/templates/mediagoblin/404.html
+++ b/mediagoblin/templates/mediagoblin/404.html
@@ -18,17 +18,12 @@
{% extends "mediagoblin/base.html" %}
{% block mediagoblin_content %}
+ <img class="right_align" src="{{ request.staticdirect('/images/404.png') }}"
+ alt="{% trans %}Image of 404 goblin stressing out{% endtrans %}" />
<h1>{% trans %}Oops!{% endtrans %}</h1>
-
- <div class="grid_8 alpha">
- <p>{% trans %}There doesn't seem to be a page at this address. Sorry!{% endtrans %}</p>
- <p>
- {%- trans %}If you're sure the address is correct, maybe the page you're looking for has been moved or deleted.{% endtrans -%}
- </p>
- </div>
-
- <div class="grid_8 omega">
- <img src="{{ request.staticdirect('/images/404.png') }}"
- alt="{% trans %}Image of 404 goblin stressing out{% endtrans %}" />
- </div>
+ <p>{% trans %}There doesn't seem to be a page at this address. Sorry!{% endtrans %}</p>
+ <p>
+ {%- trans %}If you're sure the address is correct, maybe the page you're looking for has been moved or deleted.{% endtrans -%}
+ </p>
+ <div class="clear"></div>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html
index 53186cec..d95516e8 100644
--- a/mediagoblin/templates/mediagoblin/auth/change_fp.html
+++ b/mediagoblin/templates/mediagoblin/auth/change_fp.html
@@ -19,20 +19,21 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
-{% block mediagoblin_content %}
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/show_password.js') }}"></script>
+{% endblock mediagoblin_head %}
+{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.auth.verify_forgot_password') }}"
method="POST" enctype="multipart/form-data">
{{ csrf_token }}
-
- <div class="grid_6 prefix_1 suffix_1 form_box">
- <h1>{% trans %}Enter your new password{% endtrans %}</h1>
-
+ <div class="form_box">
+ <h1>{% trans %}Set your new password{% endtrans %}</h1>
{{ wtforms_util.render_divs(cp_form) }}
<div class="form_submit_buttons">
- <input type="submit" value="submit" class="button"/>
+ <input type="submit" value="{% trans %}Set password{% endtrans %}" class="button_form"/>
</div>
-
</div>
</form>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/auth/forgot_password.html b/mediagoblin/templates/mediagoblin/auth/forgot_password.html
index b95a4dcb..672e9d9a 100644
--- a/mediagoblin/templates/mediagoblin/auth/forgot_password.html
+++ b/mediagoblin/templates/mediagoblin/auth/forgot_password.html
@@ -20,20 +20,15 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
{% block mediagoblin_content %}
-
<form action="{{ request.urlgen('mediagoblin.auth.forgot_password') }}"
method="POST" enctype="multipart/form-data">
{{ csrf_token }}
-
- <div class="grid_6 prefix_1 suffix_1 form_box">
- <h1>{% trans %}Enter your username or email{% endtrans %}</h1>
-
+ <div class="form_box">
+ <h1>{% trans %}Recover password{% endtrans %}</h1>
{{ wtforms_util.render_divs(fp_form) }}
<div class="form_submit_buttons">
- <input type="submit" value="submit" class="button"/>
+ <input type="submit" value="{% trans %}Send instructions{% endtrans %}" class="button_form"/>
</div>
-
</div>
</form>
{% endblock %}
-
diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html
index 61c5a203..993790eb 100644
--- a/mediagoblin/templates/mediagoblin/auth/login.html
+++ b/mediagoblin/templates/mediagoblin/auth/login.html
@@ -23,34 +23,30 @@
<form action="{{ request.urlgen('mediagoblin.auth.login') }}"
method="POST" enctype="multipart/form-data">
{{ csrf_token }}
- <div class="grid_6 prefix_1 suffix_1 form_box">
+ <div class="form_box">
<h1>{% trans %}Log in{% endtrans %}</h1>
{% if login_failed %}
<div class="form_field_error">
{% trans %}Logging in failed!{% endtrans %}
</div>
{% endif %}
- {{ wtforms_util.render_divs(login_form) }}
- <div class="form_submit_buttons">
- <input type="submit" value="{% trans %}Log in{% endtrans %}" class="button"/>
- </div>
- {% if next %}
- <input type="hidden" name="next" value="{{ next }}" class="button"
- style="display: none;"/>
- {% endif %}
{% if allow_registration %}
<p>
- {% trans %}Don't have an account yet?{% endtrans %}
- <br />
- <a href="{{ request.urlgen('mediagoblin.auth.register') }}">
+ {% trans %}Don't have an account yet?{% endtrans %} <a href="{{ request.urlgen('mediagoblin.auth.register') }}">
{%- trans %}Create one here!{% endtrans %}</a>
</p>
+ {% endif %}
+ {{ wtforms_util.render_divs(login_form) }}
<p>
- {% trans %}Forgot your password?{% endtrans %}
- <br />
<a href="{{ request.urlgen('mediagoblin.auth.forgot_password') }}">
- {%- trans %}Change it!{% endtrans %}</a>
+ {% trans %}Forgot your password?{% endtrans %}</a>
</p>
+ <div class="form_submit_buttons">
+ <input type="submit" value="{% trans %}Log in{% endtrans %}" class="button_form"/>
+ </div>
+ {% if next %}
+ <input type="hidden" name="next" value="{{ next }}" class="button_form"
+ style="display: none;"/>
{% endif %}
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html
index 25b68058..afcfcda9 100644
--- a/mediagoblin/templates/mediagoblin/auth/register.html
+++ b/mediagoblin/templates/mediagoblin/auth/register.html
@@ -19,17 +19,22 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/show_password.js') }}"></script>
+{% endblock mediagoblin_head %}
+
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.auth.register') }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_6 prefix_1 suffix_1 form_box">
+ <div class="form_box">
<h1>{% trans %}Create an account!{% endtrans %}</h1>
{{ wtforms_util.render_divs(register_form) }}
{{ csrf_token }}
<div class="form_submit_buttons">
<input type="submit" value="{% trans %}Create{% endtrans %}"
- class="button" />
+ class="button_form" />
</div>
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html
index b4c4dcf3..5335ebe3 100644
--- a/mediagoblin/templates/mediagoblin/base.html
+++ b/mediagoblin/templates/mediagoblin/base.html
@@ -19,79 +19,73 @@
<html>
<head>
<meta charset="utf-8">
- <title>{% block title %}{% trans %}GNU MediaGoblin{% endtrans %}{% endblock title %}</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
+ <title>{% block title %}{{ app_config['html_title'] }}{% endblock %}</title>
<link rel="stylesheet" type="text/css"
href="{{ request.staticdirect('/css/extlib/reset.css') }}"/>
<link rel="stylesheet" type="text/css"
- href="{{ request.staticdirect('/css/extlib/text.css') }}"/>
- <link rel="stylesheet" type="text/css"
- href="{{ request.staticdirect('/css/extlib/960_16_col.css') }}"/>
- <link rel="stylesheet" type="text/css"
href="{{ request.staticdirect('/css/base.css') }}"/>
<link rel="shortcut icon"
href="{{ request.staticdirect('/images/goblin.ico') }}" />
+ <script src="{{ request.staticdirect('/js/extlib/jquery.js') }}"></script>
+ <!--[if lt IE 9]>
+ <script src="{{ request.staticdirect('/js/extlib/html5shiv.js') }}"></script>
+ <![endif]-->
{% block mediagoblin_head %}
{% endblock mediagoblin_head %}
</head>
-
<body>
{% block mediagoblin_body %}
- <div class="mediagoblin_body">
+ <div class="container">
{% block mediagoblin_header %}
- <div class="container_16">
- <div class="grid_16 mediagoblin_header">
+ <header>
{% block mediagoblin_logo %}
- <a class="mediagoblin_logo"
+ <a class="logo"
href="{{ request.urlgen('index') }}"
><img src="{{ request.staticdirect('/images/logo.png') }}"
alt="{% trans %}MediaGoblin logo{% endtrans %}" /></a>
- {% endblock %}
- {% if request.user and request.user['status'] == 'active' %}
- <a class="header_submit"
+ {% endblock mediagoblin_logo %}
+ {% if request.user and request.user.status == 'active' %}
+ <a class="button_action"
href="{{ request.urlgen('mediagoblin.submit.start') }}">
- {% trans %}Submit media{% endtrans %}
+ {% trans %}Add media{% endtrans %}
</a>
{% endif %}
{% block mediagoblin_header_title %}{% endblock %}
- <div class="mediagoblin_header_right">
+ <div class="header_right">
{% if request.user %}
{# the following link should only appear when verification is needed #}
{% if request.user.status == "needs_email_verification" %}
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
- user=request.user['username']) }}"
- class="header_submit">
- {% trans %}verify your email!{% endtrans %}</a>
+ user=request.user.username) }}"
+ class="button_action_highlight">
+ {% trans %}Verify your email!{% endtrans %}</a>
{% endif %}
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
- user= request.user['username']) }}">
- {{ request.user['username'] }}</a>
+ user= request.user.username) }}">
+ {{ request.user.username }}</a>
- (<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">log out</a>)
+ (<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">{% trans %}log out{% endtrans %}</a>)
{% else %}
<a href="{{ request.urlgen('mediagoblin.auth.login') }}">
{% trans %}Log in{% endtrans %}</a>
{% endif %}
</div>
- </div>
- </div>
+ </header>
{% endblock %}
- <div class="container_16 mediagoblin_content">
- <div class="grid_16">
+ <div class="mediagoblin_content">
{% include "mediagoblin/utils/messages.html" %}
{% block mediagoblin_content %}
{% endblock mediagoblin_content %}
- </div>
</div>
{% block mediagoblin_footer %}
- <div class="container_16">
- <div class="grid_16 mediagoblin_footer">
+ <footer>
{% trans -%}
Powered by <a href="http://mediagoblin.org">MediaGoblin</a>, a <a href="http://gnu.org/">GNU</a> project
{%- endtrans %}
- </div>
- </div>
- {% endblock %}
+ </footer>
+ {% endblock mediagoblin_footer %}
{% endblock mediagoblin_body %}
</div>
</body>
diff --git a/mediagoblin/templates/mediagoblin/edit/attachments.html b/mediagoblin/templates/mediagoblin/edit/attachments.html
index d8b55f58..bd972b2a 100644
--- a/mediagoblin/templates/mediagoblin/edit/attachments.html
+++ b/mediagoblin/templates/mediagoblin/edit/attachments.html
@@ -20,14 +20,14 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.edit.attachments',
- user= media.uploader().username,
+ user= media.get_uploader.username,
media= media._id) }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 edit_box form_box">
+ <div class="form_box">
<h1>Editing attachments for {{ media.title }}</h1>
<div style="text-align: center;" >
<img src="{{ request.app.public_store.file_url(
- media['media_files']['thumb']) }}" />
+ media.media_files['thumb']) }}" />
</div>
{% if media.attachment_files|count %}
@@ -48,7 +48,7 @@
{{ wtforms_util.render_divs(form) }}
<div class="form_submit_buttons">
<a href="{{ media.url_for_self(request.urlgen) }}">Cancel</a>
- <input type="submit" value="Save changes" class="button" />
+ <input type="submit" value="Save changes" class="button_form" />
{{ csrf_token }}
</div>
</div>
diff --git a/mediagoblin/templates/mediagoblin/edit/edit.html b/mediagoblin/templates/mediagoblin/edit/edit.html
index b4b3be85..fc6b1605 100644
--- a/mediagoblin/templates/mediagoblin/edit/edit.html
+++ b/mediagoblin/templates/mediagoblin/edit/edit.html
@@ -22,22 +22,22 @@
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.edit.edit_media',
- user= media.uploader().username,
+ user= media.get_uploader.username,
media= media._id) }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 edit_box form_box">
+ <div class="form_box_xl edit_box">
<h1>{% trans media_title=media.title %}Editing {{ media_title }}{% endtrans %}</h1>
<div style="text-align: center;" >
<img src="{{ request.app.public_store.file_url(
- media['media_files']['thumb']) }}" />
+ media.media_files['thumb']) }}" />
</div>
{{ wtforms_util.render_divs(form) }}
<div class="form_submit_buttons">
<a href="{{ media.url_for_self(request.urlgen) }}">{% trans %}Cancel{% endtrans %}</a>
- <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button" />
+ <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button_form" />
{{ csrf_token }}
</div>
</div>
</form>
-
+
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/edit/edit_account.html b/mediagoblin/templates/mediagoblin/edit/edit_account.html
new file mode 100644
index 00000000..e8a968e6
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/edit/edit_account.html
@@ -0,0 +1,45 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+{% extends "mediagoblin/base.html" %}
+
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/show_password.js') }}"></script>
+{% endblock mediagoblin_head %}
+
+{% block mediagoblin_content %}
+
+ <form action="{{ request.urlgen('mediagoblin.edit.account') }}?username={{
+ user.username }}"
+ method="POST" enctype="multipart/form-data">
+ <div class="form_box edit_box">
+ <h1>
+ {%- trans username=user.username -%}
+ Changing {{ username }}'s account settings
+ {%- endtrans %}
+ </h1>
+ {{ wtforms_util.render_divs(form) }}
+ <div class="form_submit_buttons">
+ <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button_form" />
+ {{ csrf_token }}
+ </div>
+ </div>
+ </form>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html
index 93b2a792..97c03e37 100644
--- a/mediagoblin/templates/mediagoblin/edit/edit_profile.html
+++ b/mediagoblin/templates/mediagoblin/edit/edit_profile.html
@@ -22,17 +22,17 @@
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.edit.profile') }}?username={{
- user['username'] }}"
+ user.username }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 edit_box form_box">
+ <div class="form_box edit_box">
<h1>
- {%- trans username=user['username'] -%}
+ {%- trans username=user.username -%}
Editing {{ username }}'s profile
{%- endtrans %}
</h1>
{{ wtforms_util.render_divs(form) }}
<div class="form_submit_buttons">
- <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button" />
+ <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button_form" />
{{ csrf_token }}
</div>
</div>
diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html
index 58863015..a7cbe241 100644
--- a/mediagoblin/templates/mediagoblin/listings/tag.html
+++ b/mediagoblin/templates/mediagoblin/listings/tag.html
@@ -26,19 +26,18 @@
tag=tag_slug) }}">
{% endblock mediagoblin_head %}
+{% block title %}
+ {% trans %}Media tagged with: {{ tag_name }}{% endtrans %} &mdash; {{ super() }}
+{% endblock %}
+
{% block mediagoblin_content -%}
<h1>
- {% trans %}Media tagged with:{% endtrans %} {{ tag_name }}
+ {% trans %}Media tagged with: {{ tag_name }}{% endtrans %}
</h1>
- <div class="container_16 media_gallery">
- {{ object_gallery(request, media_entries, pagination) }}
- </div>
+ {{ object_gallery(request, media_entries, pagination) }}
- <div class="grid_16">
- {% set feed_url = request.urlgen(
- 'mediagoblin.listings.tag_atom_feed',
- tag=tag_slug) %}
- {% include "mediagoblin/utils/feed_link.html" %}
- </div>
+ {% set feed_url = request.urlgen('mediagoblin.listings.tag_atom_feed',
+ tag=tag_slug) %}
+ {% include "mediagoblin/utils/feed_link.html" %}
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/ascii.html b/mediagoblin/templates/mediagoblin/media_displays/ascii.html
new file mode 100644
index 00000000..6b40bf08
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/media_displays/ascii.html
@@ -0,0 +1,40 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+
+{% extends 'mediagoblin/user_pages/media.html' %}
+
+{% block mediagoblin_media %}
+ <div class="ascii-wrapper">
+ <pre>
+ {%- autoescape False -%}
+ {{- request.app.public_store.get_file(
+ media.media_files['unicode']).read()|string -}}
+ {%- endautoescape -%}
+ </pre>
+ </div>
+ {% if 'original' in media.media_files %}
+ <p>
+ <a href="{{ request.app.public_store.file_url(
+ media.media_files['original']) }}">
+ {%- trans -%}
+ Original
+ {%- endtrans -%}
+ </a>
+ </p>
+ {% endif %}
+{% endblock %}
diff --git a/mediagoblin/middleware/__init__.py b/mediagoblin/templates/mediagoblin/media_displays/image.html
index 05325ee5..94420e89 100644
--- a/mediagoblin/middleware/__init__.py
+++ b/mediagoblin/templates/mediagoblin/media_displays/image.html
@@ -1,3 +1,4 @@
+{#
# GNU MediaGoblin -- federated, autonomous media hosting
# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
#
@@ -13,8 +14,6 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
-ENABLED_MIDDLEWARE = (
- 'mediagoblin.middleware.noop:NoOpMiddleware',
- 'mediagoblin.middleware.csrf:CsrfMiddleware',
- )
+{% extends 'mediagoblin/user_pages/media.html' %}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html
new file mode 100644
index 00000000..6b5e7a0e
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/media_displays/video.html
@@ -0,0 +1,52 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+
+{% extends 'mediagoblin/user_pages/media.html' %}
+
+{% block mediagoblin_media %}
+ <div class="video-player" style="position: relative;">
+ <video class="video-js vjs-default-skin"
+ width="{{ media.media_data.video.width }}"
+ height="{{ media.media_data.video.height }}"
+ controls="controls"
+ preload="auto"
+ data-setup="">
+ <source src="{{ request.app.public_store.file_url(
+ media.media_files['webm_640']) }}"
+ type="video/webm; codecs=&quot;vp8, vorbis&quot;" />
+ <div class="no_html5">
+ {%- trans -%}Sorry, this video will not work because
+ your web browser does not support HTML5
+ video.{%- endtrans -%}<br/>
+ {%- trans -%}You can get a modern web browser that
+ can play this video at <a href="http://getfirefox.com">
+ http://getfirefox.com</a>!{%- endtrans -%}
+ </div>
+ </video>
+ </div>
+ {% if 'original' in media.media_files %}
+ <p>
+ <a href="{{ request.app.public_store.file_url(
+ media.media_files['original']) }}">
+ {%- trans -%}
+ Original
+ {%- endtrans -%}
+ </a>
+ </p>
+ {% endif %}
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html
index e3ca9726..3f834572 100644
--- a/mediagoblin/templates/mediagoblin/root.html
+++ b/mediagoblin/templates/mediagoblin/root.html
@@ -23,31 +23,18 @@
{% if request.user %}
<h1>{% trans %}Explore{% endtrans %}</h1>
{% else %}
- <div class="grid_11 alpha">
- <h1>{% trans %}Hi there, media lover! MediaGoblin is...{% endtrans %}</h1>
- <ul>
- <li>{% trans %}The perfect place for your media!{% endtrans %}</li>
- <li>{% trans %}A place for people to collaborate and show off original and derived creations!{% endtrans %}</li>
- <li>{% trans %}Free, as in freedom. (We’re a <a href="http://gnu.org">GNU</a> project, after all.){% endtrans %}</li>
- <li>{% trans %}Aiming to make the world a better place through decentralization and (eventually, coming soon!) federation!{% endtrans %}</li>
- <li>{% trans %}Built for extensibility. (Multiple media types coming soon to the software, including video support!){% endtrans %}</li>
- <li>{% trans %}Powered by people like you. (<a href="http://mediagoblin.org/pages/join.html">You can help us improve this software!</a>){% endtrans %}</li>
- </ul>
-
- {% if allow_registration %}
- <p>{% trans %}Excited to join us?{% endtrans %}<p>
- {% trans register_url=request.urlgen('mediagoblin.auth.register') -%}
- <a class="header_submit_highlight" href="{{ register_url }}">Create a free account</a>
- or
- <a class="header_submit" href="http://wiki.mediagoblin.org/HackingHowto">Set up MediaGoblin on your own server</a>
- {%- endtrans %}
- {% endif %}
- </div>
-
- <div class="grid_5 omega">
- <img src="{{ request.staticdirect('/images/frontpage_image.png') }}" />
- </div>
-
+ <h1>{% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}</h1>
+ <img class="right_align" src="{{ request.staticdirect('/images/frontpage_image.png') }}" />
+ <p>{% trans %}This site is running <a href="http://mediagoblin.org">MediaGoblin</a>, an extraordinarily great piece of media hosting software.{% endtrans %}</p>
+ <p>{% trans %}To add your own media, place comments, save your favourites and more, you can log in with your MediaGoblin account.{% endtrans %}</p>
+ {% if allow_registration %}
+ <p>{% trans %}Don't have one yet? It's easy!{% endtrans %}</p>
+ {% trans register_url=request.urlgen('mediagoblin.auth.register') -%}
+ <a class="button_action_highlight" href="{{ register_url }}">Create an account at this site</a>
+ or
+ <a class="button_action" href="http://wiki.mediagoblin.org/HackingHowto">Set up MediaGoblin on your own server</a>
+ {%- endtrans %}
+ {% endif %}
<div class="clear"></div>
{% endif %}
<h2>{% trans %}Most recent media{% endtrans %}</h2>
diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html
index 29b01181..afae2f1f 100644
--- a/mediagoblin/templates/mediagoblin/submit/start.html
+++ b/mediagoblin/templates/mediagoblin/submit/start.html
@@ -22,12 +22,12 @@
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.submit.start') }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 form_box">
- <h1>{% trans %}Submit yer media{% endtrans %}</h1>
+ <div class="form_box_xl">
+ <h1>{% trans %}Add your media{% endtrans %}</h1>
{{ wtforms_util.render_divs(submit_form) }}
<div class="form_submit_buttons">
{{ csrf_token }}
- <input type="submit" value="{% trans %}Submit{% endtrans %}" class="button" />
+ <input type="submit" value="{% trans %}Add{% endtrans %}" class="button_form" />
</div>
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/test_submit.html b/mediagoblin/templates/mediagoblin/test_submit.html
index 190b9ac3..38be8efc 100644
--- a/mediagoblin/templates/mediagoblin/test_submit.html
+++ b/mediagoblin/templates/mediagoblin/test_submit.html
@@ -25,7 +25,7 @@
{{ wtforms_util.render_table(image_form) }}
<tr>
<td></td>
- <td><input type="submit" value="submit" class="button" /></td>
+ <td><input type="submit" value="submit" class="button_form" /></td>
{{ csrf_token }}
</tr>
</table>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html
index df931d9c..b0bfacf8 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html
@@ -26,29 +26,26 @@
user=user.username) }}">
{% endblock mediagoblin_head %}
-{% block mediagoblin_content -%}
- {% if user %}
- <h1>
- {%- trans username=user.username,
- user_url=request.urlgen(
- 'mediagoblin.user_pages.user_home',
- user=user.username) -%}
- <a href="{{ user_url }}">{{ username }}</a>'s media
- {%- endtrans %}
- </h1>
+{% block title %}
+ {%- trans username=user.username -%}
+ {{ username }}'s media
+ {%- endtrans %} &mdash; {{ super() }}
+{% endblock %}
- <div class="container_16 media_gallery">
- {{ object_gallery(request, media_entries, pagination) }}
- </div>
+{% block mediagoblin_content -%}
+ <h1>
+ {%- trans username=user.username,
+ user_url=request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=user.username) -%}
+ <a href="{{ user_url }}">{{ username }}</a>'s media
+ {%- endtrans %}
+ </h1>
- <div class="grid_16">
- {% set feed_url = request.urlgen(
- 'mediagoblin.user_pages.atom_feed',
- user=user.username) %}
- {% include "mediagoblin/utils/feed_link.html" %}
- </div>
- {% else %}
- {# This *should* not occur as the view makes sure we pass in a user. #}
- <p>{% trans %}Sorry, no such user found.{% endtrans %}<p/>
- {% endif %}
+ {{ object_gallery(request, media_entries, pagination) }}
+
+ {% set feed_url = request.urlgen('mediagoblin.user_pages.atom_feed',
+ user=user.username) %}
+ {% include "mediagoblin/utils/feed_link.html" %}
+
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html
index efbd7e53..cbe26cbf 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/media.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/media.html
@@ -20,19 +20,25 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
{% from "mediagoblin/utils/pagination.html" import render_pagination %}
+{% block title %}{{ media.title }} &mdash; {{ super() }}{% endblock %}
+
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/comment_show.js') }}"></script>
+{% endblock mediagoblin_head %}
+
{% block mediagoblin_content %}
- {% if media %}
- <div class="grid_11 alpha">
- <div class="media_image_container">
+ <div class="media_pane">
+ <div class="media_image_container">
+ {% block mediagoblin_media %}
{% set display_media = request.app.public_store.file_url(
media.get_display_media(media.media_files)) %}
-
{# if there's a medium file size, that means the medium size
# isn't the original... so link to the original!
#}
- {% if media['media_files'].has_key('medium') %}
+ {% if media.media_files.has_key('medium') %}
<a href="{{ request.app.public_store.file_url(
- media['media_files']['original']) }}">
+ media.media_files['original']) }}">
<img class="media_image"
src="{{ display_media }}"
alt="Image for {{ media.title }}" />
@@ -42,139 +48,129 @@
src="{{ display_media }}"
alt="Image for {{ media.title }}" />
{% endif %}
- </div>
-
- <h2 class="media_title">
- {{ media.title }}
- </h2>
-
- <p class="media_uploader">
- {% trans date=media.created.strftime("%Y-%m-%d"),
- user_url=request.urlgen(
- 'mediagoblin.user_pages.user_home',
- user=media.uploader().username),
- username=media.uploader().username -%}
- Uploaded on {{ date }} by <a href="{{ user_url }}">{{ username }}</a>
- {%- endtrans %}
- </p>
-
- {% autoescape False %}
- <p>{{ media.description_html }}</p>
- {% endautoescape %}
-
- <br />
- <h3>{% trans %}Comments{% endtrans %}</h3>
-
+ {% endblock %}
+ </div>
+ <h2 class="media_title">
+ {{ media.title }}
+ </h2>
+ {% autoescape False %}
+ <p>{{ media.description_html }}</p>
+ {% endautoescape %}
+ <p class="media_specs">
+ {% trans date=media.created.strftime("%Y-%m-%d") -%}
+ Added on {{ date }}.
+ {%- endtrans %}
+ {% if request.user and
+ (media.uploader == request.user._id or
+ request.user.is_admin) %}
+ {% set edit_url = request.urlgen('mediagoblin.edit.edit_media',
+ user= media.get_uploader.username,
+ media= media._id) %}
+ <a class="button_action" href="{{ edit_url }}">{% trans %}Edit{% endtrans %}</a>
+ {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete',
+ user= media.get_uploader.username,
+ media= media._id) %}
+ <a class="button_action" href="{{ delete_url }}">{% trans %}Delete{% endtrans %}</a>
+ {% endif %}
+ </p>
+ {% if comments %}
+ <h3>
+ {% if comments.count()==1 %}
+ {% trans comment_count=comments.count() -%}{{ comment_count }} comment{%- endtrans %}
+ {% elif comments.count()>1 %}
+ {% trans comment_count=comments.count() -%}{{ comment_count }} comments{%- endtrans %}
+ {% else %}
+ {% trans %}No comments yet.{% endtrans %}
+ {% endif %}
+ <div class="right_align">
+ <a
+ {% if not request.user %}
+ href="{{ request.urlgen('mediagoblin.auth.login') }}"
+ {% endif %}
+ class="button_action" id="button_addcomment" title="Add a comment">
+ {% trans %}Add one{% endtrans %}
+ </a>
+ </div>
+ </h3>
{% if request.user %}
- <p><a href="#comment_form">{% trans %}Post a comment{% endtrans %}</a></p>
+ <form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment',
+ user= media.get_uploader.username,
+ media=media._id) }}" method="POST" id="form_comment">
+ <p>
+ {% trans %}You can use <a href="http://daringfireball.net/projects/markdown/basics">Markdown</a> for formatting.{% endtrans %}
+ </p>
+ {{ wtforms_util.render_divs(comment_form) }}
+ <div class="form_submit_buttons">
+ <input type="submit" value="{% trans %}Add this comment{% endtrans %}" class="button_action" />
+ {{ csrf_token }}
+ </div>
+ </form>
{% endif %}
-
- {% if comments %}
- {% for comment in comments %}
- {% set comment_author = comment.author() %}
- {% if pagination.active_id == comment._id %}
- <div class="comment_wrapper comment_active" id="comment-{{ comment['_id'] }}">
- <a name="comment" id="comment"></a>
- {% else %}
- <div class="comment_wrapper" id="comment-{{ comment['_id'] }}">
- {% endif %}
-
- <div class="comment_content">
- {% autoescape False %}
- {{ comment.content_html }}
- {% endautoescape %}
- </div>
-
- <div class="comment_author">&mdash;
- <a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
- user = comment_author['username']) }}">
- {{ comment_author['username'] }}</a>
- {% trans %}at{% endtrans %}
- <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.view_comment',
- comment = comment['_id'],
- user = media.uploader().username,
- media = media._id) }}#comment">
- {{ comment.created.strftime("%Y-%m-%d %I:%M%p") }}
- </a>
- </div>
+ {% for comment in comments %}
+ {% set comment_author = comment.get_author %}
+ {% if pagination.active_id == comment._id %}
+ <div class="comment_wrapper comment_active" id="comment-{{ comment._id }}">
+ <a name="comment" id="comment"></a>
+ {% else %}
+ <div class="comment_wrapper" id="comment-{{ comment._id }}">
+ {% endif %}
+ <div class="comment_content">
+ {% autoescape False %}
+ {{ comment.content_html }}
+ {% endautoescape %}
+ <img src="{{ request.staticdirect('/images/icon_comment.png') }}" />
+ <a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
+ user = comment_author.username) }}">
+ {{ comment_author.username }}
+ </a>
+ {% trans %}at{% endtrans %}
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.view_comment',
+ comment = comment._id,
+ user = media.get_uploader.username,
+ media = media.slug) }}#comment">
+ {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }}
+ </a>
</div>
+ </div>
+ {% endfor %}
+ {{ render_pagination(request, pagination,
+ media.url_for_self(request.urlgen)) }}
+ {% endif %}
+ </div>
+ <div class="media_sidebar">
+ {% trans user_url=request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=media.get_uploader.username),
+ username=media.get_uploader.username -%}
+ <p>â– Browsing media by <a href="{{ user_url }}">{{ username }}</a></p>
+ {%- endtrans %}
+ {% include "mediagoblin/utils/prev_next.html" %}
+ {% if media.attachment_files|count %}
+ <h3>Attachments</h3>
+ <ul>
+ {% for attachment in media.attachment_files %}
+ <li>
+ <a href="{{ request.app.public_store.file_url(attachment.filepath) }}">
+ {{ attachment.name }}
+ </a>
+ </li>
{% endfor %}
-
- {% if request.user %}
- <form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment',
- user= media.uploader().username,
- media=media._id) }}" method="POST">
- {{ wtforms_util.render_divs(comment_form) }}
- <div class="form_submit_buttons">
- <input type="submit" value="{% trans %}Post comment!{% endtrans %}" class="button" />
- {{ csrf_token }}
- </div>
- </form>
- {% endif %}
-
- {{ render_pagination(request, pagination,
- request.urlgen('mediagoblin.user_pages.media_home',
- user = media.uploader().username,
- media = media._id)) }}
- </div>
+ </ul>
+ {% endif %}
+ {% if app_config['allow_attachments']
+ and request.user
+ and (media.uploader == request.user._id
+ or request.user.is_admin) %}
+ <p>
+ <a href="{{ request.urlgen('mediagoblin.edit.attachments',
+ user=media.get_uploader.username,
+ media=media._id) }}">Add attachment</a>
+ </p>
+ {% endif %}
+ {% if media.tags %}
+ {% include "mediagoblin/utils/tags.html" %}
{% endif %}
- <div class="grid_5 omega">
- {% include "mediagoblin/utils/prev_next.html" %}
-
- {% if media['uploader'] == request.user['_id'] or
- request.user['is_admin'] %}
- <h3>{% trans %}Actions{% endtrans %}</h3>
- <p>
- {% set edit_url = request.urlgen('mediagoblin.edit.edit_media',
- user= media.uploader().username,
- media= media._id) %}
- <a href="{{ edit_url }}"
- ><img src="{{ request.staticdirect('/images/icon_edit.png') }}"
- class="media_icon" /></a>
- <a href="{{ edit_url }}">{% trans %}edit{% endtrans %}</a>
- </p>
- <p>
- {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete',
- user= media.uploader().username,
- media= media._id) %}
- <a href="{{ delete_url }}"
- ><img src="{{ request.staticdirect('/images/icon_delete.png') }}"
- class="media_icon" /></a>
- <a href="{{ delete_url }}">{% trans %}delete{% endtrans %}</a>
- </p>
- {% endif %}
-
- {% if media.attachment_files|count %}
- <h3>Attachments</h3>
- <ul>
- {% for attachment in media.attachment_files %}
- <li>
- <a href="{{ request.app.public_store.file_url(attachment.filepath) }}">
- {{ attachment.name }}
- </a>
- </li>
- {% endfor %}
- </ul>
- {% endif %}
-
- {% if app_config['allow_attachments']
- and (media['uploader'] == request.user['_id']
- or request.user['is_admin']) %}
- <p>
- <a href="{{ request.urlgen('mediagoblin.edit.attachments',
- user=media.uploader().username,
- media=media._id) }}">Add attachment</a>
- </p>
- {% endif %}
-
- {% if media.tags %}
- {% include "mediagoblin/utils/tags.html" %}
- {% endif %}
-
- {% include "mediagoblin/utils/license.html" %}
- </div>
- {% else %}
- <p>{% trans %}Sorry, no such media found.{% endtrans %}<p/>
- {% endif %}
+ {% include "mediagoblin/utils/license.html" %}
+ </div>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
index 8da90f79..dcb148e0 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
@@ -22,19 +22,19 @@
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.user_pages.media_confirm_delete',
- user=media.uploader().username,
+ user=media.get_uploader.username,
media=media._id) }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 edit_box form_box">
+ <div class="form_box">
<h1>
- {%- trans title=media['title'] -%}
+ {%- trans title=media.title -%}
Really delete {{ title }}?
{%- endtrans %}
</h1>
<div style="text-align: center;" >
<img src="{{ request.app.public_store.file_url(
- media['media_files']['thumb']) }}" />
+ media.media_files['thumb']) }}" />
</div>
<br />
@@ -47,7 +47,7 @@
<div class="form_submit_buttons">
{# TODO: This isn't a button really... might do unexpected things :) #}
<a class="cancel_link" href="{{ media.url_for_self(request.urlgen) }}">{% trans %}Cancel{% endtrans %}</a>
- <input type="submit" value="{% trans %}Delete Permanently{% endtrans %}" class="button" />
+ <input type="submit" value="{% trans %}Delete Permanently{% endtrans %}" class="button_form" />
{{ csrf_token }}
</div>
</div>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html
index 9b4adeb5..a14b0123 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html
@@ -36,8 +36,8 @@
</tr>
{% for media_entry in processing_entries %}
<tr>
- <td>{{ media_entry['title'] }}</td>
- <td>{{ media_entry['created'].strftime("%m-%d-%Y %I:%M %p") }}</td>
+ <td>{{ media_entry.title }}</td>
+ <td>{{ media_entry.created.strftime("%m-%d-%Y %I:%M %p") }}</td>
<td></td>
</tr>
{% endfor %}
@@ -57,7 +57,7 @@
</tr>
{% for media_entry in failed_entries %}
<tr>
- <td>{{ media_entry['title'] }}</td>
+ <td>{{ media_entry.title }}</td>
<td>{{ media_entry['created'].strftime("%m-%d-%Y %I:%M %p") }}</td>
<td>{{ media_entry.get_fail_exception().general_message }}</td>
</tr>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html
index c5beeaaa..d3b4021d 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/user.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/user.html
@@ -26,6 +26,17 @@
user=user.username) }}">
{% endblock mediagoblin_head %}
+{% block title %}
+ {%- if user -%}
+ {%- trans username=user.username -%}
+ {{ username }}'s profile
+ {%- endtrans %} &mdash; {{ super() }}
+ {%- else -%}
+ {{ super() }}
+ {%- endif -%}
+{% endblock %}
+
+
{% block mediagoblin_content -%}
{# If no user... #}
{% if not user %}
@@ -35,7 +46,7 @@
{% elif user.status == "needs_email_verification" %}
{% if user == request.user %}
{# this should only be visible when you are this user #}
- <div class="grid_6 prefix_1 suffix_1 form_box">
+ <div class="form_box">
<h1>{% trans %}Email verification needed{% endtrans %}</h1>
<p>
@@ -51,11 +62,11 @@
<p>{% trans %}In case it doesn't:{% endtrans %}</p>
<a href="{{ request.urlgen('mediagoblin.auth.resend_verification') }}"
- class="button">{% trans %}Resend verification email{% endtrans %}</a>
+ class="button_action_highlight">{% trans %}Resend verification email{% endtrans %}</a>
</div>
{% else %}
{# if the user is not you, but still needs to verify their email #}
- <div class="grid_6 prefix_1 suffix_1 form_box">
+ <div class="form_box">
<h1>{% trans %}Email verification needed{% endtrans %}</h1>
<p>
@@ -78,41 +89,46 @@
{%- trans username=user.username %}{{ username }}'s profile{% endtrans -%}
</h1>
- {% if not user['url'] and not user['profile'] %}
- {% if request.user['_id'] == user['_id'] %}
- <div class="grid_6 alpha empty_space">
+ {% if not user.url and not user.bio %}
+ {% if request.user and (request.user._id == user._id) %}
+ <div class="profile_sidebar empty_space">
<p>
{% trans %}Here's a spot to tell others about yourself.{% endtrans %}
</p>
<a href="{{ request.urlgen('mediagoblin.edit.profile') }}?username={{
user.username }}"
- class="header_submit">
+ class="button_action">
{%- trans %}Edit profile{% endtrans -%}
</a>
- </div>
{% else %}
- <div class="grid_6 alpha empty_space">
+ <div class="profile_sidebar empty_space">
<p>
{% trans -%}
This user hasn't filled in their profile (yet).
{%- endtrans %}
</p>
- </div>
{% endif %}
{% else %}
- <div class="grid_6 alpha">
+ <div class="profile_sidebar">
{% include "mediagoblin/utils/profile.html" %}
- {% if request.user['_id'] == user['_id'] or request.user['is_admin'] %}
+ {% if request.user and
+ (request.user._id == user._id or request.user.is_admin) %}
<a href="{{ request.urlgen('mediagoblin.edit.profile') }}?username={{
user.username }}">
{%- trans %}Edit profile{% endtrans -%}
</a>
{% endif %}
- </div>
{% endif %}
+ {% if request.user and (request.user._id == user._id) %}
+ <a href="{{ request.urlgen('mediagoblin.edit.account') }}">
+ {%- trans %}Change account settings{% endtrans -%}
+ </a>
+ {% endif %}
+ </div>
+
{% if media_entries.count() %}
- <div class="grid_10 omega">
+ <div class="profile_showcase">
{{ object_gallery(request, media_entries, pagination,
pagination_base_url=user_gallery_url, col_number=3) }}
{% include "mediagoblin/utils/object_gallery.html" %}
@@ -129,20 +145,20 @@
{% include "mediagoblin/utils/feed_link.html" %}
</div>
{% else %}
- {% if request.user['_id'] == user['_id'] %}
- <div class="grid_10 omega empty_space">
+ {% if request.user and (request.user._id == user._id) %}
+ <div class="profile_showcase empty_space">
<p>
{% trans -%}
This is where your media will appear, but you don't seem to have added anything yet.
{%- endtrans %}
</p>
- <a class="header_submit"
+ <a class="button_action"
href="{{ request.urlgen('mediagoblin.submit.start') }}">
{%- trans %}Add media{% endtrans -%}
</a>
</div>
{% else %}
- <div class="grid_10 omega empty_space">
+ <div class="profile_showcase empty_space">
<p>
{% trans -%}
There doesn't seem to be any media here yet...
diff --git a/mediagoblin/templates/mediagoblin/utils/object_gallery.html b/mediagoblin/templates/mediagoblin/utils/object_gallery.html
index e1b8cc9b..5f628dc7 100644
--- a/mediagoblin/templates/mediagoblin/utils/object_gallery.html
+++ b/mediagoblin/templates/mediagoblin/utils/object_gallery.html
@@ -31,11 +31,11 @@
{%- elif loop.last %} thumb_entry_last{% endif %}">
<a href="{{ entry_url }}">
<img src="{{ request.app.public_store.file_url(
- entry['media_files']['thumb']) }}" />
+ entry.media_files['thumb']) }}" />
</a>
- {% if entry['title'] %}
+ {% if entry.title %}
<br />
- <a href="{{ entry_url }}">{{ entry['title'] }}</a>
+ <a href="{{ entry_url }}">{{ entry.title }}</a>
{% endif %}
</td>
{% endfor %}
@@ -68,7 +68,11 @@
{% endif %}
{% else %}
<p>
- <i>There doesn't seem to be any media here yet...</i>
+ <i>
+ {%- trans -%}
+ There doesn't seem to be any media here yet...
+ {%- endtrans -%}
+ </i>
</p>
{% endif %}
{% endmacro %}
diff --git a/mediagoblin/templates/mediagoblin/utils/pagination.html b/mediagoblin/templates/mediagoblin/utils/pagination.html
index 84336103..caa79fcc 100644
--- a/mediagoblin/templates/mediagoblin/utils/pagination.html
+++ b/mediagoblin/templates/mediagoblin/utils/pagination.html
@@ -36,18 +36,16 @@
{% set prev_url = pagination.get_page_url_explicit(
base_url, get_params,
pagination.page - 1) %}
- <a href="{{ prev_url }}"><img class="pagination_arrow" src="{{ request.staticdirect('/images/pagination_left.png') }}" alt="Previous page" /></a>
- <a href="{{ prev_url }}">{% trans %}Newer{% endtrans %}</a>
+ <a href="{{ prev_url }}">{% trans %}↠Newer{% endtrans %}</a>
{% endif %}
{% if pagination.has_next %}
{% set next_url = pagination.get_page_url_explicit(
base_url, get_params,
pagination.page + 1) %}
- <a href="{{ next_url }}">{% trans %}Older{% endtrans %}</a>
- <a href="{{ next_url }}"><img class="pagination_arrow" src="{{ request.staticdirect('/images/pagination_right.png') }}" alt="Next page" /></a>
+ <a href="{{ next_url }}">{% trans %}Older →{% endtrans %}</a>
{% endif %}
<br />
- Go to page:
+ {% trans %}Go to page:{% endtrans %}
{%- for page in pagination.iter_pages() %}
{% if page %}
{% if page != pagination.page %}
diff --git a/mediagoblin/templates/mediagoblin/utils/prev_next.html b/mediagoblin/templates/mediagoblin/utils/prev_next.html
index 75903076..66766555 100644
--- a/mediagoblin/templates/mediagoblin/utils/prev_next.html
+++ b/mediagoblin/templates/mediagoblin/utils/prev_next.html
@@ -21,28 +21,26 @@
{% set next_entry_url = media.url_to_next(request.urlgen) %}
{% if prev_entry_url or next_entry_url %}
- <div class="grid_5 alpha omega">
- {# There are no previous entries for the very first media entry #}
- {% if prev_entry_url %}
- <a class="navigation_button navigation_left" href="{{ prev_entry_url }}">
- <img src="{{ request.staticdirect('/images/navigation_left.png') }}" alt="Previous image" />
- </a>
- {% else %}
- {# This is the first entry. display greyed-out 'previous' image #}
- <p class="navigation_button navigation_left">
- <img src="{{ request.staticdirect('/images/navigation_end.png') }}" alt="No previous images" />
- </p>
- {% endif %}
- {# Likewise, this could be the very last media entry #}
- {% if next_entry_url %}
- <a class="navigation_button" href="{{ next_entry_url }}">
- <img src="{{ request.staticdirect('/images/navigation_right.png') }}" alt="Next image" />
- </a>
- {% else %}
- {# This is the last entry. display greyed-out 'next' image #}
- <p class="navigation_button">
- <img src="{{ request.staticdirect('/images/navigation_end.png') }}" alt="No following images" />
- </p>
- {% endif %}
- </div>
+ {# There are no previous entries for the very first media entry #}
+ {% if prev_entry_url %}
+ <a class="navigation_button navigation_left" href="{{ prev_entry_url }}">
+ &larr; {% trans %}newer{% endtrans %}
+ </a>
+ {% else %}
+ {# This is the first entry. display greyed-out 'previous' image #}
+ <p class="navigation_button navigation_left">
+ &larr; {% trans %}newer{% endtrans %}
+ </p>
+ {% endif %}
+ {# Likewise, this could be the very last media entry #}
+ {% if next_entry_url %}
+ <a class="navigation_button" href="{{ next_entry_url }}">
+ {% trans %}older{% endtrans %} &rarr;
+ </a>
+ {% else %}
+ {# This is the last entry. display greyed-out 'next' image #}
+ <p class="navigation_button">
+ {% trans %}older{% endtrans %} &rarr;
+ </p>
+ {% endif %}
{% endif %}
diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html
index b3211bd9..1f587411 100644
--- a/mediagoblin/templates/mediagoblin/utils/tags.html
+++ b/mediagoblin/templates/mediagoblin/utils/tags.html
@@ -17,13 +17,25 @@
#}
{% block tags_content -%}
- <h3>Tags</h3>
- <ul class="mediaentry_tags">
+ <p>{% trans %}View more media tagged with{% endtrans %}
{% for tag in media.tags %}
- <li class="tag">
+ {% if loop.last %}
+ {# the 'and' should only appear if there is more than one tag #}
+ {% if media.tags|length > 1 %}
+ {% trans %}or{% endtrans %}
+ {% endif %}
<a href="{{ request.urlgen(
- 'mediagoblin.listings.tags_listing',
- tag=tag['slug']) }}">{{ tag['name'] }}</a></li>
+ 'mediagoblin.listings.tags_listing',
+ tag=tag['slug']) }}">{{ tag['name'] }}</a>.
+ {% elif loop.revindex == 2 %}
+ <a href="{{ request.urlgen(
+ 'mediagoblin.listings.tags_listing',
+ tag=tag['slug']) }}">{{ tag['name'] }}</a>
+ {% else %}
+ <a href="{{ request.urlgen(
+ 'mediagoblin.listings.tags_listing',
+ tag=tag['slug']) }}">{{ tag['name'] }}</a>,
+ {% endif %}
{% endfor %}
- </ul>
+ </p>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html
index 6a86fd24..44b27bb8 100644
--- a/mediagoblin/templates/mediagoblin/utils/wtforms.html
+++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html
@@ -18,18 +18,18 @@
{# Generically render a field #}
{% macro render_field_div(field) %}
- <div class="form_field_box">
- <div class="form_field_label">{{ _(field.label.text) }}</div>
- <div class="form_field_input">{{ field }}</div>
+ {% if field.label.text -%}
+ <p class="form_field_label"><label for="{{ field.label.field_id }}">{{ _(field.label.text) }}</label></p>
+ {%- endif %}
+ <div class="form_field_input">
+ {{ field }}
{%- if field.errors -%}
{% for error in field.errors %}
- <div class="form_field_error">
- {{ error }}
- </div>
+ <p class="form_field_error">{{ error }}</p>
{% endfor %}
{%- endif %}
{% if field.description -%}
- <div class="form_field_description">{{ _(field.description) }}</div>
+ <p class="form_field_description">{{ _(field.description)|safe }}</p>
{%- endif %}
</div>
{%- endmacro %}
diff --git a/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml
new file mode 100644
index 00000000..95a1a176
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml
@@ -0,0 +1,27 @@
+{# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+-#}
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"
+ xmlns:hm="http://host-meta.net/xrd/1.0">
+
+ <hm:Host>{{ request.host }}</hm:Host>
+
+ <Link rel="lrdd"
+ template="{{ lrdd_template|replace(placeholder, '{uri}') }}">
+ <Title>{{ lrdd_title }}</Title>
+ </Link>
+</XRD>
diff --git a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml
new file mode 100644
index 00000000..1fe34577
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml
@@ -0,0 +1,27 @@
+{# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+-#}
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+
+ <Subject>{{ subject }}</Subject>
+ <Alias>{{ alias }}</Alias>
+ {% for link in links %}
+ <Link
+ {%- for attr, value in link.attrs.items() %} {{ attr }}="{{ value}}"
+ {%- endfor %} />
+ {%- endfor %}
+</XRD>
diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py
index 40961eca..411b4539 100644
--- a/mediagoblin/tests/test_auth.py
+++ b/mediagoblin/tests/test_auth.py
@@ -20,7 +20,7 @@ import datetime
from nose.tools import assert_equal
from mediagoblin.auth import lib as auth_lib
-from mediagoblin.tests.tools import setup_fresh_app
+from mediagoblin.tests.tools import setup_fresh_app, fixture_add_user
from mediagoblin import mg_globals
from mediagoblin.tools import template, mail
@@ -89,7 +89,6 @@ def test_register_views(test_app):
form = context['register_form']
assert form.username.errors == [u'This field is required.']
assert form.password.errors == [u'This field is required.']
- assert form.confirm_password.errors == [u'This field is required.']
assert form.email.errors == [u'This field is required.']
# Try to register with fields that are known to be invalid
@@ -101,7 +100,6 @@ def test_register_views(test_app):
'/auth/register/', {
'username': 'l',
'password': 'o',
- 'confirm_password': 'o',
'email': 'l'})
context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html']
form = context['register_form']
@@ -125,18 +123,6 @@ def test_register_views(test_app):
assert form.email.errors == [
u'Invalid email address.']
- ## mismatching passwords
- template.clear_test_template_context()
- test_app.post(
- '/auth/register/', {
- 'password': 'herpderp',
- 'confirm_password': 'derpherp'})
- context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html']
- form = context['register_form']
-
- assert form.password.errors == [
- u'Passwords must match.']
-
## At this point there should be no users in the database ;)
assert not mg_globals.database.User.find().count()
@@ -147,7 +133,6 @@ def test_register_views(test_app):
'/auth/register/', {
'username': 'happygirl',
'password': 'iamsohappy',
- 'confirm_password': 'iamsohappy',
'email': 'happygrrl@example.org'})
response.follow()
@@ -162,13 +147,13 @@ def test_register_views(test_app):
new_user = mg_globals.database.User.find_one(
{'username': 'happygirl'})
assert new_user
- assert new_user['status'] == u'needs_email_verification'
- assert new_user['email_verified'] == False
+ assert new_user.status == u'needs_email_verification'
+ assert new_user.email_verified == False
## Make sure user is logged in
request = template.TEMPLATE_TEST_CONTEXT[
'mediagoblin/user_pages/user.html']['request']
- assert request.session['user_id'] == unicode(new_user['_id'])
+ assert request.session['user_id'] == unicode(new_user._id)
## Make sure we get email confirmation, and try verifying
assert len(mail.EMAIL_TEST_INBOX) == 1
@@ -185,15 +170,15 @@ def test_register_views(test_app):
### user should have these same parameters
assert parsed_get_params['userid'] == [
- unicode(new_user['_id'])]
+ unicode(new_user._id)]
assert parsed_get_params['token'] == [
- new_user['verification_key']]
+ new_user.verification_key]
## Try verifying with bs verification key, shouldn't work
template.clear_test_template_context()
response = test_app.get(
"/auth/verify_email/?userid=%s&token=total_bs" % unicode(
- new_user['_id']))
+ new_user._id))
response.follow()
context = template.TEMPLATE_TEST_CONTEXT[
'mediagoblin/user_pages/user.html']
@@ -202,8 +187,8 @@ def test_register_views(test_app):
new_user = mg_globals.database.User.find_one(
{'username': 'happygirl'})
assert new_user
- assert new_user['status'] == u'needs_email_verification'
- assert new_user['email_verified'] == False
+ assert new_user.status == u'needs_email_verification'
+ assert new_user.email_verified == False
## Verify the email activation works
template.clear_test_template_context()
@@ -216,8 +201,8 @@ def test_register_views(test_app):
new_user = mg_globals.database.User.find_one(
{'username': 'happygirl'})
assert new_user
- assert new_user['status'] == u'active'
- assert new_user['email_verified'] == True
+ assert new_user.status == u'active'
+ assert new_user.email_verified == True
# Uniqueness checks
# -----------------
@@ -227,7 +212,6 @@ def test_register_views(test_app):
'/auth/register/', {
'username': 'happygirl',
'password': 'iamsohappy2',
- 'confirm_password': 'iamsohappy2',
'email': 'happygrrl2@example.org'})
context = template.TEMPLATE_TEST_CONTEXT[
@@ -249,9 +233,9 @@ def test_register_views(test_app):
## Did we redirect to the proper page? Use the right template?
assert_equal(
urlparse.urlsplit(response.location)[2],
- '/auth/forgot_password/email_sent/')
+ '/auth/login/')
assert template.TEMPLATE_TEST_CONTEXT.has_key(
- 'mediagoblin/auth/fp_email_sent.html')
+ 'mediagoblin/auth/login.html')
## Make sure link to change password is sent by email
assert len(mail.EMAIL_TEST_INBOX) == 1
@@ -269,28 +253,28 @@ def test_register_views(test_app):
# user should have matching parameters
new_user = mg_globals.database.User.find_one({'username': 'happygirl'})
- assert parsed_get_params['userid'] == [unicode(new_user['_id'])]
- assert parsed_get_params['token'] == [new_user['fp_verification_key']]
+ assert parsed_get_params['userid'] == [unicode(new_user._id)]
+ assert parsed_get_params['token'] == [new_user.fp_verification_key]
### The forgotten password token should be set to expire in ~ 10 days
# A few ticks have expired so there are only 9 full days left...
- assert (new_user['fp_token_expire'] - datetime.datetime.now()).days == 9
+ assert (new_user.fp_token_expire - datetime.datetime.now()).days == 9
## Try using a bs password-changing verification key, shouldn't work
template.clear_test_template_context()
response = test_app.get(
"/auth/forgot_password/verify/?userid=%s&token=total_bs" % unicode(
- new_user['_id']), status=400)
- assert response.status == '400 Bad Request'
+ new_user._id), status=404)
+ assert_equal(response.status, '404 Not Found')
## Try using an expired token to change password, shouldn't work
template.clear_test_template_context()
- real_token_expiration = new_user['fp_token_expire']
- new_user['fp_token_expire'] = datetime.datetime.now()
+ real_token_expiration = new_user.fp_token_expire
+ new_user.fp_token_expire = datetime.datetime.now()
new_user.save()
- response = test_app.get("%s?%s" % (path, get_params), status=400)
- assert response.status == '400 Bad Request'
- new_user['fp_token_expire'] = real_token_expiration
+ response = test_app.get("%s?%s" % (path, get_params), status=404)
+ assert_equal(response.status, '404 Not Found')
+ new_user.fp_token_expire = real_token_expiration
new_user.save()
## Verify step 1 of password-change works -- can see form to change password
@@ -304,11 +288,10 @@ def test_register_views(test_app):
'/auth/forgot_password/verify/', {
'userid': parsed_get_params['userid'],
'password': 'iamveryveryhappy',
- 'confirm_password': 'iamveryveryhappy',
'token': parsed_get_params['token']})
response.follow()
assert template.TEMPLATE_TEST_CONTEXT.has_key(
- 'mediagoblin/auth/fp_changed_success.html')
+ 'mediagoblin/auth/login.html')
## Verify step 2.2 of password-change works -- login w/ new password success
template.clear_test_template_context()
@@ -332,11 +315,7 @@ def test_authentication_views(test_app):
Test logging in and logging out
"""
# Make a new user
- test_user = mg_globals.database.User()
- test_user['username'] = u'chris'
- test_user['email'] = u'chris@example.com'
- test_user['pw_hash'] = auth_lib.bcrypt_gen_password_hash('toast')
- test_user.save()
+ test_user = fixture_add_user(active_user=False)
# Get login
# ---------
@@ -412,7 +391,7 @@ def test_authentication_views(test_app):
# Make sure user is in the session
context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html']
session = context['request'].session
- assert session['user_id'] == unicode(test_user['_id'])
+ assert session['user_id'] == unicode(test_user._id)
# Successful logout
# -----------------
diff --git a/mediagoblin/tests/test_celery_setup.py b/mediagoblin/tests/test_celery_setup.py
index 348a4357..19a9b899 100644
--- a/mediagoblin/tests/test_celery_setup.py
+++ b/mediagoblin/tests/test_celery_setup.py
@@ -50,7 +50,7 @@ def test_setup_celery_from_config():
assert isinstance(fake_celery_module.CELERYD_ETA_SCHEDULER_PRECISION, float)
assert fake_celery_module.CELERY_RESULT_PERSISTENT is True
assert fake_celery_module.CELERY_IMPORTS == [
- 'foo.bar.baz', 'this.is.an.import', 'mediagoblin.process_media']
+ 'foo.bar.baz', 'this.is.an.import', 'mediagoblin.processing']
assert fake_celery_module.CELERY_MONGODB_BACKEND_SETTINGS == {
'database': 'mediagoblin'}
assert fake_celery_module.CELERY_RESULT_BACKEND == 'mongodb'
@@ -74,7 +74,7 @@ def test_setup_celery_from_config():
assert isinstance(fake_celery_module.CELERYD_ETA_SCHEDULER_PRECISION, float)
assert fake_celery_module.CELERY_RESULT_PERSISTENT is False
assert fake_celery_module.CELERY_IMPORTS == [
- 'baz.bar.foo', 'import.is.a.this', 'mediagoblin.process_media']
+ 'baz.bar.foo', 'import.is.a.this', 'mediagoblin.processing']
assert fake_celery_module.CELERY_MONGODB_BACKEND_SETTINGS == {
'database': 'captain_lollerskates',
'host': 'mongodb.example.org',
diff --git a/mediagoblin/tests/test_csrf_middleware.py b/mediagoblin/tests/test_csrf_middleware.py
index 691f10b9..c8fca23a 100644
--- a/mediagoblin/tests/test_csrf_middleware.py
+++ b/mediagoblin/tests/test_csrf_middleware.py
@@ -27,7 +27,7 @@ from mediagoblin import mg_globals
def test_csrf_cookie_set(test_app):
cookie_name = mg_globals.app_config['csrf_cookie_name']
-
+
# get login page
response = test_app.get('/auth/login/')
@@ -69,3 +69,22 @@ def test_csrf_token_must_match(test_app):
mg_globals.app_config['csrf_cookie_name'])},
extra_environ={'gmg.verify_csrf': True}).\
status_int == 200
+
+@setup_fresh_app
+def test_csrf_exempt(test_app):
+
+ # monkey with the views to decorate a known endpoint
+ import mediagoblin.auth.views
+ from mediagoblin.meddleware.csrf import csrf_exempt
+
+ mediagoblin.auth.views.login = csrf_exempt(
+ mediagoblin.auth.views.login
+ )
+
+ # construct a request with no cookie or form token
+ assert test_app.post('/auth/login/',
+ extra_environ={'gmg.verify_csrf': True},
+ expect_errors=False).status_int == 200
+
+ # restore the CSRF protection in case other tests expect it
+ mediagoblin.auth.views.login.csrf_enabled = True
diff --git a/mediagoblin/tests/test_edit.py b/mediagoblin/tests/test_edit.py
new file mode 100644
index 00000000..55f34b42
--- /dev/null
+++ b/mediagoblin/tests/test_edit.py
@@ -0,0 +1,95 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from mediagoblin import mg_globals
+from mediagoblin.tests.tools import setup_fresh_app, fixture_add_user
+from mediagoblin.tools import template
+from mediagoblin.auth.lib import bcrypt_check_password
+
+
+@setup_fresh_app
+def test_change_password(test_app):
+ """Test changing password correctly and incorrectly"""
+ # set up new user
+ test_user = fixture_add_user()
+
+ test_app.post(
+ '/auth/login/', {
+ 'username': u'chris',
+ 'password': 'toast'})
+
+ # test that the password can be changed
+ # template.clear_test_template_context()
+ test_app.post(
+ '/edit/account/', {
+ 'old_password': 'toast',
+ 'new_password': '123456',
+ })
+
+ # test_user has to be fetched again in order to have the current values
+ test_user = mg_globals.database.User.one({'username': 'chris'})
+
+ assert bcrypt_check_password('123456', test_user.pw_hash)
+
+ # test that the password cannot be changed if the given old_password
+ # is wrong
+ # template.clear_test_template_context()
+ test_app.post(
+ '/edit/account/', {
+ 'old_password': 'toast',
+ 'new_password': '098765',
+ })
+
+ test_user = mg_globals.database.User.one({'username': 'chris'})
+
+ assert not bcrypt_check_password('098765', test_user.pw_hash)
+
+
+@setup_fresh_app
+def change_bio_url(test_app):
+ """Test changing bio and URL"""
+ # set up new user
+ test_user = fixture_add_user()
+
+ # test changing the bio and the URL properly
+ test_app.post(
+ '/edit/profile/', {
+ 'bio': u'I love toast!',
+ 'url': u'http://dustycloud.org/'})
+
+ test_user = mg_globals.database.User.one({'username': 'chris'})
+
+ assert test_user.bio == u'I love toast!'
+ assert test_user.url == u'http://dustycloud.org/'
+
+ # test changing the bio and the URL inproperly
+ too_long_bio = 150 * 'T' + 150 * 'o' + 150 * 'a' + 150 * 's' + 150* 't'
+
+ test_app.post(
+ '/edit/profile/', {
+ # more than 500 characters
+ 'bio': too_long_bio,
+ 'url': 'this-is-no-url'})
+
+ test_user = mg_globals.database.User.one({'username': 'chris'})
+
+ context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/edit/edit_profile.html']
+ form = context['edit_profile_form']
+
+ assert form.bio.errors == [u'Field must be between 0 and 500 characters long.']
+ assert form.url.errors == [u'Improperly formed URL']
+
+ # test changing the url inproperly
diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini
index ab32cccc..c91ed92b 100644
--- a/mediagoblin/tests/test_mgoblin_app.ini
+++ b/mediagoblin/tests/test_mgoblin_app.ini
@@ -1,13 +1,15 @@
[mediagoblin]
-direct_remote_path = /mgoblin_static/
+direct_remote_path = /test_static/
email_sender_address = "notice@mediagoblin.example.org"
email_debug_mode = true
db_name = __mediagoblin_tests__
# tag parsing
-tags_delimiter = ","
tags_max_length = 50
+# So we can start to test attachments:
+allow_attachments = True
+
# Celery shouldn't be set up by the application as it's setup via
# mediagoblin.init.celery.from_celery
celery_setup_elsewhere = true
diff --git a/mediagoblin/tests/test_migrations.py b/mediagoblin/tests/test_migrations.py
index e7cef0a1..8e573f5a 100644
--- a/mediagoblin/tests/test_migrations.py
+++ b/mediagoblin/tests/test_migrations.py
@@ -20,10 +20,10 @@ from pymongo import Connection
from mediagoblin.tests.tools import (
install_fixtures_simple, assert_db_meets_expected)
-from mediagoblin.db.util import (
+from mediagoblin.db.mongo.util import (
RegisterMigration, MigrationManager, ObjectId,
MissingCurrentMigration)
-from mediagoblin.db.migrations import add_table_field
+from mediagoblin.db.mongo.migrations import add_table_field
# This one will get filled with local migrations
TEST_MIGRATION_REGISTRY = {}
diff --git a/mediagoblin/tests/test_misc.py b/mediagoblin/tests/test_misc.py
new file mode 100644
index 00000000..09623355
--- /dev/null
+++ b/mediagoblin/tests/test_misc.py
@@ -0,0 +1,26 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from nose.tools import assert_equal
+
+from mediagoblin.tests.tools import setup_fresh_app
+
+
+@setup_fresh_app
+def test_404_for_non_existent(test_app):
+ assert_equal(test_app.get('/does-not-exist/',
+ expect_errors=True).status_int,
+ 404)
diff --git a/mediagoblin/tests/test_paste.ini b/mediagoblin/tests/test_paste.ini
index e7574b7a..bd57994b 100644
--- a/mediagoblin/tests/test_paste.ini
+++ b/mediagoblin/tests/test_paste.ini
@@ -5,7 +5,7 @@ debug = true
use = egg:Paste#urlmap
/ = mediagoblin
/mgoblin_media/ = publicstore_serve
-/mgoblin_static/ = mediagoblin_static
+/test_static/ = mediagoblin_static
[app:mediagoblin]
use = egg:mediagoblin#app
diff --git a/mediagoblin/tests/test_storage.py b/mediagoblin/tests/test_storage.py
index 46ecb2ec..eab4d032 100644
--- a/mediagoblin/tests/test_storage.py
+++ b/mediagoblin/tests/test_storage.py
@@ -57,6 +57,10 @@ class FakeRemoteStorage(storage.filestorage.BasicFileStorage):
# should force copying to the workbench
local_storage = False
+ def copy_local_to_storage(self, *args, **kwargs):
+ return storage.StorageInterface.copy_local_to_storage(
+ self, *args, **kwargs)
+
def test_storage_system_from_config():
this_storage = storage.storage_system_from_config(
@@ -252,3 +256,26 @@ def test_basic_storage_copy_locally():
this_storage.copy_locally(filepath, new_file_dest)
assert file(new_file_dest).read() == 'Testing this file'
+
+
+def _test_copy_local_to_storage_works(tmpdir, this_storage):
+ local_filename = tempfile.mktemp()
+ with file(local_filename, 'w') as tmpfile:
+ tmpfile.write('haha')
+
+ this_storage.copy_local_to_storage(
+ local_filename, ['dir1', 'dir2', 'copiedto.txt'])
+
+ assert file(
+ os.path.join(tmpdir, 'dir1/dir2/copiedto.txt'),
+ 'r').read() == 'haha'
+
+
+def test_basic_storage_copy_local_to_storage():
+ tmpdir, this_storage = get_tmp_filestorage()
+ _test_copy_local_to_storage_works(tmpdir, this_storage)
+
+
+def test_general_storage_copy_local_to_storage():
+ tmpdir, this_storage = get_tmp_filestorage(fake_remote=True)
+ _test_copy_local_to_storage_works(tmpdir, this_storage)
diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py
index 1c657e6c..b3c11249 100644
--- a/mediagoblin/tests/test_submission.py
+++ b/mediagoblin/tests/test_submission.py
@@ -1,3 +1,4 @@
+
# GNU MediaGoblin -- federated, autonomous media hosting
# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
#
@@ -16,11 +17,12 @@
import urlparse
import pkg_resources
+import re
from nose.tools import assert_equal, assert_true, assert_false
-from mediagoblin.auth import lib as auth_lib
-from mediagoblin.tests.tools import setup_fresh_app, get_test_app
+from mediagoblin.tests.tools import setup_fresh_app, get_test_app, \
+ fixture_add_user
from mediagoblin import mg_globals
from mediagoblin.tools import template, common
@@ -45,21 +47,21 @@ class TestSubmission:
# TODO: Possibly abstract into a decorator like:
# @as_authenticated_user('chris')
- test_user = mg_globals.database.User()
- test_user['username'] = u'chris'
- test_user['email'] = u'chris@example.com'
- test_user['email_verified'] = True
- test_user['status'] = u'active'
- test_user['pw_hash'] = auth_lib.bcrypt_gen_password_hash('toast')
- test_user.save()
+ test_user = fixture_add_user()
self.test_user = test_user
+ self.login()
+
+ def login(self):
self.test_app.post(
'/auth/login/', {
'username': u'chris',
'password': 'toast'})
+ def logout(self):
+ self.test_app.get('/auth/logout/')
+
def test_missing_fields(self):
# Test blank form
# ---------------
@@ -99,6 +101,14 @@ class TestSubmission:
assert template.TEMPLATE_TEST_CONTEXT.has_key(
'mediagoblin/user_pages/user.html')
+ # Make sure the media view is at least reachable, logged in...
+ self.test_app.get('/u/chris/m/normal-upload-1/')
+ # ... and logged out too.
+ self.logout()
+ self.test_app.get('/u/chris/m/normal-upload-1/')
+ # Log back in for the remaining tests.
+ self.login()
+
# Test PNG
# --------
template.clear_test_template_context()
@@ -176,8 +186,8 @@ class TestSubmission:
response = self.test_app.post(
request.urlgen('mediagoblin.user_pages.media_confirm_delete',
# No work: user=media.uploader().username,
- user=self.test_user['username'],
- media=media['_id']),
+ user=self.test_user.username,
+ media=media._id),
# no value means no confirm
{})
@@ -196,8 +206,8 @@ class TestSubmission:
response = self.test_app.post(
request.urlgen('mediagoblin.user_pages.media_confirm_delete',
# No work: user=media.uploader().username,
- user=self.test_user['username'],
- media=media['_id']),
+ user=self.test_user.username,
+ media=media._id),
{'confirm': 'y'})
response.follow()
@@ -208,7 +218,7 @@ class TestSubmission:
# Does media entry still exist?
assert_false(
request.db.MediaEntry.find(
- {'_id': media['_id']}).count())
+ {'_id': media._id}).count())
def test_malicious_uploads(self):
# Test non-suppoerted file with non-supported extension
@@ -222,7 +232,8 @@ class TestSubmission:
context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
form = context['submit_form']
- assert form.file.errors == ['The file doesn\'t seem to be an image!']
+ assert re.match(r'^Could not extract any file extension from ".*?"$', str(form.file.errors[0]))
+ assert len(form.file.errors) == 1
# NOTE: The following 2 tests will ultimately fail, but they
# *will* pass the initial form submission step. Instead,
@@ -243,10 +254,10 @@ class TestSubmission:
entry = mg_globals.database.MediaEntry.find_one(
{'title': 'Malicious Upload 2'})
- assert_equal(entry['state'], 'failed')
+ assert_equal(entry.state, 'failed')
assert_equal(
entry['fail_error'],
- u'mediagoblin.process_media.errors:BadMediaFail')
+ u'mediagoblin.processing:BadMediaFail')
# Test non-supported file with .png extension
# -------------------------------------------
@@ -263,7 +274,7 @@ class TestSubmission:
entry = mg_globals.database.MediaEntry.find_one(
{'title': 'Malicious Upload 3'})
- assert_equal(entry['state'], 'failed')
+ assert_equal(entry.state, 'failed')
assert_equal(
entry['fail_error'],
- u'mediagoblin.process_media.errors:BadMediaFail')
+ u'mediagoblin.processing:BadMediaFail')
diff --git a/mediagoblin/tests/test_tags.py b/mediagoblin/tests/test_tags.py
index a05831c9..583c1a55 100644
--- a/mediagoblin/tests/test_tags.py
+++ b/mediagoblin/tests/test_tags.py
@@ -39,11 +39,4 @@ def test_list_of_dicts_conversion(test_app):
# Make sure converting the list of dicts to a string works
assert text.media_tags_as_string([{'name': u'yin', 'slug': u'yin'},
{'name': u'yang', 'slug': u'yang'}]) == \
- u'yin,yang'
-
- # If the tag delimiter is a space then we expect different results
- mg_globals.app_config['tags_delimiter'] = u' '
- assert text.convert_to_tag_list_of_dicts('unicorn ceramic nazi') == [
- {'name': u'unicorn', 'slug': u'unicorn'},
- {'name': u'ceramic', 'slug': u'ceramic'},
- {'name': u'nazi', 'slug': u'nazi'}]
+ u'yin, yang'
diff --git a/mediagoblin/tests/test_tests.py b/mediagoblin/tests/test_tests.py
index bc5f9a8d..25bb52b3 100644
--- a/mediagoblin/tests/test_tests.py
+++ b/mediagoblin/tests/test_tests.py
@@ -27,9 +27,9 @@ def test_get_test_app_wipes_db():
assert mg_globals.database.User.find().count() == 0
new_user = mg_globals.database.User()
- new_user['username'] = u'lolcat'
- new_user['email'] = u'lol@cats.example.org'
- new_user['pw_hash'] = u'pretend_this_is_a_hash'
+ new_user.username = u'lolcat'
+ new_user.email = u'lol@cats.example.org'
+ new_user.pw_hash = u'pretend_this_is_a_hash'
new_user.save()
assert mg_globals.database.User.find().count() == 1
diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py
index cf84da14..49a3d33e 100644
--- a/mediagoblin/tests/tools.py
+++ b/mediagoblin/tests/tools.py
@@ -21,10 +21,13 @@ import os, shutil
from paste.deploy import loadapp
from webtest import TestApp
+from mediagoblin import mg_globals
from mediagoblin.tools import testing
from mediagoblin.init.config import read_mediagoblin_config
from mediagoblin.decorators import _make_safe
from mediagoblin.db.open import setup_connection_and_db_from_config
+from mediagoblin.meddleware import BaseMeddleware
+from mediagoblin.auth.lib import bcrypt_gen_password_hash
MEDIAGOBLIN_TEST_DB_NAME = u'__mediagoblin_tests__'
@@ -49,6 +52,45 @@ $ CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_tests ./bin/nosetests"""
class BadCeleryEnviron(Exception): pass
+class TestingMeddleware(BaseMeddleware):
+ """
+ Meddleware for the Unit tests
+
+ It might make sense to perform some tests on all
+ requests/responses. Or prepare them in a special
+ manner. For example all html responses could be tested
+ for being valid html *after* being rendered.
+
+ This module is getting inserted at the front of the
+ meddleware list, which means: requests are handed here
+ first, responses last. So this wraps up the "normal"
+ app.
+
+ If you need to add a test, either add it directly to
+ the appropiate process_request or process_response, or
+ create a new method and call it from process_*.
+ """
+
+ def process_response(self, request, response):
+ # All following tests should be for html only!
+ if response.content_type != "text/html":
+ # Get out early
+ return
+
+ # If the template contains a reference to
+ # /mgoblin_static/ instead of using
+ # /request.staticdirect(), error out here.
+ # This could probably be implemented as a grep on
+ # the shipped templates easier...
+ if response.text.find("/mgoblin_static/") >= 0:
+ raise AssertionError(
+ "Response HTML contains reference to /mgoblin_static/ "
+ "instead of staticdirect. Request was for: "
+ + request.full_path)
+
+ return
+
+
def suicide_if_bad_celery_environ():
if not os.environ.get('CELERY_CONFIG_MODULE') == \
'mediagoblin.init.celery.from_tests':
@@ -103,6 +145,12 @@ def get_test_app(dump_old_app=True):
test_app = loadapp(
'config:' + TEST_SERVER_CONFIG)
+ # Insert the TestingMeddleware, which can do some
+ # sanity checks on every request/response.
+ # Doing it this way is probably not the cleanest way.
+ # We'll fix it, when we have plugins!
+ mg_globals.app.meddleware.insert(0, TestingMeddleware(mg_globals.app))
+
app = TestApp(test_app)
MGOBLIN_APP = app
@@ -153,3 +201,19 @@ def assert_db_meets_expected(db, expected):
document = collection.find_one({'_id': expected_document['_id']})
assert document is not None # make sure it exists
assert document == expected_document # make sure it matches
+
+
+def fixture_add_user(username = u'chris', password = 'toast',
+ active_user = True):
+ test_user = mg_globals.database.User()
+ test_user.username = username
+ test_user.email = username + u'@example.com'
+ if password is not None:
+ test_user.pw_hash = bcrypt_gen_password_hash(password)
+ if active_user:
+ test_user.email_verified = True
+ test_user.status = u'active'
+
+ test_user.save()
+
+ return test_user
diff --git a/mediagoblin/tools/common.py b/mediagoblin/tools/common.py
index ea4541a8..12d8309e 100644
--- a/mediagoblin/tools/common.py
+++ b/mediagoblin/tools/common.py
@@ -21,6 +21,7 @@ DISPLAY_IMAGE_FETCHING_ORDER = [u'medium', u'original', u'thumb']
global TESTS_ENABLED
TESTS_ENABLED = False
+
def import_component(import_string):
"""
Import a module component defined by STRING. Probably a method,
diff --git a/mediagoblin/tools/files.py b/mediagoblin/tools/files.py
index e0bf0569..10f1d994 100644
--- a/mediagoblin/tools/files.py
+++ b/mediagoblin/tools/files.py
@@ -23,7 +23,7 @@ def delete_media_files(media):
Arguments:
- media: A MediaEntry document
"""
- for listpath in media['media_files'].itervalues():
+ for listpath in media.media_files.itervalues():
mg_globals.public_store.delete_file(
listpath)
diff --git a/mediagoblin/tools/mail.py b/mediagoblin/tools/mail.py
index 826acdbf..9e00be7d 100644
--- a/mediagoblin/tools/mail.py
+++ b/mediagoblin/tools/mail.py
@@ -24,7 +24,7 @@ from mediagoblin.tools import common
### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# We have two "test inboxes" here:
-#
+#
# EMAIL_TEST_INBOX:
# ----------------
# If you're writing test views, you'll probably want to check this.
@@ -44,11 +44,12 @@ from mediagoblin.tools import common
# ***IMPORTANT!***
# ----------------
# Before running tests that call functions which send email, you should
-# always call _clear_test_inboxes() to "wipe" the inboxes clean.
+# always call _clear_test_inboxes() to "wipe" the inboxes clean.
EMAIL_TEST_INBOX = []
EMAIL_TEST_MBOX_INBOX = []
+
class FakeMhost(object):
"""
Just a fake mail host so we can capture and test messages
@@ -63,12 +64,14 @@ class FakeMhost(object):
'to': to_addrs,
'message': message})
+
def _clear_test_inboxes():
global EMAIL_TEST_INBOX
global EMAIL_TEST_MBOX_INBOX
EMAIL_TEST_INBOX = []
EMAIL_TEST_MBOX_INBOX = []
+
### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### </Special email test stuff>
### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/mediagoblin/tools/pagination.py b/mediagoblin/tools/pagination.py
index 3ea96e6d..5ebc3c5a 100644
--- a/mediagoblin/tools/pagination.py
+++ b/mediagoblin/tools/pagination.py
@@ -19,8 +19,10 @@ import copy
from math import ceil, floor
from itertools import izip, count
+
PAGINATION_DEFAULT_PER_PAGE = 30
+
class Pagination(object):
"""
Pagination class for mongodb queries.
@@ -37,9 +39,9 @@ class Pagination(object):
Args:
- page: requested page
- per_page: number of objects per page
- - cursor: db cursor
- - jump_to_id: ObjectId, sets the page to the page containing the object
- with _id == jump_to_id.
+ - cursor: db cursor
+ - jump_to_id: ObjectId, sets the page to the page containing the
+ object with _id == jump_to_id.
"""
self.page = page
self.per_page = per_page
@@ -51,7 +53,7 @@ class Pagination(object):
cursor = copy.copy(self.cursor)
for (doc, increment) in izip(cursor, count(0)):
- if doc['_id'] == jump_to_id:
+ if doc._id == jump_to_id:
self.page = 1 + int(floor(increment / self.per_page))
self.active_id = jump_to_id
@@ -91,19 +93,19 @@ class Pagination(object):
last = num
def get_page_url_explicit(self, base_url, get_params, page_no):
- """
+ """
Get a page url by adding a page= parameter to the base url
- """
+ """
new_get_params = copy.copy(get_params or {})
new_get_params['page'] = page_no
return "%s?%s" % (
base_url, urllib.urlencode(new_get_params))
def get_page_url(self, request, page_no):
- """
+ """
Get a new page url based of the request, and the new page number.
This is a nice wrapper around get_page_url_explicit()
- """
+ """
return self.get_page_url_explicit(
request.full_path, request.GET, page_no)
diff --git a/mediagoblin/tools/request.py b/mediagoblin/tools/request.py
index b1cbe119..7e193125 100644
--- a/mediagoblin/tools/request.py
+++ b/mediagoblin/tools/request.py
@@ -14,7 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from mediagoblin.db.util import ObjectId
+from mediagoblin.db.util import ObjectId, InvalidId
def setup_user_in_request(request):
"""
@@ -25,13 +25,17 @@ def setup_user_in_request(request):
request.user = None
return
- user = None
- user = request.app.db.User.one(
- {'_id': ObjectId(request.session['user_id'])})
+ try:
+ oid = ObjectId(request.session['user_id'])
+ except InvalidId:
+ user = None
+ else:
+ user = request.db.User.one({'_id': oid})
if not user:
# Something's wrong... this user doesn't exist? Invalidate
# this session.
+ print "Killing session for %r" % request.session['user_id']
request.session.invalidate()
request.user = user
diff --git a/mediagoblin/tools/response.py b/mediagoblin/tools/response.py
index 1477b9bc..c905097c 100644
--- a/mediagoblin/tools/response.py
+++ b/mediagoblin/tools/response.py
@@ -17,22 +17,25 @@
from webob import Response, exc
from mediagoblin.tools.template import render_template
+
def render_to_response(request, template, context, status=200):
"""Much like Django's shortcut.render()"""
return Response(
render_template(request, template, context),
status=status)
+
def render_404(request):
"""
Render a 404.
"""
return render_to_response(
- request, 'mediagoblin/404.html', {}, status=400)
+ request, 'mediagoblin/404.html', {}, status=404)
+
def redirect(request, *args, **kwargs):
"""Returns a HTTPFound(), takes a request and then urlgen params"""
-
+
querystring = None
if kwargs.get('querystring'):
querystring = kwargs.get('querystring')
diff --git a/mediagoblin/tools/template.py b/mediagoblin/tools/template.py
index a773ca99..54a40de6 100644
--- a/mediagoblin/tools/template.py
+++ b/mediagoblin/tools/template.py
@@ -17,18 +17,19 @@
from math import ceil
import jinja2
from babel.localedata import exists
-from babel.support import LazyProxy
from mediagoblin import mg_globals
from mediagoblin import messages
from mediagoblin.tools import common
from mediagoblin.tools.translate import setup_gettext
-from mediagoblin.middleware.csrf import render_csrf_form_token
+from mediagoblin.meddleware.csrf import render_csrf_form_token
+
SETUP_JINJA_ENVS = {}
+
def get_jinja_env(template_loader, locale):
"""
- Set up the Jinja environment,
+ Set up the Jinja environment,
(In the future we may have another system for providing theming;
for now this is good enough.)
@@ -40,8 +41,11 @@ def get_jinja_env(template_loader, locale):
if SETUP_JINJA_ENVS.has_key(locale):
return SETUP_JINJA_ENVS[locale]
+ # jinja2.StrictUndefined will give exceptions on references
+ # to undefined/unknown variables in templates.
template_env = jinja2.Environment(
loader=template_loader, autoescape=True,
+ undefined=jinja2.StrictUndefined,
extensions=['jinja2.ext.i18n', 'jinja2.ext.autoescape'])
template_env.install_gettext_callables(
@@ -51,15 +55,19 @@ def get_jinja_env(template_loader, locale):
# All templates will know how to ...
# ... fetch all waiting messages and remove them from the queue
# ... construct a grid of thumbnails or other media
+ # ... have access to the global and app config
template_env.globals['fetch_messages'] = messages.fetch_messages
template_env.globals['gridify_list'] = gridify_list
template_env.globals['gridify_cursor'] = gridify_cursor
+ template_env.globals['app_config'] = mg_globals.app_config
+ template_env.globals['global_config'] = mg_globals.global_config
if exists(locale):
SETUP_JINJA_ENVS[locale] = template_env
return template_env
+
# We'll store context information here when doing unit tests
TEMPLATE_TEST_CONTEXT = {}
@@ -74,10 +82,12 @@ def render_template(request, template_path, context):
template = request.template_env.get_template(
template_path)
context['request'] = request
- context['csrf_token'] = render_csrf_form_token(request)
+ rendered_csrf_token = render_csrf_form_token(request)
+ if rendered_csrf_token is not None:
+ context['csrf_token'] = render_csrf_form_token(request)
rendered = template.render(context)
-
- if common.TESTS_ENABLED:
+
+ if common.TESTS_ENABLED:
TEMPLATE_TEST_CONTEXT[template_path] = context
return rendered
@@ -87,6 +97,7 @@ def clear_test_template_context():
global TEMPLATE_TEST_CONTEXT
TEMPLATE_TEST_CONTEXT = {}
+
def gridify_list(this_list, num_cols=5):
"""
Generates a list of lists where each sub-list's length depends on
diff --git a/mediagoblin/tools/text.py b/mediagoblin/tools/text.py
index de4bb281..d576224d 100644
--- a/mediagoblin/tools/text.py
+++ b/mediagoblin/tools/text.py
@@ -21,6 +21,7 @@ from lxml.html.clean import Cleaner
from mediagoblin import mg_globals
from mediagoblin.tools import url
+
# A super strict version of the lxml.html cleaner class
HTML_CLEANER = Cleaner(
scripts=True,
@@ -42,6 +43,8 @@ HTML_CLEANER = Cleaner(
host_whitelist=(),
whitelist_tags=set([]))
+TAGS_DELIMITER=',';
+
def clean_html(html):
# clean_html barfs on an empty string
if not html:
@@ -49,6 +52,7 @@ def clean_html(html):
return HTML_CLEANER.clean_html(html)
+
def convert_to_tag_list_of_dicts(tag_string):
"""
Filter input from incoming string containing user tags,
@@ -64,7 +68,7 @@ def convert_to_tag_list_of_dicts(tag_string):
# Split the tag string into a list of tags
for tag in stripped_tag_string.split(
- mg_globals.app_config['tags_delimiter']):
+ TAGS_DELIMITER):
# Ignore empty or duplicate tags
if tag.strip() and tag.strip() not in [t['name'] for t in taglist]:
@@ -73,6 +77,7 @@ def convert_to_tag_list_of_dicts(tag_string):
'slug': url.slugify(tag.strip())})
return taglist
+
def media_tags_as_string(media_entry_tags):
"""
Generate a string from a media item's tags, stored as a list of dicts
@@ -81,13 +86,15 @@ def media_tags_as_string(media_entry_tags):
"""
media_tag_string = ''
if media_entry_tags:
- media_tag_string = mg_globals.app_config['tags_delimiter'].join(
+ media_tag_string = (TAGS_DELIMITER+u' ').join(
[tag['name'] for tag in media_entry_tags])
return media_tag_string
+
TOO_LONG_TAG_WARNING = \
u'Tags must be shorter than %s characters. Tags that are too long: %s'
+
def tag_length_validator(form, field):
"""
Make sure tags do not exceed the maximum tag length.
@@ -105,6 +112,7 @@ def tag_length_validator(form, field):
MARKDOWN_INSTANCE = markdown.Markdown(safe_mode='escape')
+
def cleaned_markdown_conversion(text):
"""
Take a block of text, run it through MarkDown, and clean its HTML.
diff --git a/mediagoblin/tools/url.py b/mediagoblin/tools/url.py
index 458ef2c8..78b5dd63 100644
--- a/mediagoblin/tools/url.py
+++ b/mediagoblin/tools/url.py
@@ -17,8 +17,10 @@
import re
import translitcodec
+
_punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+')
+
def slugify(text, delim=u'-'):
"""
Generates an ASCII-only slug. Taken from http://flask.pocoo.org/snippets/5/
diff --git a/mediagoblin/user_pages/__init__.py b/mediagoblin/user_pages/__init__.py
index 576bd0f5..ba347c69 100644
--- a/mediagoblin/user_pages/__init__.py
+++ b/mediagoblin/user_pages/__init__.py
@@ -13,5 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
diff --git a/mediagoblin/user_pages/forms.py b/mediagoblin/user_pages/forms.py
index 301f1f0a..e04fd559 100644
--- a/mediagoblin/user_pages/forms.py
+++ b/mediagoblin/user_pages/forms.py
@@ -21,7 +21,7 @@ from mediagoblin.tools.translate import fake_ugettext_passthrough as _
class MediaCommentForm(wtforms.Form):
comment_content = wtforms.TextAreaField(
- _('Comment'),
+ _(''),
[wtforms.validators.Required()])
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py
index 484c1e28..a234722f 100644
--- a/mediagoblin/user_pages/views.py
+++ b/mediagoblin/user_pages/views.py
@@ -30,6 +30,8 @@ from mediagoblin.decorators import (uses_pagination, get_user_media_entry,
from werkzeug.contrib.atom import AtomFeed
+from mediagoblin.media_types import get_media_manager
+
@uses_pagination
def user_home(request, page):
@@ -38,14 +40,14 @@ def user_home(request, page):
'username': request.matchdict['user']})
if not user:
return render_404(request)
- elif user['status'] != u'active':
+ elif user.status != u'active':
return render_to_response(
request,
'mediagoblin/user_pages/user.html',
{'user': user})
cursor = request.db.MediaEntry.find(
- {'uploader': user['_id'],
+ {'uploader': user._id,
'state': 'processed'}).sort('created', DESCENDING)
pagination = Pagination(page, cursor)
@@ -54,10 +56,10 @@ def user_home(request, page):
#if no data is available, return NotFound
if media_entries == None:
return render_404(request)
-
+
user_gallery_url = request.urlgen(
'mediagoblin.user_pages.user_gallery',
- user=user['username'])
+ user=user.username)
return render_to_response(
request,
@@ -67,6 +69,7 @@ def user_home(request, page):
'media_entries': media_entries,
'pagination': pagination})
+
@uses_pagination
def user_gallery(request, page):
"""'Gallery' of a User()"""
@@ -77,7 +80,7 @@ def user_gallery(request, page):
return render_404(request)
cursor = request.db.MediaEntry.find(
- {'uploader': user['_id'],
+ {'uploader': user._id,
'state': 'processed'}).sort('created', DESCENDING)
pagination = Pagination(page, cursor)
@@ -86,7 +89,7 @@ def user_gallery(request, page):
#if no data is available, return NotFound
if media_entries == None:
return render_404(request)
-
+
return render_to_response(
request,
'mediagoblin/user_pages/gallery.html',
@@ -96,6 +99,7 @@ def user_gallery(request, page):
MEDIA_COMMENTS_PER_PAGE = 50
+
@get_user_media_entry
@uses_pagination
def media_home(request, media, page, **kwargs):
@@ -104,19 +108,25 @@ def media_home(request, media, page, **kwargs):
"""
if ObjectId(request.matchdict.get('comment')):
pagination = Pagination(
- page, media.get_comments(), MEDIA_COMMENTS_PER_PAGE,
+ page, media.get_comments(
+ mg_globals.app_config['comments_ascending']),
+ MEDIA_COMMENTS_PER_PAGE,
ObjectId(request.matchdict.get('comment')))
else:
pagination = Pagination(
- page, media.get_comments(), MEDIA_COMMENTS_PER_PAGE)
+ page, media.get_comments(
+ mg_globals.app_config['comments_ascending']),
+ MEDIA_COMMENTS_PER_PAGE)
comments = pagination()
comment_form = user_forms.MediaCommentForm(request.POST)
+ media_template_name = get_media_manager(media.media_type)['display_template']
+
return render_to_response(
request,
- 'mediagoblin/user_pages/media.html',
+ media_template_name,
{'media': media,
'comments': comments,
'pagination': pagination,
@@ -133,8 +143,8 @@ def media_post_comment(request, media):
assert request.method == 'POST'
comment = request.db.MediaComment()
- comment['media_entry'] = media['_id']
- comment['author'] = request.user['_id']
+ comment['media_entry'] = media._id
+ comment['author'] = request.user._id
comment['content'] = unicode(request.POST['comment_content'])
comment['content_html'] = cleaned_markdown_conversion(comment['content'])
@@ -142,13 +152,13 @@ def media_post_comment(request, media):
messages.add_message(
request,
messages.ERROR,
- _("Empty comments are not allowed."))
+ _("Oops, your comment was empty."))
else:
comment.save()
messages.add_message(
request, messages.SUCCESS,
- _('Comment posted!'))
+ _('Your comment has been posted!'))
return exc.HTTPFound(
location=media.url_for_self(request.urlgen))
@@ -163,21 +173,26 @@ def media_confirm_delete(request, media):
if request.method == 'POST' and form.validate():
if form.confirm.data is True:
- username = media.uploader()['username']
+ username = media.get_uploader.username
# Delete all files on the public storage
delete_media_files(media)
media.delete()
+ messages.add_message(
+ request, messages.SUCCESS, _('You deleted the media.'))
return redirect(request, "mediagoblin.user_pages.user_home",
user=username)
else:
+ messages.add_message(
+ request, messages.ERROR,
+ _("The media was not deleted because you didn't check that you were sure."))
return exc.HTTPFound(
location=media.url_for_self(request.urlgen))
- if ((request.user[u'is_admin'] and
- request.user[u'_id'] != media.uploader()[u'_id'])):
+ if ((request.user.is_admin and
+ request.user._id != media.uploader)):
messages.add_message(
request, messages.WARNING,
_("You are about to delete another user's media. "
@@ -192,6 +207,7 @@ def media_confirm_delete(request, media):
ATOM_DEFAULT_NR_OF_UPDATED_ITEMS = 15
+
def atom_feed(request):
"""
generates the atom feed with the newest images
@@ -204,22 +220,42 @@ def atom_feed(request):
return render_404(request)
cursor = request.db.MediaEntry.find({
- 'uploader': user['_id'],
+ 'uploader': user._id,
'state': 'processed'}) \
.sort('created', DESCENDING) \
.limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS)
- feed = AtomFeed(request.matchdict['user'],
+ """
+ ATOM feed id is a tag URI (see http://en.wikipedia.org/wiki/Tag_URI)
+ """
+ feed = AtomFeed(
+ "MediaGoblin: Feed for user '%s'" % request.matchdict['user'],
feed_url=request.url,
- url=request.host_url)
-
+ id='tag:'+request.host+',2011:gallery.user-'+request.matchdict['user'],
+ links=[{
+ 'href': request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ qualified=True,user=request.matchdict['user']),
+ 'rel': 'alternate',
+ 'type': 'text/html'}])
+
for entry in cursor:
feed.add(entry.get('title'),
entry.get('description_html'),
+ id=entry.url_for_self(request.urlgen,qualified=True),
content_type='html',
- author=request.matchdict['user'],
+ author={
+ 'name': entry.get_uploader.username,
+ 'uri': request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ qualified=True, user=entry.get_uploader.username)},
updated=entry.get('created'),
- url=entry.url_for_self(request.urlgen))
+ links=[{
+ 'href': entry.url_for_self(
+ request.urlgen,
+ qualified=True),
+ 'rel': 'alternate',
+ 'type': 'text/html'}])
return feed.get_response()
@@ -238,7 +274,7 @@ def processing_panel(request):
# Make sure the user exists and is active
if not user:
return render_404(request)
- elif user['status'] != u'active':
+ elif user.status != u'active':
return render_to_response(
request,
'mediagoblin/user_pages/user.html',
@@ -248,7 +284,7 @@ def processing_panel(request):
#
# Make sure we have permission to access this user's panel. Only
# admins and this user herself should be able to do so.
- if not (user[u'_id'] == request.user[u'_id']
+ if not (user._id == request.user._id
or request.user.is_admin):
# No? Let's simply redirect to this user's homepage then.
return redirect(
@@ -257,12 +293,12 @@ def processing_panel(request):
# Get media entries which are in-processing
processing_entries = request.db.MediaEntry.find(
- {'uploader': user['_id'],
+ {'uploader': user._id,
'state': 'processing'}).sort('created', DESCENDING)
# Get media entries which have failed to process
failed_entries = request.db.MediaEntry.find(
- {'uploader': user['_id'],
+ {'uploader': user._id,
'state': 'failed'}).sort('created', DESCENDING)
# Render to response
diff --git a/mediagoblin/views.py b/mediagoblin/views.py
index 22f9268d..1e1db6c3 100644
--- a/mediagoblin/views.py
+++ b/mediagoblin/views.py
@@ -20,6 +20,8 @@ from mediagoblin.tools.response import render_to_response
from mediagoblin.db.util import DESCENDING
from mediagoblin.decorators import uses_pagination
+
+
@uses_pagination
def root_view(request, page):
cursor = request.db.MediaEntry.find(
@@ -27,7 +29,6 @@ def root_view(request, page):
pagination = Pagination(page, cursor)
media_entries = pagination()
-
return render_to_response(
request, 'mediagoblin/root.html',
{'media_entries': media_entries,
diff --git a/mediagoblin/webfinger/__init__.py b/mediagoblin/webfinger/__init__.py
new file mode 100644
index 00000000..ec7ec884
--- /dev/null
+++ b/mediagoblin/webfinger/__init__.py
@@ -0,0 +1,25 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+'''
+mediagoblin.webfinger_ provides an LRDD discovery service and
+a web host meta information file
+
+Links:
+- `LRDD Discovery Draft
+ <http://tools.ietf.org/html/draft-hammer-discovery-06>`_.
+- `RFC 6415 - Web Host Metadata
+ <http://tools.ietf.org/html/rfc6415>`_.
+'''
diff --git a/mediagoblin/webfinger/routing.py b/mediagoblin/webfinger/routing.py
new file mode 100644
index 00000000..effb2bf2
--- /dev/null
+++ b/mediagoblin/webfinger/routing.py
@@ -0,0 +1,25 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from routes.route import Route
+
+webfinger_well_known_routes = [
+ Route('mediagoblin.webfinger.host_meta', '/host-meta',
+ controller='mediagoblin.webfinger.views:host_meta')]
+
+webfinger_routes = [
+ Route('mediagoblin.webfinger.xrd', '/xrd',
+ controller='mediagoblin.webfinger.views:xrd')]
diff --git a/mediagoblin/webfinger/views.py b/mediagoblin/webfinger/views.py
new file mode 100644
index 00000000..22086396
--- /dev/null
+++ b/mediagoblin/webfinger/views.py
@@ -0,0 +1,117 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+'''
+For references, see docstring in mediagoblin/webfinger/__init__.py
+'''
+
+import re
+
+from urlparse import urlparse
+
+from mediagoblin.tools.response import render_to_response, render_404
+
+def host_meta(request):
+ '''
+ Webfinger host-meta
+ '''
+
+ placeholder = 'MG_LRDD_PLACEHOLDER'
+
+ lrdd_title = 'GNU MediaGoblin - User lookup'
+
+ lrdd_template = request.urlgen(
+ 'mediagoblin.webfinger.xrd',
+ uri=placeholder,
+ qualified=True)
+
+ return render_to_response(
+ request,
+ 'mediagoblin/webfinger/host-meta.xml',
+ {'request': request,
+ 'lrdd_template': lrdd_template,
+ 'lrdd_title': lrdd_title,
+ 'placeholder': placeholder})
+
+MATCH_SCHEME_PATTERN = re.compile(r'^acct:')
+
+def xrd(request):
+ '''
+ Find user data based on a webfinger URI
+ '''
+ param_uri = request.GET.get('uri')
+
+ if not param_uri:
+ return render_404(request)
+
+ '''
+ :py:module:`urlparse` does not recognize usernames in URIs of the
+ form ``acct:user@example.org`` or ``user@example.org``.
+ '''
+ if not MATCH_SCHEME_PATTERN.search(param_uri):
+ # Assume the URI is in the form ``user@example.org``
+ uri = 'acct://' + param_uri
+ else:
+ # Assumes the URI looks like ``acct:user@example.org
+ uri = MATCH_SCHEME_PATTERN.sub(
+ 'acct://', param_uri)
+
+ parsed = urlparse(uri)
+
+ xrd_subject = param_uri
+
+ # TODO: Verify that the user exists
+ # Q: Does webfinger support error handling in this case?
+ # Returning 404 seems intuitive, need to check.
+ if parsed.username:
+ # The user object
+ # TODO: Fetch from database instead of using the MockUser
+ user = MockUser()
+ user.username = parsed.username
+
+ xrd_links = [
+ {'attrs': {
+ 'rel': 'http://microformats.org/profile/hcard',
+ 'href': request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=user.username,
+ qualified=True)}},
+ {'attrs': {
+ 'rel': 'http://schemas.google.com/g/2010#updates-from',
+ 'href': request.urlgen(
+ 'mediagoblin.user_pages.atom_feed',
+ user=user.username,
+ qualified=True)}}]
+
+ xrd_alias = request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=user.username,
+ qualified=True)
+
+ return render_to_response(
+ request,
+ 'mediagoblin/webfinger/xrd.xml',
+ {'request': request,
+ 'subject': xrd_subject,
+ 'alias': xrd_alias,
+ 'links': xrd_links })
+ else:
+ return render_404(request)
+
+class MockUser(object):
+ '''
+ TEMPORARY user object
+ '''
+ username = None
diff --git a/mediagoblin/workbench.py b/mediagoblin/workbench.py
index 722f8e27..9578494c 100644
--- a/mediagoblin/workbench.py
+++ b/mediagoblin/workbench.py
@@ -42,10 +42,15 @@ class Workbench(object):
def __unicode__(self):
return unicode(self.dir)
+
def __str__(self):
return str(self.dir)
+
def __repr__(self):
- return repr(self.dir)
+ try:
+ return str(self)
+ except AttributeError:
+ return 'None'
def joinpath(self, *args):
return os.path.join(self.dir, *args)
@@ -140,7 +145,7 @@ class WorkbenchManager(object):
self.base_workbench_dir = os.path.abspath(base_workbench_dir)
if not os.path.exists(self.base_workbench_dir):
os.makedirs(self.base_workbench_dir)
-
+
def create_workbench(self):
"""
Create and return the path to a new workbench (directory).
diff --git a/paste.ini b/paste.ini
index 8866789c..13c15209 100644
--- a/paste.ini
+++ b/paste.ini
@@ -1,3 +1,6 @@
+# If you want to make changes to this file, first copy it to
+# paste_local.ini, then make the changes there.
+
[DEFAULT]
# Set to true to enable web-based debugging messages and etc.
debug = false
@@ -16,6 +19,28 @@ use = egg:mediagoblin#app
filter-with = beaker
config = %(here)s/mediagoblin_local.ini %(here)s/mediagoblin.ini
+[loggers]
+keys = root
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = INFO
+handlers = console
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(asctime)s %(levelname)-7.7s [%(name)s] %(message)s
+
[app:publicstore_serve]
use = egg:Paste#static
document_root = %(here)s/user_dev/media/public/
diff --git a/runtests.sh b/runtests.sh
index 1dfbf093..4265326c 100755
--- a/runtests.sh
+++ b/runtests.sh
@@ -23,7 +23,8 @@ elif which nosetests > /dev/null; then
echo "Using nosetests from \$PATH";
export NOSETESTS="nosetests";
else
- echo "No nosetests found, exiting! X_X";
+ echo "nosetests not found. X_X";
+ echo "Please install 'nose'. Exiting.";
exit 1
fi
diff --git a/setup.py b/setup.py
index d522cd9f..293f3f03 100644
--- a/setup.py
+++ b/setup.py
@@ -29,16 +29,17 @@ def get_version():
if mo:
return mo.group(1)
else:
- raise RuntimeError("Unable to find version string in %s." % VERSIONFILE)
+ raise RuntimeError("Unable to find version string in %s." %
+ VERSIONFILE)
setup(
- name = "mediagoblin",
- version = get_version(),
+ name="mediagoblin",
+ version=get_version(),
packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
zip_safe=False,
# scripts and dependencies
- install_requires = [
+ install_requires=[
'setuptools',
'PasteScript',
'beaker',
@@ -60,13 +61,13 @@ setup(
'webtest',
'ConfigObj',
'Markdown',
- 'python-cloudfiles',
## For now we're expecting that users will install this from
## their package managers.
# 'lxml',
],
+ # requires=['gst'],
test_suite='nose.collector',
- entry_points = """\
+ entry_points="""\
[console_scripts]
gmg = mediagoblin.gmg_commands:main_cli
pybabel = mediagoblin.babel.messages.frontend:main
@@ -83,7 +84,6 @@ setup(
[babel.extractors]
jinja2 = jinja2.ext:babel_extract
""",
-
license='AGPLv3',
author='Free Software Foundation and contributors',
author_email='cwebber@gnu.org',