aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.tx/config2
-rw-r--r--AUTHORS12
-rw-r--r--docs/Makefile2
-rw-r--r--docs/source/api/client_register.rst2
-rw-r--r--docs/source/index.rst1
-rw-r--r--docs/source/siteadmin/deploying.rst16
-rw-r--r--docs/source/siteadmin/relnotes.rst69
-rw-r--r--extlib/video-js/LGPLv3-LICENSE.txt165
-rw-r--r--extlib/video-js/LICENSE13
-rw-r--r--extlib/video-js/demo.captions.vtt41
-rw-r--r--extlib/video-js/demo.html30
-rw-r--r--extlib/video-js/font/vjs.eotbin0 -> 2900 bytes
-rw-r--r--extlib/video-js/font/vjs.svg40
-rw-r--r--extlib/video-js/font/vjs.ttfbin0 -> 2736 bytes
-rw-r--r--extlib/video-js/font/vjs.woffbin0 -> 2676 bytes
-rw-r--r--extlib/video-js/video-js.css757
-rw-r--r--extlib/video-js/video-js.min.css6
-rw-r--r--extlib/video-js/video-js.pngbin8235 -> 0 bytes
-rw-r--r--extlib/video-js/video-js.swfbin0 -> 14329 bytes
-rw-r--r--extlib/video-js/video.dev.js6457
-rw-r--r--extlib/video-js/video.js127
-rw-r--r--extlib/video-js/video.min.js21
-rw-r--r--mediagoblin/_version.py2
-rw-r--r--mediagoblin/auth/views.py158
-rw-r--r--mediagoblin/config_spec.ini49
-rw-r--r--mediagoblin/db/extratypes.py30
-rw-r--r--mediagoblin/db/migrations.py52
-rw-r--r--mediagoblin/db/models.py49
-rw-r--r--mediagoblin/edit/forms.py32
-rw-r--r--mediagoblin/edit/routing.py2
-rw-r--r--mediagoblin/edit/views.py98
-rw-r--r--mediagoblin/gmg_commands/__init__.py4
-rw-r--r--mediagoblin/gmg_commands/import_export.py2
-rw-r--r--mediagoblin/gmg_commands/reprocess.py302
-rw-r--r--mediagoblin/gmg_commands/util.py2
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mobin28177 -> 34307 bytes
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po693
-rw-r--r--mediagoblin/i18n/bg/LC_MESSAGES/mediagoblin.mobin0 -> 32874 bytes
-rw-r--r--mediagoblin/i18n/bg/LC_MESSAGES/mediagoblin.po1559
-rw-r--r--mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mobin25199 -> 31360 bytes
-rw-r--r--mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po691
-rw-r--r--mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mobin24330 -> 30492 bytes
-rw-r--r--mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po685
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mobin25811 -> 31941 bytes
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po703
-rw-r--r--mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po678
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mobin25211 -> 31350 bytes
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po701
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mobin25994 -> 32889 bytes
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po703
-rw-r--r--mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mobin25146 -> 31308 bytes
-rw-r--r--mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po683
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mobin26152 -> 32964 bytes
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po800
-rw-r--r--mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.mobin27529 -> 33895 bytes
-rw-r--r--mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.po719
-rw-r--r--mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mobin24326 -> 30488 bytes
-rw-r--r--mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po685
-rw-r--r--mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.mobin26342 -> 33238 bytes
-rw-r--r--mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.po735
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mobin25279 -> 31433 bytes
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po691
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mobin24944 -> 31106 bytes
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po683
-rw-r--r--mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.mobin26202 -> 32337 bytes
-rw-r--r--mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.po691
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mobin24753 -> 30901 bytes
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po685
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mobin23771 -> 29812 bytes
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po719
-rw-r--r--mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mobin25584 -> 31963 bytes
-rw-r--r--mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po705
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mobin25166 -> 31426 bytes
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po726
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mobin25911 -> 32077 bytes
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po703
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mobin32200 -> 38822 bytes
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po728
-rw-r--r--mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mobin25686 -> 31811 bytes
-rw-r--r--mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po709
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mobin24504 -> 30666 bytes
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po683
-rw-r--r--mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mobin25789 -> 31918 bytes
-rw-r--r--mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po693
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mobin24362 -> 30524 bytes
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po681
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mobin24592 -> 30754 bytes
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po683
-rw-r--r--mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mobin24563 -> 30725 bytes
-rw-r--r--mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po685
-rw-r--r--mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.mobin24771 -> 30920 bytes
-rw-r--r--mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.po695
-rw-r--r--mediagoblin/i18n/vi/LC_MESSAGES/mediagoblin.mobin0 -> 30446 bytes
-rw-r--r--mediagoblin/i18n/vi/LC_MESSAGES/mediagoblin.po1558
-rw-r--r--mediagoblin/i18n/vi_VN/LC_MESSAGES/mediagoblin.mobin0 -> 30460 bytes
-rw-r--r--mediagoblin/i18n/vi_VN/LC_MESSAGES/mediagoblin.po1558
-rw-r--r--mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.mobin23615 -> 29796 bytes
-rw-r--r--mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.po705
-rw-r--r--mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mobin24306 -> 30468 bytes
-rw-r--r--mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po681
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mobin23703 -> 29894 bytes
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po703
-rw-r--r--mediagoblin/media_types/ascii/__init__.py10
-rw-r--r--mediagoblin/media_types/ascii/config_spec.ini4
-rw-r--r--mediagoblin/media_types/ascii/processing.py281
-rw-r--r--mediagoblin/media_types/audio/__init__.py5
-rw-r--r--mediagoblin/media_types/audio/config_spec.ini8
-rw-r--r--mediagoblin/media_types/audio/processing.py451
-rw-r--r--mediagoblin/media_types/audio/transcoders.py3
-rw-r--r--mediagoblin/media_types/image/__init__.py16
-rw-r--r--mediagoblin/media_types/image/config_spec.ini7
-rw-r--r--mediagoblin/media_types/image/processing.py344
-rw-r--r--mediagoblin/media_types/pdf/__init__.py11
-rw-r--r--mediagoblin/media_types/pdf/config_spec.ini5
-rw-r--r--mediagoblin/media_types/pdf/processing.py274
-rw-r--r--mediagoblin/media_types/stl/__init__.py11
-rw-r--r--mediagoblin/media_types/stl/processing.py394
-rw-r--r--mediagoblin/media_types/video/__init__.py13
-rw-r--r--mediagoblin/media_types/video/config_spec.ini22
-rw-r--r--mediagoblin/media_types/video/migrations.py17
-rw-r--r--mediagoblin/media_types/video/models.py6
-rw-r--r--mediagoblin/media_types/video/processing.py458
-rw-r--r--mediagoblin/media_types/video/util.py8
-rw-r--r--mediagoblin/notifications/__init__.py18
-rw-r--r--mediagoblin/notifications/routing.py4
-rw-r--r--mediagoblin/notifications/views.py29
-rw-r--r--mediagoblin/oauth/views.py50
-rw-r--r--mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html9
-rw-r--r--mediagoblin/plugins/persona/__init__.py2
-rw-r--r--mediagoblin/plugins/persona/static/js/persona.js20
-rw-r--r--mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html9
-rw-r--r--mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona.html8
-rw-r--r--mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona_js_end.html (renamed from mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona_js_head.html)0
-rw-r--r--mediagoblin/plugins/persona/views.py5
-rw-r--r--mediagoblin/processing/__init__.py326
-rw-r--r--mediagoblin/processing/task.py56
-rw-r--r--mediagoblin/static/js/file_size.js45
-rw-r--r--mediagoblin/static/js/notifications.js13
-rw-r--r--mediagoblin/storage/__init__.py7
-rw-r--r--mediagoblin/storage/cloudfiles.py6
-rw-r--r--mediagoblin/storage/filestorage.py3
-rw-r--r--mediagoblin/submit/forms.py52
-rw-r--r--mediagoblin/submit/lib.py14
-rw-r--r--mediagoblin/submit/views.py78
-rw-r--r--mediagoblin/templates/mediagoblin/api/authorize.html2
-rw-r--r--mediagoblin/templates/mediagoblin/base.html11
-rw-r--r--mediagoblin/templates/mediagoblin/bits/body_end.html2
-rw-r--r--mediagoblin/templates/mediagoblin/edit/change_email.html45
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit_account.html11
-rw-r--r--mediagoblin/templates/mediagoblin/fragments/header_notifications.html4
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/pdf.html2
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/video.html37
-rw-r--r--mediagoblin/templates/mediagoblin/submit/start.html5
-rw-r--r--mediagoblin/tests/resources.py2
-rw-r--r--mediagoblin/tests/test_celery_setup.py2
-rw-r--r--mediagoblin/tests/test_edit.py8
-rw-r--r--mediagoblin/tests/test_mgoblin_app.ini6
-rw-r--r--mediagoblin/tests/test_notifications.py53
-rw-r--r--mediagoblin/tests/test_persona.py2
-rw-r--r--mediagoblin/tests/test_submission.py112
-rw-r--r--mediagoblin/tests/test_submission/COPYING.txt5
-rw-r--r--mediagoblin/tests/test_submission/big.pngbin0 -> 2212445 bytes
-rw-r--r--mediagoblin/tests/test_submission/medium.pngbin0 -> 1796336 bytes
-rw-r--r--mediagoblin/tools/pagination.py8
-rw-r--r--mediagoblin/tools/pluginapi.py2
-rw-r--r--mediagoblin/tools/staticdirect.py26
-rw-r--r--mediagoblin/user_pages/views.py14
-rw-r--r--setup.py6
168 files changed, 31241 insertions, 7169 deletions
diff --git a/.tx/config b/.tx/config
index 711b5d94..610a6f60 100644
--- a/.tx/config
+++ b/.tx/config
@@ -4,5 +4,5 @@ source_file = mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
source_lang = en
[main]
-host = https://www.transifex.net
+host = https://transifex.com
diff --git a/AUTHORS b/AUTHORS
index 304e14a2..ae615dd2 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -18,11 +18,13 @@ Thank you!
* András Veres-Szentkirályi
* Bassam Kurdali
* Bernhard Keller
+* Brandon Invergo
* Brett Smith
* Caleb Forbes Davis V
* Corey Farwell
* Chris Moylan
* Christopher Allan Webber
+* Dan Callahan
* David Thompson
* Daniel Neel
* Deb Nicholson
@@ -41,11 +43,14 @@ Thank you!
* Joar Wandborg
* Jorge Araya Navarro
* Karen Rustad
+* Kenneth Dombrowski
+* Kushal Kumaran
* Kuno Woudt
* Laura Arjona
* Larisa Hoffenbecker
* Luke Slater
* Manuel Urbano Santos
+* Marcel van der Boom
* Mark Holmquist
* Mats Sjöberg
* Matt Lee
@@ -61,20 +66,25 @@ Thank you!
* Rodney Ewing
* Runar Petursson
* Sacha De'Angeli
+* Sam Clegg
* Sam Kleinman
* Sam Tuke
* Sebastian Spaeth
* Shawn Khan
* Simon Fondrie-Teitler
* Stefano Zacchiroli
+* sturm
* Tiberiu C. Turbureanu
* Tran Thanh Bao
* Tryggvi Björgvinsson
* Shawn Khan
* Will Kahn-Greene
-If you think your name should be on this list, let us know!
+Special thanks to:
+
+* Starblessed of viewskew (lending server space!)
+If you think your name should be on this list, let us know!
We also are currently borrowing an image in
mediagoblin/static/images/media_thumbs/image.png from the wonderful
diff --git a/docs/Makefile b/docs/Makefile
index 4461893f..0b97bf7c 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -2,7 +2,7 @@
#
# You can set these variables from the command line.
-SPHINXOPTS = -W
+SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = build
diff --git a/docs/source/api/client_register.rst b/docs/source/api/client_register.rst
index 4ad7908e..08f92c47 100644
--- a/docs/source/api/client_register.rst
+++ b/docs/source/api/client_register.rst
@@ -49,7 +49,7 @@ redirect_uri
Response
--------
-You will get back a response::
+You will get back a response:
client_id
This identifies a client
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 777c4d26..e7fda4ad 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -56,7 +56,6 @@ Part 2: Core plugin documentation
plugindocs/flatpagesfile
plugindocs/sampleplugin
- plugindocs/oauth
plugindocs/trim_whitespace
plugindocs/raven
plugindocs/basic_auth
diff --git a/docs/source/siteadmin/deploying.rst b/docs/source/siteadmin/deploying.rst
index 6123dc9e..de4ce1ac 100644
--- a/docs/source/siteadmin/deploying.rst
+++ b/docs/source/siteadmin/deploying.rst
@@ -203,18 +203,20 @@ Clone the MediaGoblin repository and set up the git submodules::
cd mediagoblin
git submodule init && git submodule update
-Set up the in-package virtualenv via make::
- ./bootstrap.sh && ./configure && make
+And set up the in-package virtualenv::
+
+ (virtualenv --system-site-packages . || virtualenv .) && ./bin/python setup.py develop
.. note::
- Prefer not to use make, or want to use the "old way" of installing
- MediaGoblin (maybe you know how to use virtualenv and python
- packaging)? You still can! All that the above make script is doing
- is installing an in-package virtualenv and running
+ We presently have an experimental make-style deployment system. if
+ you'd like to try it, instead of the above command, you can run::
+
+ ./bootstrap.sh && ./configure && make
- ./bin/python setup.py develop
+ This also includes a number of nice features, such as keeping your
+ viratualenv up to date by simply running `make update`.
.. ::
diff --git a/docs/source/siteadmin/relnotes.rst b/docs/source/siteadmin/relnotes.rst
index 72fcb3d4..8f34e145 100644
--- a/docs/source/siteadmin/relnotes.rst
+++ b/docs/source/siteadmin/relnotes.rst
@@ -22,6 +22,74 @@ If you're upgrading from a previous release, please read it
carefully, or at least skim over it.
+0.5.0
+=====
+
+**NOTE:** If using the API is important to you, we're in a state of
+ransition towards a new API via the Pump API. As such, though the old
+API still probably works, some changes have happened to the way oauth
+works to make it more Pump-compatible. If you're heavily using
+clients using the old API, you may wish to hold off on upgrading for
+now. Otherwise, jump in and have fun! :)
+
+**Do this to upgrade**
+
+1. Make sure to run
+ ``./bin/python setup.py develop --upgrade && ./bin/gmg dbupdate``
+ after upgrading.
+
+.. mention something about new, experimental configure && make support
+
+2. Note that a couple of things have changed with ``mediagoblin.ini``. First
+ we have a new Authentication System. You need to add
+ ``[[mediagoblin.plugins.basic_auth]]`` under the ``[plugins]`` section of
+ your config file. Second, media types are now plugins, so you need to add
+ each media type under the ``[plugins]`` section of your config file.
+
+
+3. We have made a script to transition your ``mediagoblin_local.ini`` file for
+ you. This script can be found at
+
+.. add a link to the script
+
+If you run into problems, don't hesitate to
+`contact us <http://mediagoblin.org/pages/join.html>`_
+(IRC is often best).
+
+**New features**
+
+* As mentioned above, we now have a plugable Authentication system. You can
+ use any combination of the multiple authentication systems
+ (:ref:`basic_auth-chapter`, :ref:`persona-chapter`, :ref:`openid-chapter`)
+ or write your own!
+* Media types are now plugins! This means that new media types will
+ be able to do new, fancy things they couldn't in the future.
+* We now have notification support! This allows you to subscribe to media
+ comments and to be notified when someone comments on your media.
+* New reprocessing framework! You can now reprocess failed uploads, and
+ send already processed media back to processing to re-transcode or resize
+ media.
+* Comment preview!
+* Users now have the ability to change their email associated with their
+ account.
+* New oauth code as we move closer to federation support.
+* Experimental pyconfigure support for GNU-style configue and makefile
+ deployment.
+* Database foundations! You can now pre-populate the database models.
+* Way faster unit test run-time via in-memory database.
+* All mongokit stuff has been cleaned up.
+* Fixes for non-ascii filenames.
+* The option to stay logged in.
+* Mediagoblin has been upgraded to use the latest `celery <http://celeryproject.org/>`_
+ version.
+* You can now add jinja2 extensions to your config file to use in custom
+ templates.
+* Fixed video permission issues.
+* Mediagoblin docs are now hosted with multiple versions.
+* We removed redundent tooltips from the STL media display.
+* We are now using itsdangerous for verification tokens.
+
+
0.4.1
=====
@@ -80,6 +148,7 @@ please note the following:
**New features**
+
* PDF media type!
* Improved plugin system. More flexible, better documented, with a
new plugin authoring section of the docs.
diff --git a/extlib/video-js/LGPLv3-LICENSE.txt b/extlib/video-js/LGPLv3-LICENSE.txt
deleted file mode 100644
index 65c5ca88..00000000
--- a/extlib/video-js/LGPLv3-LICENSE.txt
+++ /dev/null
@@ -1,165 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
- This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
- 0. Additional Definitions.
-
- As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
- "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
- An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
- A "Combined Work" is a work produced by combining or linking an
-Application with the Library. The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
- The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
- The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
- 1. Exception to Section 3 of the GNU GPL.
-
- You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
- 2. Conveying Modified Versions.
-
- If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
- a) under this License, provided that you make a good faith effort to
- ensure that, in the event an Application does not supply the
- function or data, the facility still operates, and performs
- whatever part of its purpose remains meaningful, or
-
- b) under the GNU GPL, with none of the additional permissions of
- this License applicable to that copy.
-
- 3. Object Code Incorporating Material from Library Header Files.
-
- The object code form of an Application may incorporate material from
-a header file that is part of the Library. You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
- a) Give prominent notice with each copy of the object code that the
- Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the object code with a copy of the GNU GPL and this license
- document.
-
- 4. Combined Works.
-
- You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
- a) Give prominent notice with each copy of the Combined Work that
- the Library is used in it and that the Library and its use are
- covered by this License.
-
- b) Accompany the Combined Work with a copy of the GNU GPL and this license
- document.
-
- c) For a Combined Work that displays copyright notices during
- execution, include the copyright notice for the Library among
- these notices, as well as a reference directing the user to the
- copies of the GNU GPL and this license document.
-
- d) Do one of the following:
-
- 0) Convey the Minimal Corresponding Source under the terms of this
- License, and the Corresponding Application Code in a form
- suitable for, and under terms that permit, the user to
- recombine or relink the Application with a modified version of
- the Linked Version to produce a modified Combined Work, in the
- manner specified by section 6 of the GNU GPL for conveying
- Corresponding Source.
-
- 1) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (a) uses at run time
- a copy of the Library already present on the user's computer
- system, and (b) will operate properly with a modified version
- of the Library that is interface-compatible with the Linked
- Version.
-
- e) Provide Installation Information, but only if you would otherwise
- be required to provide such information under section 6 of the
- GNU GPL, and only to the extent that such information is
- necessary to install and execute a modified version of the
- Combined Work produced by recombining or relinking the
- Application with a modified version of the Linked Version. (If
- you use option 4d0, the Installation Information must accompany
- the Minimal Corresponding Source and Corresponding Application
- Code. If you use option 4d1, you must provide the Installation
- Information in the manner specified by section 6 of the GNU GPL
- for conveying Corresponding Source.)
-
- 5. Combined Libraries.
-
- You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
- a) Accompany the combined library with a copy of the same work based
- on the Library, uncombined with any other library facilities,
- conveyed under the terms of this License.
-
- b) Give prominent notice with the combined library that part of it
- is a work based on the Library, and explaining where to find the
- accompanying uncombined form of the same work.
-
- 6. Revised Versions of the GNU Lesser General Public License.
-
- The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
- If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
diff --git a/extlib/video-js/LICENSE b/extlib/video-js/LICENSE
new file mode 100644
index 00000000..138a50e8
--- /dev/null
+++ b/extlib/video-js/LICENSE
@@ -0,0 +1,13 @@
+Copyright 2013 Brightcove, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License. \ No newline at end of file
diff --git a/extlib/video-js/demo.captions.vtt b/extlib/video-js/demo.captions.vtt
new file mode 100644
index 00000000..e598be19
--- /dev/null
+++ b/extlib/video-js/demo.captions.vtt
@@ -0,0 +1,41 @@
+WEBVTT
+
+00:00.700 --> 00:04.110
+Captions describe all relevant audio for the hearing impaired.
+[ Heroic music playing for a seagull ]
+
+00:04.500 --> 00:05.000
+[ Splash!!! ]
+
+00:05.100 --> 00:06.000
+[ Sploosh!!! ]
+
+00:08.000 --> 00:09.225
+[ Splash...splash...splash splash splash ]
+
+00:10.525 --> 00:11.255
+[ Splash, Sploosh again ]
+
+00:13.500 --> 00:14.984
+Dolphin: eeeEEEEEeeee!
+
+00:14.984 --> 00:16.984
+Dolphin: Squawk! eeeEEE?
+
+00:25.000 --> 00:28.284
+[ A whole ton of splashes ]
+
+00:29.500 --> 00:31.000
+Mine. Mine. Mine.
+
+00:34.300 --> 00:36.000
+Shark: Chomp
+
+00:36.800 --> 00:37.900
+Shark: CHOMP!!!
+
+00:37.861 --> 00:41.193
+EEEEEEOOOOOOOOOOWHALENOISE
+
+00:42.593 --> 00:45.611
+[ BIG SPLASH ] \ No newline at end of file
diff --git a/extlib/video-js/demo.html b/extlib/video-js/demo.html
new file mode 100644
index 00000000..fb26a087
--- /dev/null
+++ b/extlib/video-js/demo.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Video.js | HTML5 Video Player</title>
+
+ <!-- Chang URLs to wherever Video.js files will be hosted -->
+ <link href="video-js.css" rel="stylesheet" type="text/css">
+ <!-- video.js must be in the <head> for older IEs to work. -->
+ <script src="video.js"></script>
+
+ <!-- Unless using the CDN hosted version, update the URL to the Flash SWF -->
+ <script>
+ videojs.options.flash.swf = "video-js.swf";
+ </script>
+
+
+</head>
+<body>
+
+ <video id="example_video_1" class="video-js vjs-default-skin" controls preload="none" width="640" height="264"
+ poster="http://video-js.zencoder.com/oceans-clip.png"
+ data-setup="{}">
+ <source src="http://video-js.zencoder.com/oceans-clip.mp4" type='video/mp4' />
+ <source src="http://video-js.zencoder.com/oceans-clip.webm" type='video/webm' />
+ <source src="http://video-js.zencoder.com/oceans-clip.ogv" type='video/ogg' />
+ <track kind="captions" src="demo.captions.vtt" srclang="en" label="English"></track><!-- Tracks need an ending tag thanks to IE9 -->
+ </video>
+
+</body>
+</html>
diff --git a/extlib/video-js/font/vjs.eot b/extlib/video-js/font/vjs.eot
new file mode 100644
index 00000000..1b8202af
--- /dev/null
+++ b/extlib/video-js/font/vjs.eot
Binary files differ
diff --git a/extlib/video-js/font/vjs.svg b/extlib/video-js/font/vjs.svg
new file mode 100644
index 00000000..2059a1f2
--- /dev/null
+++ b/extlib/video-js/font/vjs.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG font generated by IcoMoon.
+<iconset grid="16"></iconset>
+</metadata>
+<defs>
+<font id="VideoJS" horiz-adv-x="512" >
+<font-face units-per-em="512" ascent="480" descent="-32" />
+<missing-glyph horiz-adv-x="512" />
+<glyph unicode="&#xe000;" d="M 512.00,480.00 L 512.00,272.00 L 432.00,352.00 L 336.00,256.00 L 288.00,304.00 L 384.00,400.00 L 304.00,480.00 ZM 224.00,144.00 L 128.00,48.00 L 208.00-32.00 L 0.00-32.00 L 0.00,176.00 L 80.00,96.00 L 176.00,192.00 Z" />
+<glyph unicode="&#xe001;" d="M 96.00,416.00L 416.00,224.00L 96.00,32.00 z" />
+<glyph unicode="&#xe002;" d="M 64.00,416.00L 224.00,416.00L 224.00,32.00L 64.00,32.00zM 288.00,416.00L 448.00,416.00L 448.00,32.00L 288.00,32.00z" />
+<glyph unicode="&#xe003;" d="M 200.666,440.666 C 213.50,453.50 224.00,449.15 224.00,431.00 L 224.00,17.00 C 224.00-1.15 213.50-5.499 200.666,7.335 L 80.00,128.00 L 0.00,128.00 L 0.00,320.00 L 80.00,320.00 L 200.666,440.666 Z" />
+<glyph unicode="&#xe004;" d="M 274.51,109.49c-6.143,0.00-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0.00,33.941
+ c 40.55,40.55, 40.55,106.529,0.00,147.078c-9.373,9.373-9.373,24.569,0.00,33.941c 9.373,9.372, 24.568,9.372, 33.941,0.00
+ c 59.265-59.265, 59.265-155.696,0.00-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.50,453.50 224.00,449.15 224.00,431.00 L 224.00,17.00 C 224.00-1.15 213.50-5.499 200.666,7.335 L 80.00,128.00 L 0.00,128.00 L 0.00,320.00 L 80.00,320.00 L 200.666,440.666 Z" />
+<glyph unicode="&#xe005;" d="M 359.765,64.235c-6.143,0.00-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0.00,33.941
+ c 65.503,65.503, 65.503,172.085,0.00,237.588c-9.372,9.373-9.372,24.569,0.00,33.941c 9.372,9.371, 24.569,9.372, 33.941,0.00
+ C 417.532,335.938, 440.00,281.696, 440.00,224.00c0.00-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0.00-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0.00,33.941
+ c 40.55,40.55, 40.55,106.529,0.00,147.078c-9.373,9.373-9.373,24.569,0.00,33.941c 9.373,9.372, 24.568,9.372, 33.941,0.00
+ c 59.265-59.265, 59.265-155.696,0.00-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.50,453.50 224.00,449.15 224.00,431.00 L 224.00,17.00 C 224.00-1.15 213.50-5.499 200.666,7.335 L 80.00,128.00 L 0.00,128.00 L 0.00,320.00 L 80.00,320.00 L 200.666,440.666 Z" />
+<glyph unicode="&#xe006;" d="M 445.02,18.98c-6.143,0.00-12.284,2.343-16.971,7.029c-9.372,9.373-9.372,24.568,0.00,33.941
+ C 471.868,103.771, 496.001,162.03, 496.001,224.00c0.00,61.969-24.133,120.229-67.952,164.049c-9.372,9.373-9.372,24.569,0.00,33.941
+ c 9.372,9.372, 24.569,9.372, 33.941,0.00c 52.885-52.886, 82.011-123.20, 82.011-197.99c0.00-74.791-29.126-145.104-82.011-197.99
+ C 457.304,21.323, 451.162,18.98, 445.02,18.98zM 359.765,64.235c-6.143,0.00-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0.00,33.941
+ c 65.503,65.503, 65.503,172.085,0.00,237.588c-9.372,9.373-9.372,24.569,0.00,33.941c 9.372,9.371, 24.569,9.372, 33.941,0.00
+ C 417.532,335.938, 440.00,281.696, 440.00,224.00c0.00-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0.00-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0.00,33.941
+ c 40.55,40.55, 40.55,106.529,0.00,147.078c-9.373,9.373-9.373,24.569,0.00,33.941c 9.373,9.372, 24.568,9.372, 33.941,0.00
+ c 59.265-59.265, 59.265-155.696,0.00-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.50,453.50 224.00,449.15 224.00,431.00 L 224.00,17.00 C 224.00-1.15 213.50-5.499 200.666,7.335 L 80.00,128.00 L 0.00,128.00 L 0.00,320.00 L 80.00,320.00 L 200.666,440.666 Z" horiz-adv-x="544" />
+<glyph unicode="&#xe007;" d="M 256.00,480.00L 96.00,224.00L 256.00-32.00L 416.00,224.00 z" />
+<glyph unicode="&#xe008;" d="M 0.00,480.00 L 687.158,480.00 L 687.158-35.207 L 0.00-35.207 L 0.00,480.00 z M 622.731,224.638 C 621.878,314.664 618.46,353.922 597.131,381.656 C 593.291,387.629 586.038,391.042 580.065,395.304 C 559.158,410.669 460.593,416.211 346.247,416.211 C 231.896,416.211 128.642,410.669 108.162,395.304 C 101.762,391.042 94.504,387.629 90.242,381.656 C 69.331,353.922 66.349,314.664 65.069,224.638 C 66.349,134.607 69.331,95.353 90.242,67.62 C 94.504,61.22 101.762,58.233 108.162,53.967 C 128.642,38.18 231.896,33.06 346.247,32.207 C 460.593,33.06 559.158,38.18 580.065,53.967 C 586.038,58.233 593.291,61.22 597.131,67.62 C 618.46,95.353 621.878,134.607 622.731,224.638 z M 331.179,247.952 C 325.389,318.401 287.924,359.905 220.901,359.905 C 159.672,359.905 111.54,304.689 111.54,215.965 C 111.54,126.859 155.405,71.267 227.907,71.267 C 285.79,71.267 326.306,113.916 332.701,184.742 L 263.55,184.742 C 260.81,158.468 249.843,138.285 226.69,138.285 C 190.136,138.285 183.435,174.462 183.435,212.92 C 183.435,265.854 198.665,292.886 223.951,292.886 C 246.492,292.886 260.81,276.511 262.939,247.952 L 331.179,247.952 z M 570.013,247.952 C 564.228,318.401 526.758,359.905 459.74,359.905 C 398.507,359.905 350.379,304.689 350.379,215.965 C 350.379,126.859 394.244,71.267 466.746,71.267 C 524.625,71.267 565.14,113.916 571.536,184.742 L 502.384,184.742 C 499.649,158.468 488.682,138.285 465.529,138.285 C 428.971,138.285 422.27,174.462 422.27,212.92 C 422.27,265.854 437.504,292.886 462.785,292.886 C 485.327,292.886 499.649,276.511 501.778,247.952 L 570.013,247.952 z " horiz-adv-x="687.1578947368421" />
+<glyph unicode="&#xe009;" d="M 64.00,416.00L 448.00,416.00L 448.00,32.00L 64.00,32.00z" />
+<glyph unicode="&#xe00a;" d="M 192.00,416.00A64.00,64.00 12780.00 1 1 320.00,416A64.00,64.00 12780.00 1 1 192.00,416zM 327.765,359.765A64.00,64.00 12780.00 1 1 455.765,359.765A64.00,64.00 12780.00 1 1 327.765,359.765zM 416.00,224.00A32.00,32.00 12780.00 1 1 480.00,224A32.00,32.00 12780.00 1 1 416.00,224zM 359.765,88.235A32.00,32.00 12780.00 1 1 423.765,88.23500000000001A32.00,32.00 12780.00 1 1 359.765,88.23500000000001zM 224.001,32.00A32.00,32.00 12780.00 1 1 288.001,32A32.00,32.00 12780.00 1 1 224.001,32zM 88.236,88.235A32.00,32.00 12780.00 1 1 152.236,88.23500000000001A32.00,32.00 12780.00 1 1 88.236,88.23500000000001zM 72.236,359.765A48.00,48.00 12780.00 1 1 168.236,359.765A48.00,48.00 12780.00 1 1 72.236,359.765zM 28.00,224.00A36.00,36.00 12780.00 1 1 100.00,224A36.00,36.00 12780.00 1 1 28.00,224z" />
+<glyph unicode="&#xe00b;" d="M 224.00,192.00 L 224.00-16.00 L 144.00,64.00 L 48.00-32.00 L 0.00,16.00 L 96.00,112.00 L 16.00,192.00 ZM 512.00,432.00 L 416.00,336.00 L 496.00,256.00 L 288.00,256.00 L 288.00,464.00 L 368.00,384.00 L 464.00,480.00 Z" />
+<glyph unicode="&#xe00c;" d="M 256.00,448.00 C 397.385,448.00 512.00,354.875 512.00,240.00 C 512.00,125.124 397.385,32.00 256.00,32.00 C 242.422,32.00 229.095,32.867 216.088,34.522 C 161.099-20.467 95.463-30.328 32.00-31.776 L 32.00-18.318 C 66.268-1.529 96.00,29.052 96.00,64.00 C 96.00,68.877 95.621,73.665 94.918,78.348 C 37.02,116.48 0.00,174.725 0.00,240.00 C 0.00,354.875 114.615,448.00 256.00,448.00 Z" />
+<glyph unicode="&#x20;" horiz-adv-x="256" />
+<glyph class="hidden" unicode="&#xf000;" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" />
+</font></defs></svg> \ No newline at end of file
diff --git a/extlib/video-js/font/vjs.ttf b/extlib/video-js/font/vjs.ttf
new file mode 100644
index 00000000..a5ad4685
--- /dev/null
+++ b/extlib/video-js/font/vjs.ttf
Binary files differ
diff --git a/extlib/video-js/font/vjs.woff b/extlib/video-js/font/vjs.woff
new file mode 100644
index 00000000..375510e0
--- /dev/null
+++ b/extlib/video-js/font/vjs.woff
Binary files differ
diff --git a/extlib/video-js/video-js.css b/extlib/video-js/video-js.css
new file mode 100644
index 00000000..11435c32
--- /dev/null
+++ b/extlib/video-js/video-js.css
@@ -0,0 +1,757 @@
+/*!
+Video.js Default Styles (http://videojs.com)
+Version 4.2.1
+Create your own skin at http://designer.videojs.com
+*/
+/* SKIN
+================================================================================
+The main class name for all skin-specific styles. To make your own skin,
+replace all occurances of 'vjs-default-skin' with a new name. Then add your new
+skin name to your video tag instead of the default skin.
+e.g. <video class="video-js my-skin-name">
+*/
+.vjs-default-skin {
+ color: #cccccc;
+}
+/* Custom Icon Font
+--------------------------------------------------------------------------------
+The control icons are from a custom font. Each icon corresponds to a character
+(e.g. "\e001"). Font icons allow for easy scaling and coloring of icons.
+*/
+@font-face {
+ font-family: 'VideoJS';
+ src: url('font/vjs.eot');
+ src: url('font/vjs.eot?#iefix') format('embedded-opentype'), url('font/vjs.woff') format('woff'), url('font/vjs.ttf') format('truetype');
+ font-weight: normal;
+ font-style: normal;
+}
+/* Base UI Component Classes
+--------------------------------------------------------------------------------
+*/
+/* Slider - used for Volume bar and Seek bar */
+.vjs-default-skin .vjs-slider {
+ /* Replace browser focus hightlight with handle highlight */
+ outline: 0;
+ position: relative;
+ cursor: pointer;
+ padding: 0;
+ /* background-color-with-alpha */
+ background-color: #333333;
+ background-color: rgba(51, 51, 51, 0.9);
+}
+.vjs-default-skin .vjs-slider:focus {
+ /* box-shadow */
+ -webkit-box-shadow: 0 0 2em #ffffff;
+ -moz-box-shadow: 0 0 2em #ffffff;
+ box-shadow: 0 0 2em #ffffff;
+}
+.vjs-default-skin .vjs-slider-handle {
+ position: absolute;
+ /* Needed for IE6 */
+ left: 0;
+ top: 0;
+}
+.vjs-default-skin .vjs-slider-handle:before {
+ content: "\e009";
+ font-family: VideoJS;
+ font-size: 1em;
+ line-height: 1;
+ text-align: center;
+ text-shadow: 0em 0em 1em #fff;
+ position: absolute;
+ top: 0;
+ left: 0;
+ /* Rotate the square icon to make a diamond */
+ /* transform */
+ -webkit-transform: rotate(-45deg);
+ -moz-transform: rotate(-45deg);
+ -ms-transform: rotate(-45deg);
+ -o-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+}
+/* Control Bar
+--------------------------------------------------------------------------------
+The default control bar that is a container for most of the controls.
+*/
+.vjs-default-skin .vjs-control-bar {
+ /* Start hidden */
+ display: none;
+ position: absolute;
+ /* Place control bar at the bottom of the player box/video.
+ If you want more margin below the control bar, add more height. */
+ bottom: 0;
+ /* Use left/right to stretch to 100% width of player div */
+ left: 0;
+ right: 0;
+ /* Height includes any margin you want above or below control items */
+ height: 3.0em;
+ /* background-color-with-alpha */
+ background-color: #07141e;
+ background-color: rgba(7, 20, 30, 0.7);
+}
+/* Show the control bar only once the video has started playing */
+.vjs-default-skin.vjs-has-started .vjs-control-bar {
+ display: block;
+ /* Visibility needed to make sure things hide in older browsers too. */
+
+ visibility: visible;
+ opacity: 1;
+ /* transition */
+ -webkit-transition: visibility 0.1s, opacity 0.1s;
+ -moz-transition: visibility 0.1s, opacity 0.1s;
+ -o-transition: visibility 0.1s, opacity 0.1s;
+ transition: visibility 0.1s, opacity 0.1s;
+}
+/* Hide the control bar when the video is playing and the user is inactive */
+.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
+ display: block;
+ visibility: hidden;
+ opacity: 0;
+ /* transition */
+ -webkit-transition: visibility 1s, opacity 1s;
+ -moz-transition: visibility 1s, opacity 1s;
+ -o-transition: visibility 1s, opacity 1s;
+ transition: visibility 1s, opacity 1s;
+}
+.vjs-default-skin.vjs-controls-disabled .vjs-control-bar {
+ display: none;
+}
+.vjs-default-skin.vjs-using-native-controls .vjs-control-bar {
+ display: none;
+}
+/* IE8 is flakey with fonts, and you have to change the actual content to force
+fonts to show/hide properly.
+ - "\9" IE8 hack didn't work for this
+ - Found in XP IE8 from http://modern.ie. Does not show up in "IE8 mode" in IE9
+*/
+@media \0screen {
+ .vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before {
+ content: "";
+ }
+}
+/* General styles for individual controls. */
+.vjs-default-skin .vjs-control {
+ outline: none;
+ position: relative;
+ float: left;
+ text-align: center;
+ margin: 0;
+ padding: 0;
+ height: 3.0em;
+ width: 4em;
+}
+/* FontAwsome button icons */
+.vjs-default-skin .vjs-control:before {
+ font-family: VideoJS;
+ font-size: 1.5em;
+ line-height: 2;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ text-align: center;
+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
+}
+/* Replacement for focus outline */
+.vjs-default-skin .vjs-control:focus:before,
+.vjs-default-skin .vjs-control:hover:before {
+ text-shadow: 0em 0em 1em #ffffff;
+}
+.vjs-default-skin .vjs-control:focus {
+ /* outline: 0; */
+ /* keyboard-only users cannot see the focus on several of the UI elements when
+ this is set to 0 */
+
+}
+/* Hide control text visually, but have it available for screenreaders */
+.vjs-default-skin .vjs-control-text {
+ /* hide-visually */
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+/* Play/Pause
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-play-control {
+ width: 5em;
+ cursor: pointer;
+}
+.vjs-default-skin .vjs-play-control:before {
+ content: "\e001";
+}
+.vjs-default-skin.vjs-playing .vjs-play-control:before {
+ content: "\e002";
+}
+/* Volume/Mute
+-------------------------------------------------------------------------------- */
+.vjs-default-skin .vjs-mute-control,
+.vjs-default-skin .vjs-volume-menu-button {
+ cursor: pointer;
+ float: right;
+}
+.vjs-default-skin .vjs-mute-control:before,
+.vjs-default-skin .vjs-volume-menu-button:before {
+ content: "\e006";
+}
+.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,
+.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before {
+ content: "\e003";
+}
+.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,
+.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before {
+ content: "\e004";
+}
+.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,
+.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before {
+ content: "\e005";
+}
+.vjs-default-skin .vjs-volume-control {
+ width: 5em;
+ float: right;
+}
+.vjs-default-skin .vjs-volume-bar {
+ width: 5em;
+ height: 0.6em;
+ margin: 1.1em auto 0;
+}
+.vjs-default-skin .vjs-volume-menu-button .vjs-menu-content {
+ height: 2.9em;
+}
+.vjs-default-skin .vjs-volume-level {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 0.5em;
+ background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;
+}
+.vjs-default-skin .vjs-volume-bar .vjs-volume-handle {
+ width: 0.5em;
+ height: 0.5em;
+}
+.vjs-default-skin .vjs-volume-handle:before {
+ font-size: 0.9em;
+ top: -0.2em;
+ left: -0.2em;
+ width: 1em;
+ height: 1em;
+}
+.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content {
+ width: 6em;
+ left: -4em;
+}
+/* Progress
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-progress-control {
+ position: absolute;
+ left: 0;
+ right: 0;
+ width: auto;
+ font-size: 0.3em;
+ height: 1em;
+ /* Set above the rest of the controls. */
+ top: -1em;
+ /* Shrink the bar slower than it grows. */
+ /* transition */
+ -webkit-transition: all 0.4s;
+ -moz-transition: all 0.4s;
+ -o-transition: all 0.4s;
+ transition: all 0.4s;
+}
+/* On hover, make the progress bar grow to something that's more clickable.
+ This simply changes the overall font for the progress bar, and this
+ updates both the em-based widths and heights, as wells as the icon font */
+.vjs-default-skin:hover .vjs-progress-control {
+ font-size: .9em;
+ /* Even though we're not changing the top/height, we need to include them in
+ the transition so they're handled correctly. */
+
+ /* transition */
+ -webkit-transition: all 0.2s;
+ -moz-transition: all 0.2s;
+ -o-transition: all 0.2s;
+ transition: all 0.2s;
+}
+/* Box containing play and load progresses. Also acts as seek scrubber. */
+.vjs-default-skin .vjs-progress-holder {
+ height: 100%;
+}
+/* Progress Bars */
+.vjs-default-skin .vjs-progress-holder .vjs-play-progress,
+.vjs-default-skin .vjs-progress-holder .vjs-load-progress {
+ position: absolute;
+ display: block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ /* Needed for IE6 */
+ left: 0;
+ top: 0;
+}
+.vjs-default-skin .vjs-play-progress {
+ /*
+ Using a data URI to create the white diagonal lines with a transparent
+ background. Surprisingly works in IE8.
+ Created using http://www.patternify.com
+ Changing the first color value will change the bar color.
+ Also using a paralax effect to make the lines move backwards.
+ The -50% left position makes that happen.
+ */
+
+ background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;
+}
+.vjs-default-skin .vjs-load-progress {
+ background: #646464 /* IE8- Fallback */;
+ background: rgba(255, 255, 255, 0.4);
+}
+.vjs-default-skin .vjs-seek-handle {
+ width: 1.5em;
+ height: 100%;
+}
+.vjs-default-skin .vjs-seek-handle:before {
+ padding-top: 0.1em /* Minor adjustment */;
+}
+/* Time Display
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-time-controls {
+ font-size: 1em;
+ /* Align vertically by making the line height the same as the control bar */
+ line-height: 3em;
+}
+.vjs-default-skin .vjs-current-time {
+ float: left;
+}
+.vjs-default-skin .vjs-duration {
+ float: left;
+}
+/* Remaining time is in the HTML, but not included in default design */
+.vjs-default-skin .vjs-remaining-time {
+ display: none;
+ float: left;
+}
+.vjs-time-divider {
+ float: left;
+ line-height: 3em;
+}
+/* Fullscreen
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-fullscreen-control {
+ width: 3.8em;
+ cursor: pointer;
+ float: right;
+}
+.vjs-default-skin .vjs-fullscreen-control:before {
+ content: "\e000";
+}
+/* Switch to the exit icon when the player is in fullscreen */
+.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before {
+ content: "\e00b";
+}
+/* Big Play Button (play button at start)
+--------------------------------------------------------------------------------
+Positioning of the play button in the center or other corners can be done more
+easily in the skin designer. http://designer.videojs.com/
+*/
+.vjs-default-skin .vjs-big-play-button {
+ left: 0.5em;
+ top: 0.5em;
+ font-size: 3em;
+ display: block;
+ z-index: 2;
+ position: absolute;
+ width: 4em;
+ height: 2.6em;
+ text-align: center;
+ vertical-align: middle;
+ cursor: pointer;
+ opacity: 1;
+ /* Need a slightly gray bg so it can be seen on black backgrounds */
+ /* background-color-with-alpha */
+ background-color: #07141e;
+ background-color: rgba(7, 20, 30, 0.7);
+ border: 0.1em solid #3b4249;
+ /* border-radius */
+ -webkit-border-radius: 0.8em;
+ -moz-border-radius: 0.8em;
+ border-radius: 0.8em;
+ /* box-shadow */
+ -webkit-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
+ -moz-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
+ box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
+ /* transition */
+ -webkit-transition: all 0.4s;
+ -moz-transition: all 0.4s;
+ -o-transition: all 0.4s;
+ transition: all 0.4s;
+}
+/* Hide if controls are disabled */
+.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button {
+ display: none;
+}
+/* Hide when video starts playing */
+.vjs-default-skin.vjs-has-started .vjs-big-play-button {
+ display: none;
+}
+/* Hide on mobile devices. Remove when we stop using native controls
+ by default on mobile */
+.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button {
+ display: none;
+}
+.vjs-default-skin:hover .vjs-big-play-button,
+.vjs-default-skin .vjs-big-play-button:focus {
+ outline: 0;
+ border-color: #fff;
+ /* IE8 needs a non-glow hover state */
+ background-color: #505050;
+ background-color: rgba(50, 50, 50, 0.75);
+ /* box-shadow */
+ -webkit-box-shadow: 0 0 3em #ffffff;
+ -moz-box-shadow: 0 0 3em #ffffff;
+ box-shadow: 0 0 3em #ffffff;
+ /* transition */
+ -webkit-transition: all 0s;
+ -moz-transition: all 0s;
+ -o-transition: all 0s;
+ transition: all 0s;
+}
+.vjs-default-skin .vjs-big-play-button:before {
+ content: "\e001";
+ font-family: VideoJS;
+ /* In order to center the play icon vertically we need to set the line height
+ to the same as the button height */
+
+ line-height: 2.6em;
+ text-shadow: 0.05em 0.05em 0.1em #000;
+ text-align: center /* Needed for IE8 */;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+/* Loading Spinner
+--------------------------------------------------------------------------------
+*/
+.vjs-loading-spinner {
+ display: none;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ font-size: 5em;
+ line-height: 1;
+ width: 1em;
+ height: 1em;
+ margin-left: -0.5em;
+ margin-top: -0.5em;
+ opacity: 0.75;
+ /* animation */
+ -webkit-animation: spin 1.5s infinite linear;
+ -moz-animation: spin 1.5s infinite linear;
+ -o-animation: spin 1.5s infinite linear;
+ animation: spin 1.5s infinite linear;
+}
+.vjs-default-skin .vjs-loading-spinner:before {
+ content: "\e00a";
+ font-family: VideoJS;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 1em;
+ height: 1em;
+ text-align: center;
+ text-shadow: 0em 0em 0.1em #000;
+}
+@-moz-keyframes spin {
+ 0% {
+ -moz-transform: rotate(0deg);
+ }
+ 100% {
+ -moz-transform: rotate(359deg);
+ }
+}
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ }
+}
+@-o-keyframes spin {
+ 0% {
+ -o-transform: rotate(0deg);
+ }
+ 100% {
+ -o-transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(359deg);
+ }
+}
+/* Menu Buttons (Captions/Subtitles/etc.)
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-menu-button {
+ float: right;
+ cursor: pointer;
+}
+.vjs-default-skin .vjs-menu {
+ display: none;
+ position: absolute;
+ bottom: 0;
+ left: 0em;
+ /* (Width of vjs-menu - width of button) / 2 */
+
+ width: 0em;
+ height: 0em;
+ margin-bottom: 3em;
+ border-left: 2em solid transparent;
+ border-right: 2em solid transparent;
+ border-top: 1.55em solid #000000;
+ /* Same width top as ul bottom */
+
+ border-top-color: rgba(7, 40, 50, 0.5);
+ /* Same as ul background */
+
+}
+/* Button Pop-up Menu */
+.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content {
+ display: block;
+ padding: 0;
+ margin: 0;
+ position: absolute;
+ width: 10em;
+ bottom: 1.5em;
+ /* Same bottom as vjs-menu border-top */
+
+ max-height: 15em;
+ overflow: auto;
+ left: -5em;
+ /* Width of menu - width of button / 2 */
+
+ /* background-color-with-alpha */
+ background-color: #07141e;
+ background-color: rgba(7, 20, 30, 0.7);
+ /* box-shadow */
+ -webkit-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
+ -moz-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
+ box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
+}
+.vjs-default-skin .vjs-menu-button:hover .vjs-menu {
+ display: block;
+}
+.vjs-default-skin .vjs-menu-button ul li {
+ list-style: none;
+ margin: 0;
+ padding: 0.3em 0 0.3em 0;
+ line-height: 1.4em;
+ font-size: 1.2em;
+ text-align: center;
+ text-transform: lowercase;
+}
+.vjs-default-skin .vjs-menu-button ul li.vjs-selected {
+ background-color: #000;
+}
+.vjs-default-skin .vjs-menu-button ul li:focus,
+.vjs-default-skin .vjs-menu-button ul li:hover,
+.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,
+.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover {
+ outline: 0;
+ color: #111;
+ /* background-color-with-alpha */
+ background-color: #ffffff;
+ background-color: rgba(255, 255, 255, 0.75);
+ /* box-shadow */
+ -webkit-box-shadow: 0 0 1em #ffffff;
+ -moz-box-shadow: 0 0 1em #ffffff;
+ box-shadow: 0 0 1em #ffffff;
+}
+.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title {
+ text-align: center;
+ text-transform: uppercase;
+ font-size: 1em;
+ line-height: 2em;
+ padding: 0;
+ margin: 0 0 0.3em 0;
+ font-weight: bold;
+ cursor: default;
+}
+/* Subtitles Button */
+.vjs-default-skin .vjs-subtitles-button:before {
+ content: "\e00c";
+}
+/* Captions Button */
+.vjs-default-skin .vjs-captions-button:before {
+ content: "\e008";
+}
+/* Replacement for focus outline */
+.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,
+.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before {
+ /* box-shadow */
+ -webkit-box-shadow: 0 0 1em #ffffff;
+ -moz-box-shadow: 0 0 1em #ffffff;
+ box-shadow: 0 0 1em #ffffff;
+}
+/*
+REQUIRED STYLES (be careful overriding)
+================================================================================
+When loading the player, the video tag is replaced with a DIV,
+that will hold the video tag or object tag for other playback methods.
+The div contains the video playback element (Flash or HTML5) and controls,
+and sets the width and height of the video.
+
+** If you want to add some kind of border/padding (e.g. a frame), or special
+positioning, use another containing element. Otherwise you risk messing up
+control positioning and full window mode. **
+*/
+.video-js {
+ background-color: #000;
+ position: relative;
+ padding: 0;
+ /* Start with 10px for base font size so other dimensions can be em based and
+ easily calculable. */
+
+ font-size: 10px;
+ /* Allow poster to be vertially aligned. */
+
+ vertical-align: middle;
+ /* display: table-cell; */
+ /*This works in Safari but not Firefox.*/
+
+ /* Provide some basic defaults for fonts */
+
+ font-weight: normal;
+ font-style: normal;
+ /* Avoiding helvetica: issue #376 */
+
+ font-family: Arial, sans-serif;
+ /* Turn off user selection (text highlighting) by default.
+ The majority of player components will not be text blocks.
+ Text areas will need to turn user selection back on. */
+
+ /* user-select */
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+/* Playback technology elements expand to the width/height of the containing div
+ <video> or <object> */
+.video-js .vjs-tech {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+/* Fix for Firefox 9 fullscreen (only if it is enabled). Not needed when
+ checking fullScreenEnabled. */
+.video-js:-moz-full-screen {
+ position: absolute;
+}
+/* Fullscreen Styles */
+body.vjs-full-window {
+ padding: 0;
+ margin: 0;
+ height: 100%;
+ /* Fix for IE6 full-window. http://www.cssplay.co.uk/layouts/fixed.html */
+ overflow-y: auto;
+}
+.video-js.vjs-fullscreen {
+ position: fixed;
+ overflow: hidden;
+ z-index: 1000;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ width: 100% !important;
+ height: 100% !important;
+ /* IE6 full-window (underscore hack) */
+ _position: absolute;
+}
+.video-js:-webkit-full-screen {
+ width: 100% !important;
+ height: 100% !important;
+}
+.video-js.vjs-fullscreen.vjs-user-inactive {
+ cursor: none;
+}
+/* Poster Styles */
+.vjs-poster {
+ background-repeat: no-repeat;
+ background-position: 50% 50%;
+ background-size: contain;
+ cursor: pointer;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.vjs-poster img {
+ display: block;
+ margin: 0 auto;
+ max-height: 100%;
+ padding: 0;
+ width: 100%;
+}
+/* Hide the poster when native controls are used otherwise it covers them */
+.video-js.vjs-using-native-controls .vjs-poster {
+ display: none;
+}
+/* Text Track Styles */
+/* Overall track holder for both captions and subtitles */
+.video-js .vjs-text-track-display {
+ text-align: center;
+ position: absolute;
+ bottom: 4em;
+ /* Leave padding on left and right */
+ left: 1em;
+ right: 1em;
+}
+/* Individual tracks */
+.video-js .vjs-text-track {
+ display: none;
+ font-size: 1.4em;
+ text-align: center;
+ margin-bottom: 0.1em;
+ /* Transparent black background, or fallback to all black (oldIE) */
+ /* background-color-with-alpha */
+ background-color: #000000;
+ background-color: rgba(0, 0, 0, 0.5);
+}
+.video-js .vjs-subtitles {
+ color: #ffffff /* Subtitles are white */;
+}
+.video-js .vjs-captions {
+ color: #ffcc66 /* Captions are yellow */;
+}
+.vjs-tt-cue {
+ display: block;
+}
+/* Hide disabled or unsupported controls */
+.vjs-default-skin .vjs-hidden {
+ display: none;
+}
+.vjs-lock-showing {
+ display: block !important;
+ opacity: 1;
+ visibility: visible;
+}
+/* -----------------------------------------------------------------------------
+The original source of this file lives at
+https://github.com/videojs/video.js/blob/master/src/css/video-js.less */
diff --git a/extlib/video-js/video-js.min.css b/extlib/video-js/video-js.min.css
index 06c0e6b4..07bde6ee 100644
--- a/extlib/video-js/video-js.min.css
+++ b/extlib/video-js/video-js.min.css
@@ -1 +1,5 @@
-.video-js{background-color:#000;position:relative;padding:0;font-size:10px;vertical-align:middle}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.video-js:-moz-full-screen{position:absolute}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0;width:100%!important;height:100%!important;_position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.vjs-poster{margin:0 auto;padding:0;cursor:pointer;position:relative;width:100%;max-height:100%}.video-js .vjs-text-track-display{text-align:center;position:absolute;bottom:4em;left:1em;right:1em;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.video-js .vjs-text-track{display:none;color:#fff;font-size:1.4em;text-align:center;margin-bottom:.1em;background:#000;background:rgba(0,0,0,0.50)}.video-js .vjs-subtitles{color:#fff}.video-js .vjs-captions{color:#fc6}.vjs-tt-cue{display:block}.vjs-fade-in{visibility:visible!important;opacity:1!important;-webkit-transition:visibility 0s linear 0s,opacity .3s linear;-moz-transition:visibility 0s linear 0s,opacity .3s linear;-ms-transition:visibility 0s linear 0s,opacity .3s linear;-o-transition:visibility 0s linear 0s,opacity .3s linear;transition:visibility 0s linear 0s,opacity .3s linear}.vjs-fade-out{visibility:hidden!important;opacity:0!important;-webkit-transition:visibility 0s linear 1.5s,opacity 1.5s linear;-moz-transition:visibility 0s linear 1.5s,opacity 1.5s linear;-ms-transition:visibility 0s linear 1.5s,opacity 1.5s linear;-o-transition:visibility 0s linear 1.5s,opacity 1.5s linear;transition:visibility 0s linear 1.5s,opacity 1.5s linear}.vjs-default-skin .vjs-controls{position:absolute;bottom:0;left:0;right:0;margin:0;padding:0;height:2.6em;color:#fff;border-top:1px solid #404040;background:#242424;background:-moz-linear-gradient(top,#242424 50%,#1f1f1f 50%,#171717 100%);background:-webkit-gradient(linear,0% 0,0% 100%,color-stop(50%,#242424),color-stop(50%,#1f1f1f),color-stop(100%,#171717));background:-webkit-linear-gradient(top,#242424 50%,#1f1f1f 50%,#171717 100%);background:-o-linear-gradient(top,#242424 50%,#1f1f1f 50%,#171717 100%);background:-ms-linear-gradient(top,#242424 50%,#1f1f1f 50%,#171717 100%);background:linear-gradient(top,#242424 50%,#1f1f1f 50%,#171717 100%);visibility:hidden;opacity:0}.vjs-default-skin .vjs-control{position:relative;float:left;text-align:center;margin:0;padding:0;height:2.6em;width:2.6em}.vjs-default-skin .vjs-control:focus{outline:0}.vjs-default-skin .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-default-skin .vjs-play-control{width:5em;cursor:pointer!important}.vjs-default-skin.vjs-paused .vjs-play-control div{width:15px;height:17px;background:url('video-js.png');margin:.5em auto 0}.vjs-default-skin.vjs-playing .vjs-play-control div{width:15px;height:17px;background:url('video-js.png') -25px 0;margin:.5em auto 0}.vjs-default-skin .vjs-rewind-control{width:5em;cursor:pointer!important}.vjs-default-skin .vjs-rewind-control div{width:19px;height:16px;background:url('video-js.png');margin:.5em auto 0}.vjs-default-skin .vjs-mute-control{width:3.8em;cursor:pointer!important;float:right}.vjs-default-skin .vjs-mute-control div{width:22px;height:16px;background:url('video-js.png') -75px -25px;margin:.5em auto 0}.vjs-default-skin .vjs-mute-control.vjs-vol-0 div{background:url('video-js.png') 0 -25px}.vjs-default-skin .vjs-mute-control.vjs-vol-1 div{background:url('video-js.png') -25px -25px}.vjs-default-skin .vjs-mute-control.vjs-vol-2 div{background:url('video-js.png') -50px -25px}.vjs-default-skin .vjs-volume-control{width:5em;float:right}.vjs-default-skin .vjs-volume-bar{position:relative;width:5em;height:.6em;margin:1em auto 0;cursor:pointer!important;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;background:#666;background:-moz-linear-gradient(top,#333,#666);background:-webkit-gradient(linear,0% 0,0% 100%,from(#333),to(#666));background:-webkit-linear-gradient(top,#333,#666);background:-o-linear-gradient(top,#333,#666);background:-ms-linear-gradient(top,#333,#666);background:linear-gradient(top,#333,#666)}.vjs-default-skin .vjs-volume-level{position:absolute;top:0;left:0;height:.6em;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;background:#fff;background:-moz-linear-gradient(top,#fff,#ccc);background:-webkit-gradient(linear,0% 0,0% 100%,from(#fff),to(#ccc));background:-webkit-linear-gradient(top,#fff,#ccc);background:-o-linear-gradient(top,#fff,#ccc);background:-ms-linear-gradient(top,#fff,#ccc);background:linear-gradient(top,#fff,#ccc)}.vjs-default-skin .vjs-volume-handle{position:absolute;top:-0.2em;width:.8em;height:.8em;background:#ccc;left:0;border:1px solid #fff;-moz-border-radius:.6em;-webkit-border-radius:.6em;border-radius:.6em}.vjs-default-skin div.vjs-progress-control{position:absolute;left:4.8em;right:4.8em;height:1.0em;width:auto;top:-1.3em;border-bottom:1px solid #1f1f1f;border-top:1px solid #222;background:#333;background:-moz-linear-gradient(top,#222,#333);background:-webkit-gradient(linear,0% 0,0% 100%,from(#222),to(#333));background:-webkit-linear-gradient(top,#222,#333);background:-o-linear-gradient(top,#333,#222);background:-ms-linear-gradient(top,#333,#222);background:linear-gradient(top,#333,#222)}.vjs-default-skin .vjs-progress-holder{position:relative;cursor:pointer!important;padding:0;margin:0;height:1.0em;-moz-border-radius:.6em;-webkit-border-radius:.6em;border-radius:.6em;background:#111;background:-moz-linear-gradient(top,#111,#262626);background:-webkit-gradient(linear,0% 0,0% 100%,from(#111),to(#262626));background:-webkit-linear-gradient(top,#111,#262626);background:-o-linear-gradient(top,#111,#262626);background:-ms-linear-gradient(top,#111,#262626);background:linear-gradient(top,#111,#262626)}.vjs-default-skin .vjs-progress-holder .vjs-play-progress,.vjs-default-skin .vjs-progress-holder .vjs-load-progress{position:absolute;display:block;height:1.0em;margin:0;padding:0;left:0;top:0;-moz-border-radius:.6em;-webkit-border-radius:.6em;border-radius:.6em}.vjs-default-skin .vjs-play-progress{background:#fff;background:-moz-linear-gradient(top,#fff 0,#d6d6d6 50%,#fff 100%);background:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#fff),color-stop(50%,#d6d6d6),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#fff 0,#d6d6d6 50%,#fff 100%);background:-o-linear-gradient(top,#fff 0,#d6d6d6 50%,#fff 100%);background:-ms-linear-gradient(top,#fff 0,#d6d6d6 50%,#fff 100%);background:linear-gradient(top,#fff 0,#d6d6d6 50%,#fff 100%);background:#efefef;background:-moz-linear-gradient(top,#efefef 0,#f5f5f5 50%,#dbdbdb 50%,#f1f1f1 100%);background:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#efefef),color-stop(50%,#f5f5f5),color-stop(50%,#dbdbdb),color-stop(100%,#f1f1f1));background:-webkit-linear-gradient(top,#efefef 0,#f5f5f5 50%,#dbdbdb 50%,#f1f1f1 100%);background:-o-linear-gradient(top,#efefef 0,#f5f5f5 50%,#dbdbdb 50%,#f1f1f1 100%);background:-ms-linear-gradient(top,#efefef 0,#f5f5f5 50%,#dbdbdb 50%,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#efefef',endColorstr='#f1f1f1',GradientType=0);background:linear-gradient(top,#efefef 0,#f5f5f5 50%,#dbdbdb 50%,#f1f1f1 100%)}.vjs-default-skin .vjs-load-progress{opacity:.8;background:#666;background:-moz-linear-gradient(top,#666,#333);background:-webkit-gradient(linear,0% 0,0% 100%,from(#666),to(#333));background:-webkit-linear-gradient(top,#666,#333);background:-o-linear-gradient(top,#666,#333);background:-ms-linear-gradient(top,#666,#333);background:linear-gradient(top,#666,#333)}.vjs-default-skin div.vjs-seek-handle{position:absolute;width:16px;height:16px;margin-top:-0.3em;left:0;top:0;background:url('video-js.png') 0 -50px;-moz-border-radius:.8em;-webkit-border-radius:.8em;border-radius:.8em;-webkit-box-shadow:0 2px 4px 0 #000;-moz-box-shadow:0 2px 4px 0 #000;box-shadow:0 2px 4px 0 #000}.vjs-default-skin .vjs-time-controls{position:absolute;right:0;height:1.0em;width:4.8em;top:-1.3em;border-bottom:1px solid #1f1f1f;border-top:1px solid #222;background-color:#333;font-size:1em;line-height:1.0em;font-weight:normal;font-family:Helvetica,Arial,sans-serif;background:#333;background:-moz-linear-gradient(top,#222,#333);background:-webkit-gradient(linear,0% 0,0% 100%,from(#222),to(#333));background:-webkit-linear-gradient(top,#222,#333);background:-o-linear-gradient(top,#333,#222);background:-ms-linear-gradient(top,#333,#222);background:linear-gradient(top,#333,#222)}.vjs-default-skin .vjs-current-time{left:0}.vjs-default-skin .vjs-duration{right:0;display:none}.vjs-default-skin .vjs-remaining-time{right:0}.vjs-time-divider{display:none}.vjs-default-skin .vjs-time-control{font-size:1em;line-height:1;font-weight:normal;font-family:Helvetica,Arial,sans-serif}.vjs-default-skin .vjs-time-control span{line-height:25px}.vjs-secondary-controls{float:right}.vjs-default-skin .vjs-fullscreen-control{width:3.8em;cursor:pointer!important;float:right}.vjs-default-skin .vjs-fullscreen-control div{width:16px;height:16px;background:url('video-js.png') -50px 0;margin:.5em auto 0}.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control div{background:url('video-js.png') -75px 0}.vjs-default-skin .vjs-big-play-button{display:block;z-index:2;position:absolute;top:50%;left:50%;width:8.0em;height:8.0em;margin:-42px 0 0 -42px;text-align:center;vertical-align:center;cursor:pointer!important;border:.2em solid #fff;opacity:.95;-webkit-border-radius:25px;-moz-border-radius:25px;border-radius:25px;background:#454545;background:-moz-linear-gradient(top,#454545 0,#232323 50%,#161616 50%,#3f3f3f 100%);background:-webkit-gradient(linear,0% 0,0% 100%,color-stop(0%,#454545),color-stop(50%,#232323),color-stop(50%,#161616),color-stop(100%,#3f3f3f));background:-webkit-linear-gradient(top,#454545 0,#232323 50%,#161616 50%,#3f3f3f 100%);background:-o-linear-gradient(top,#454545 0,#232323 50%,#161616 50%,#3f3f3f 100%);background:-ms-linear-gradient(top,#454545 0,#232323 50%,#161616 50%,#3f3f3f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545',endColorstr='#3f3f3f',GradientType=0);background:linear-gradient(top,#454545 0,#232323 50%,#161616 50%,#3f3f3f 100%);-webkit-box-shadow:4px 4px 8px #000;-moz-box-shadow:4px 4px 8px #000;box-shadow:4px 4px 8px #000}.vjs-default-skin div.vjs-big-play-button:hover{-webkit-box-shadow:0 0 80px #fff;-moz-box-shadow:0 0 80px #fff;box-shadow:0 0 80px #fff}.vjs-default-skin div.vjs-big-play-button span{position:absolute;top:50%;left:50%;display:block;width:35px;height:42px;margin:-20px 0 0 -15px;background:url('video-js.png') -100px 0}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;width:55px;height:55px;margin:-28px 0 0 -28px;-webkit-animation-name:rotatethis;-webkit-animation-duration:1s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;-moz-animation-name:rotatethis;-moz-animation-duration:1s;-moz-animation-iteration-count:infinite;-moz-animation-timing-function:linear}@-webkit-keyframes rotatethis{0%{-webkit-transform:scale(0.6) rotate(0deg)}12.5%{-webkit-transform:scale(0.6) rotate(0deg)}12.51%{-webkit-transform:scale(0.6) rotate(45deg)}25%{-webkit-transform:scale(0.6) rotate(45deg)}25.01%{-webkit-transform:scale(0.6) rotate(90deg)}37.5%{-webkit-transform:scale(0.6) rotate(90deg)}37.51%{-webkit-transform:scale(0.6) rotate(135deg)}50%{-webkit-transform:scale(0.6) rotate(135deg)}50.01%{-webkit-transform:scale(0.6) rotate(180deg)}62.5%{-webkit-transform:scale(0.6) rotate(180deg)}62.51%{-webkit-transform:scale(0.6) rotate(225deg)}75%{-webkit-transform:scale(0.6) rotate(225deg)}75.01%{-webkit-transform:scale(0.6) rotate(270deg)}87.5%{-webkit-transform:scale(0.6) rotate(270deg)}87.51%{-webkit-transform:scale(0.6) rotate(315deg)}100%{-webkit-transform:scale(0.6) rotate(315deg)}}@-moz-keyframes rotatethis{0%{-moz-transform:scale(0.6) rotate(0deg)}12.5%{-moz-transform:scale(0.6) rotate(0deg)}12.51%{-moz-transform:scale(0.6) rotate(45deg)}25%{-moz-transform:scale(0.6) rotate(45deg)}25.01%{-moz-transform:scale(0.6) rotate(90deg)}37.5%{-moz-transform:scale(0.6) rotate(90deg)}37.51%{-moz-transform:scale(0.6) rotate(135deg)}50%{-moz-transform:scale(0.6) rotate(135deg)}50.01%{-moz-transform:scale(0.6) rotate(180deg)}62.5%{-moz-transform:scale(0.6) rotate(180deg)}62.51%{-moz-transform:scale(0.6) rotate(225deg)}75%{-moz-transform:scale(0.6) rotate(225deg)}75.01%{-moz-transform:scale(0.6) rotate(270deg)}87.5%{-moz-transform:scale(0.6) rotate(270deg)}87.51%{-moz-transform:scale(0.6) rotate(315deg)}100%{-moz-transform:scale(0.6) rotate(315deg)}}div.vjs-loading-spinner .ball1{opacity:.12;position:absolute;left:20px;top:0;width:13px;height:13px;background:#fff;border-radius:13px;-webkit-border-radius:13px;-moz-border-radius:13px;border:1px solid #ccc}div.vjs-loading-spinner .ball2{opacity:.25;position:absolute;left:34px;top:6px;width:13px;height:13px;background:#fff;border-radius:13px;-webkit-border-radius:13px;-moz-border-radius:13px;border:1px solid #ccc}div.vjs-loading-spinner .ball3{opacity:.37;position:absolute;left:40px;top:20px;width:13px;height:13px;background:#fff;border-radius:13px;-webkit-border-radius:13px;-moz-border-radius:13px;border:1px solid #ccc}div.vjs-loading-spinner .ball4{opacity:.50;position:absolute;left:34px;top:34px;width:13px;height:13px;background:#fff;border-radius:10px;-webkit-border-radius:10px;-moz-border-radius:15px;border:1px solid #ccc}div.vjs-loading-spinner .ball5{opacity:.62;position:absolute;left:20px;top:40px;width:13px;height:13px;background:#fff;border-radius:13px;-webkit-border-radius:13px;-moz-border-radius:13px;border:1px solid #ccc}div.vjs-loading-spinner .ball6{opacity:.75;position:absolute;left:6px;top:34px;width:13px;height:13px;background:#fff;border-radius:13px;-webkit-border-radius:13px;-moz-border-radius:13px;border:1px solid #ccc}div.vjs-loading-spinner .ball7{opacity:.87;position:absolute;left:0;top:20px;width:13px;height:13px;background:#fff;border-radius:13px;-webkit-border-radius:13px;-moz-border-radius:13px;border:1px solid #ccc}div.vjs-loading-spinner .ball8{opacity:1.00;position:absolute;left:6px;top:6px;width:13px;height:13px;background:#fff;border-radius:13px;-webkit-border-radius:13px;-moz-border-radius:13px;border:1px solid #ccc}.vjs-default-skin .vjs-menu-button{float:right;margin:.2em .5em 0 0;padding:0;width:3em;height:2em;cursor:pointer!important;border:1px solid #111;-moz-border-radius:.3em;-webkit-border-radius:.3em;border-radius:.3em;background:#4d4d4d;background:-moz-linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#4d4d4d),color-stop(50%,#3f3f3f),color-stop(50%,#333),color-stop(100%,#252525));background:-webkit-linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%);background:-o-linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%);background:-ms-linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%);background:linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%)}.vjs-default-skin .vjs-menu-button div{background:url('video-js.png') 0 -75px no-repeat;width:16px;height:16px;margin:.2em auto 0;padding:0}.vjs-default-skin .vjs-menu-button ul{display:none;opacity:.8;padding:0;margin:0;position:absolute;width:10em;bottom:2em;max-height:15em;left:-3.5em;background-color:#111;border:2px solid #333;-moz-border-radius:.7em;-webkit-border-radius:1em;border-radius:.5em;-webkit-box-shadow:0 2px 4px 0 #000;-moz-box-shadow:0 2px 4px 0 #000;box-shadow:0 2px 4px 0 #000;overflow:auto}.vjs-default-skin .vjs-menu-button:focus ul,.vjs-default-skin .vjs-menu-button:hover ul{display:block;list-style:none}.vjs-default-skin .vjs-menu-button ul li{list-style:none;margin:0;padding:.3em 0 .3em 20px;line-height:1.4em;font-size:1.2em;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;text-align:left}.vjs-default-skin .vjs-menu-button ul li.vjs-selected{text-decoration:underline;background:url('video-js.png') -125px -50px no-repeat}.vjs-default-skin .vjs-menu-button ul li:focus,.vjs-default-skin .vjs-menu-button ul li:hover,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover{background-color:#ccc;color:#111;outline:0}.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em 0;color:#fff;font-weight:bold;cursor:default;background:#4d4d4d;background:-moz-linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#4d4d4d),color-stop(50%,#3f3f3f),color-stop(50%,#333),color-stop(100%,#252525));background:-webkit-linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%);background:-o-linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%);background:-ms-linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%);background:linear-gradient(top,#4d4d4d 0,#3f3f3f 50%,#333 50%,#252525 100%)}.vjs-default-skin .vjs-captions-button div{background-position:-25px -75px}.vjs-default-skin .vjs-chapters-button div{background-position:-100px -75px}.vjs-default-skin .vjs-chapters-button ul{width:20em;left:-8.5em} \ No newline at end of file
+/*!
+Video.js Default Styles (http://videojs.com)
+Version 4.2.1
+Create your own skin at http://designer.videojs.com
+*/.vjs-default-skin{color:#ccc}@font-face{font-family:VideoJS;src:url(font/vjs.eot);src:url(font/vjs.eot?#iefix) format('embedded-opentype'),url(font/vjs.woff) format('woff'),url(font/vjs.ttf) format('truetype');font-weight:400;font-style:normal}.vjs-default-skin .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;background-color:#333;background-color:rgba(51,51,51,.9)}.vjs-default-skin .vjs-slider:focus{-webkit-box-shadow:0 0 2em #fff;-moz-box-shadow:0 0 2em #fff;box-shadow:0 0 2em #fff}.vjs-default-skin .vjs-slider-handle{position:absolute;left:0;top:0}.vjs-default-skin .vjs-slider-handle:before{content:"\e009";font-family:VideoJS;font-size:1em;line-height:1;text-align:center;text-shadow:0 0 1em #fff;position:absolute;top:0;left:0;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.vjs-default-skin .vjs-control-bar{display:none;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#07141e;background-color:rgba(7,20,30,.7)}.vjs-default-skin.vjs-has-started .vjs-control-bar{display:block;visibility:visible;opacity:1;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{display:block;visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-default-skin.vjs-controls-disabled .vjs-control-bar{display:none}.vjs-default-skin.vjs-using-native-controls .vjs-control-bar{display:none}@media \0screen{.vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}.vjs-default-skin .vjs-control{outline:0;position:relative;float:left;text-align:center;margin:0;padding:0;height:3em;width:4em}.vjs-default-skin .vjs-control:before{font-family:VideoJS;font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.5)}.vjs-default-skin .vjs-control:focus:before,.vjs-default-skin .vjs-control:hover:before{text-shadow:0 0 1em #fff}.vjs-default-skin .vjs-control:focus{}.vjs-default-skin .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-default-skin .vjs-play-control{width:5em;cursor:pointer}.vjs-default-skin .vjs-play-control:before{content:"\e001"}.vjs-default-skin.vjs-playing .vjs-play-control:before{content:"\e002"}.vjs-default-skin .vjs-mute-control,.vjs-default-skin .vjs-volume-menu-button{cursor:pointer;float:right}.vjs-default-skin .vjs-mute-control:before,.vjs-default-skin .vjs-volume-menu-button:before{content:"\e006"}.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before{content:"\e003"}.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before{content:"\e004"}.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before{content:"\e005"}.vjs-default-skin .vjs-volume-control{width:5em;float:right}.vjs-default-skin .vjs-volume-bar{width:5em;height:.6em;margin:1.1em auto 0}.vjs-default-skin .vjs-volume-menu-button .vjs-menu-content{height:2.9em}.vjs-default-skin .vjs-volume-level{position:absolute;top:0;left:0;height:.5em;background:#66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat}.vjs-default-skin .vjs-volume-bar .vjs-volume-handle{width:.5em;height:.5em}.vjs-default-skin .vjs-volume-handle:before{font-size:.9em;top:-.2em;left:-.2em;width:1em;height:1em}.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content{width:6em;left:-4em}.vjs-default-skin .vjs-progress-control{position:absolute;left:0;right:0;width:auto;font-size:.3em;height:1em;top:-1em;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-default-skin:hover .vjs-progress-control{font-size:.9em;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-default-skin .vjs-progress-holder{height:100%}.vjs-default-skin .vjs-progress-holder .vjs-play-progress,.vjs-default-skin .vjs-progress-holder .vjs-load-progress{position:absolute;display:block;height:100%;margin:0;padding:0;left:0;top:0}.vjs-default-skin .vjs-play-progress{background:#66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat}.vjs-default-skin .vjs-load-progress{background:#646464;background:rgba(255,255,255,.4)}.vjs-default-skin .vjs-seek-handle{width:1.5em;height:100%}.vjs-default-skin .vjs-seek-handle:before{padding-top:.1em}.vjs-default-skin .vjs-time-controls{font-size:1em;line-height:3em}.vjs-default-skin .vjs-current-time{float:left}.vjs-default-skin .vjs-duration{float:left}.vjs-default-skin .vjs-remaining-time{display:none;float:left}.vjs-time-divider{float:left;line-height:3em}.vjs-default-skin .vjs-fullscreen-control{width:3.8em;cursor:pointer;float:right}.vjs-default-skin .vjs-fullscreen-control:before{content:"\e000"}.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before{content:"\e00b"}.vjs-default-skin .vjs-big-play-button{left:.5em;top:.5em;font-size:3em;display:block;z-index:2;position:absolute;width:4em;height:2.6em;text-align:center;vertical-align:middle;cursor:pointer;opacity:1;background-color:#07141e;background-color:rgba(7,20,30,.7);border:.1em solid #3b4249;-webkit-border-radius:.8em;-moz-border-radius:.8em;border-radius:.8em;-webkit-box-shadow:0 0 1em rgba(255,255,255,.25);-moz-box-shadow:0 0 1em rgba(255,255,255,.25);box-shadow:0 0 1em rgba(255,255,255,.25);-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button{display:none}.vjs-default-skin.vjs-has-started .vjs-big-play-button{display:none}.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button{display:none}.vjs-default-skin:hover .vjs-big-play-button,.vjs-default-skin .vjs-big-play-button:focus{outline:0;border-color:#fff;background-color:#505050;background-color:rgba(50,50,50,.75);-webkit-box-shadow:0 0 3em #fff;-moz-box-shadow:0 0 3em #fff;box-shadow:0 0 3em #fff;-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}.vjs-default-skin .vjs-big-play-button:before{content:"\e001";font-family:VideoJS;line-height:2.6em;text-shadow:.05em .05em .1em #000;text-align:center;position:absolute;left:0;width:100%;height:100%}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;font-size:5em;line-height:1;width:1em;height:1em;margin-left:-.5em;margin-top:-.5em;opacity:.75;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}.vjs-default-skin .vjs-loading-spinner:before{content:"\e00a";font-family:VideoJS;position:absolute;top:0;left:0;width:1em;height:1em;text-align:center;text-shadow:0 0 .1em #000}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.vjs-default-skin .vjs-menu-button{float:right;cursor:pointer}.vjs-default-skin .vjs-menu{display:none;position:absolute;bottom:0;left:0;width:0;height:0;margin-bottom:3em;border-left:2em solid transparent;border-right:2em solid transparent;border-top:1.55em solid #000;border-top-color:rgba(7,40,50,.5)}.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;position:absolute;width:10em;bottom:1.5em;max-height:15em;overflow:auto;left:-5em;background-color:#07141e;background-color:rgba(7,20,30,.7);-webkit-box-shadow:-.2em -.2em .3em rgba(255,255,255,.2);-moz-box-shadow:-.2em -.2em .3em rgba(255,255,255,.2);box-shadow:-.2em -.2em .3em rgba(255,255,255,.2)}.vjs-default-skin .vjs-menu-button:hover .vjs-menu{display:block}.vjs-default-skin .vjs-menu-button ul li{list-style:none;margin:0;padding:.3em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-default-skin .vjs-menu-button ul li.vjs-selected{background-color:#000}.vjs-default-skin .vjs-menu-button ul li:focus,.vjs-default-skin .vjs-menu-button ul li:hover,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover{outline:0;color:#111;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-default-skin .vjs-subtitles-button:before{content:"\e00c"}.vjs-default-skin .vjs-captions-button:before{content:"\e008"}.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before{-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.video-js{background-color:#000;position:relative;padding:0;font-size:10px;vertical-align:middle;font-weight:400;font-style:normal;font-family:Arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.video-js:-moz-full-screen{position:absolute}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0;width:100%!important;height:100%!important;_position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-poster{background-repeat:no-repeat;background-position:50% 50%;background-size:contain;cursor:pointer;height:100%;margin:0;padding:0;position:relative;width:100%}.vjs-poster img{display:block;margin:0 auto;max-height:100%;padding:0;width:100%}.video-js.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-text-track-display{text-align:center;position:absolute;bottom:4em;left:1em;right:1em}.video-js .vjs-text-track{display:none;font-size:1.4em;text-align:center;margin-bottom:.1em;background-color:#000;background-color:rgba(0,0,0,.5)}.video-js .vjs-subtitles{color:#fff}.video-js .vjs-captions{color:#fc6}.vjs-tt-cue{display:block}.vjs-default-skin .vjs-hidden{display:none}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible} \ No newline at end of file
diff --git a/extlib/video-js/video-js.png b/extlib/video-js/video-js.png
deleted file mode 100644
index 100bc7f8..00000000
--- a/extlib/video-js/video-js.png
+++ /dev/null
Binary files differ
diff --git a/extlib/video-js/video-js.swf b/extlib/video-js/video-js.swf
new file mode 100644
index 00000000..d15fbc3f
--- /dev/null
+++ b/extlib/video-js/video-js.swf
Binary files differ
diff --git a/extlib/video-js/video.dev.js b/extlib/video-js/video.dev.js
new file mode 100644
index 00000000..2ff69a8c
--- /dev/null
+++ b/extlib/video-js/video.dev.js
@@ -0,0 +1,6457 @@
+/**
+ * @fileoverview Main function src.
+ */
+
+// HTML5 Shiv. Must be in <head> to support older browsers.
+document.createElement('video');
+document.createElement('audio');
+document.createElement('track');
+
+/**
+ * Doubles as the main function for users to create a player instance and also
+ * the main library object.
+ *
+ * @param {String|Element} id Video element or video element ID
+ * @param {Object=} options Optional options object for config/settings
+ * @param {Function=} ready Optional ready callback
+ * @return {vjs.Player} A player instance
+ */
+var vjs = function(id, options, ready){
+ var tag; // Element of ID
+
+ // Allow for element or ID to be passed in
+ // String ID
+ if (typeof id === 'string') {
+
+ // Adjust for jQuery ID syntax
+ if (id.indexOf('#') === 0) {
+ id = id.slice(1);
+ }
+
+ // If a player instance has already been created for this ID return it.
+ if (vjs.players[id]) {
+ return vjs.players[id];
+
+ // Otherwise get element for ID
+ } else {
+ tag = vjs.el(id);
+ }
+
+ // ID is a media element
+ } else {
+ tag = id;
+ }
+
+ // Check for a useable element
+ if (!tag || !tag.nodeName) { // re: nodeName, could be a box div also
+ throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns
+ }
+
+ // Element may have a player attr referring to an already created player instance.
+ // If not, set up a new player and return the instance.
+ return tag['player'] || new vjs.Player(tag, options, ready);
+};
+
+// Extended name, also available externally, window.videojs
+var videojs = vjs;
+window.videojs = window.vjs = vjs;
+
+// CDN Version. Used to target right flash swf.
+vjs.CDN_VERSION = '4.2';
+vjs.ACCESS_PROTOCOL = ('https:' == document.location.protocol ? 'https://' : 'http://');
+
+/**
+ * Global Player instance options, surfaced from vjs.Player.prototype.options_
+ * vjs.options = vjs.Player.prototype.options_
+ * All options should use string keys so they avoid
+ * renaming by closure compiler
+ * @type {Object}
+ */
+vjs.options = {
+ // Default order of fallback technology
+ 'techOrder': ['html5','flash'],
+ // techOrder: ['flash','html5'],
+
+ 'html5': {},
+ 'flash': {},
+
+ // Default of web browser is 300x150. Should rely on source width/height.
+ 'width': 300,
+ 'height': 150,
+ // defaultVolume: 0.85,
+ 'defaultVolume': 0.00, // The freakin seaguls are driving me crazy!
+
+ // Included control sets
+ 'children': {
+ 'mediaLoader': {},
+ 'posterImage': {},
+ 'textTrackDisplay': {},
+ 'loadingSpinner': {},
+ 'bigPlayButton': {},
+ 'controlBar': {}
+ },
+
+ // Default message to show when a video cannot be played.
+ 'notSupportedMessage': 'Sorry, no compatible source and playback ' +
+ 'technology were found for this video. Try using another browser ' +
+ 'like <a href="http://bit.ly/ccMUEC">Chrome</a> or download the ' +
+ 'latest <a href="http://adobe.ly/mwfN1">Adobe Flash Player</a>.'
+};
+
+// Set CDN Version of swf
+// The added (+) blocks the replace from changing this 4.2 string
+if (vjs.CDN_VERSION !== 'GENERATED'+'_CDN_VSN') {
+ videojs.options['flash']['swf'] = vjs.ACCESS_PROTOCOL + 'vjs.zencdn.net/'+vjs.CDN_VERSION+'/video-js.swf';
+}
+
+/**
+ * Global player list
+ * @type {Object}
+ */
+vjs.players = {};
+/**
+ * Core Object/Class for objects that use inheritance + contstructors
+ * @constructor
+ */
+vjs.CoreObject = vjs['CoreObject'] = function(){};
+// Manually exporting vjs['CoreObject'] here for Closure Compiler
+// because of the use of the extend/create class methods
+// If we didn't do this, those functions would get flattend to something like
+// `a = ...` and `this.prototype` would refer to the global object instead of
+// CoreObject
+
+/**
+ * Create a new object that inherits from this Object
+ * @param {Object} props Functions and properties to be applied to the
+ * new object's prototype
+ * @return {vjs.CoreObject} Returns an object that inherits from CoreObject
+ * @this {*}
+ */
+vjs.CoreObject.extend = function(props){
+ var init, subObj;
+
+ props = props || {};
+ // Set up the constructor using the supplied init method
+ // or using the init of the parent object
+ // Make sure to check the unobfuscated version for external libs
+ init = props['init'] || props.init || this.prototype['init'] || this.prototype.init || function(){};
+ // In Resig's simple class inheritance (previously used) the constructor
+ // is a function that calls `this.init.apply(arguments)`
+ // However that would prevent us from using `ParentObject.call(this);`
+ // in a Child constuctor because the `this` in `this.init`
+ // would still refer to the Child and cause an inifinite loop.
+ // We would instead have to do
+ // `ParentObject.prototype.init.apply(this, argumnents);`
+ // Bleh. We're not creating a _super() function, so it's good to keep
+ // the parent constructor reference simple.
+ subObj = function(){
+ init.apply(this, arguments);
+ };
+
+ // Inherit from this object's prototype
+ subObj.prototype = vjs.obj.create(this.prototype);
+ // Reset the constructor property for subObj otherwise
+ // instances of subObj would have the constructor of the parent Object
+ subObj.prototype.constructor = subObj;
+
+ // Make the class extendable
+ subObj.extend = vjs.CoreObject.extend;
+ // Make a function for creating instances
+ subObj.create = vjs.CoreObject.create;
+
+ // Extend subObj's prototype with functions and other properties from props
+ for (var name in props) {
+ if (props.hasOwnProperty(name)) {
+ subObj.prototype[name] = props[name];
+ }
+ }
+
+ return subObj;
+};
+
+/**
+ * Create a new instace of this Object class
+ * @return {vjs.CoreObject} Returns an instance of a CoreObject subclass
+ * @this {*}
+ */
+vjs.CoreObject.create = function(){
+ // Create a new object that inherits from this object's prototype
+ var inst = vjs.obj.create(this.prototype);
+
+ // Apply this constructor function to the new object
+ this.apply(inst, arguments);
+
+ // Return the new object
+ return inst;
+};
+/**
+ * @fileoverview Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)
+ * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)
+ * This should work very similarly to jQuery's events, however it's based off the book version which isn't as
+ * robust as jquery's, so there's probably some differences.
+ */
+
+/**
+ * Add an event listener to element
+ * It stores the handler function in a separate cache object
+ * and adds a generic handler to the element's event,
+ * along with a unique id (guid) to the element.
+ * @param {Element|Object} elem Element or object to bind listeners to
+ * @param {String} type Type of event to bind to.
+ * @param {Function} fn Event listener.
+ */
+vjs.on = function(elem, type, fn){
+ var data = vjs.getData(elem);
+
+ // We need a place to store all our handler data
+ if (!data.handlers) data.handlers = {};
+
+ if (!data.handlers[type]) data.handlers[type] = [];
+
+ if (!fn.guid) fn.guid = vjs.guid++;
+
+ data.handlers[type].push(fn);
+
+ if (!data.dispatcher) {
+ data.disabled = false;
+
+ data.dispatcher = function (event){
+
+ if (data.disabled) return;
+ event = vjs.fixEvent(event);
+
+ var handlers = data.handlers[event.type];
+
+ if (handlers) {
+ // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.
+ var handlersCopy = handlers.slice(0);
+
+ for (var m = 0, n = handlersCopy.length; m < n; m++) {
+ if (event.isImmediatePropagationStopped()) {
+ break;
+ } else {
+ handlersCopy[m].call(elem, event);
+ }
+ }
+ }
+ };
+ }
+
+ if (data.handlers[type].length == 1) {
+ if (document.addEventListener) {
+ elem.addEventListener(type, data.dispatcher, false);
+ } else if (document.attachEvent) {
+ elem.attachEvent('on' + type, data.dispatcher);
+ }
+ }
+};
+
+/**
+ * Removes event listeners from an element
+ * @param {Element|Object} elem Object to remove listeners from
+ * @param {String=} type Type of listener to remove. Don't include to remove all events from element.
+ * @param {Function} fn Specific listener to remove. Don't incldue to remove listeners for an event type.
+ */
+vjs.off = function(elem, type, fn) {
+ // Don't want to add a cache object through getData if not needed
+ if (!vjs.hasData(elem)) return;
+
+ var data = vjs.getData(elem);
+
+ // If no events exist, nothing to unbind
+ if (!data.handlers) { return; }
+
+ // Utility function
+ var removeType = function(t){
+ data.handlers[t] = [];
+ vjs.cleanUpEvents(elem,t);
+ };
+
+ // Are we removing all bound events?
+ if (!type) {
+ for (var t in data.handlers) removeType(t);
+ return;
+ }
+
+ var handlers = data.handlers[type];
+
+ // If no handlers exist, nothing to unbind
+ if (!handlers) return;
+
+ // If no listener was provided, remove all listeners for type
+ if (!fn) {
+ removeType(type);
+ return;
+ }
+
+ // We're only removing a single handler
+ if (fn.guid) {
+ for (var n = 0; n < handlers.length; n++) {
+ if (handlers[n].guid === fn.guid) {
+ handlers.splice(n--, 1);
+ }
+ }
+ }
+
+ vjs.cleanUpEvents(elem, type);
+};
+
+/**
+ * Clean up the listener cache and dispatchers
+ * @param {Element|Object} elem Element to clean up
+ * @param {String} type Type of event to clean up
+ */
+vjs.cleanUpEvents = function(elem, type) {
+ var data = vjs.getData(elem);
+
+ // Remove the events of a particular type if there are none left
+ if (data.handlers[type].length === 0) {
+ delete data.handlers[type];
+ // data.handlers[type] = null;
+ // Setting to null was causing an error with data.handlers
+
+ // Remove the meta-handler from the element
+ if (document.removeEventListener) {
+ elem.removeEventListener(type, data.dispatcher, false);
+ } else if (document.detachEvent) {
+ elem.detachEvent('on' + type, data.dispatcher);
+ }
+ }
+
+ // Remove the events object if there are no types left
+ if (vjs.isEmpty(data.handlers)) {
+ delete data.handlers;
+ delete data.dispatcher;
+ delete data.disabled;
+
+ // data.handlers = null;
+ // data.dispatcher = null;
+ // data.disabled = null;
+ }
+
+ // Finally remove the expando if there is no data left
+ if (vjs.isEmpty(data)) {
+ vjs.removeData(elem);
+ }
+};
+
+/**
+ * Fix a native event to have standard property values
+ * @param {Object} event Event object to fix
+ * @return {Object}
+ */
+vjs.fixEvent = function(event) {
+
+ function returnTrue() { return true; }
+ function returnFalse() { return false; }
+
+ // Test if fixing up is needed
+ // Used to check if !event.stopPropagation instead of isPropagationStopped
+ // But native events return true for stopPropagation, but don't have
+ // other expected methods like isPropagationStopped. Seems to be a problem
+ // with the Javascript Ninja code. So we're just overriding all events now.
+ if (!event || !event.isPropagationStopped) {
+ var old = event || window.event;
+
+ event = {};
+ // Clone the old object so that we can modify the values event = {};
+ // IE8 Doesn't like when you mess with native event properties
+ // Firefox returns false for event.hasOwnProperty('type') and other props
+ // which makes copying more difficult.
+ // TODO: Probably best to create a whitelist of event props
+ for (var key in old) {
+ // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y
+ if (key !== 'layerX' && key !== 'layerY') {
+ event[key] = old[key];
+ }
+ }
+
+ // The event occurred on this element
+ if (!event.target) {
+ event.target = event.srcElement || document;
+ }
+
+ // Handle which other element the event is related to
+ event.relatedTarget = event.fromElement === event.target ?
+ event.toElement :
+ event.fromElement;
+
+ // Stop the default browser action
+ event.preventDefault = function () {
+ if (old.preventDefault) {
+ old.preventDefault();
+ }
+ event.returnValue = false;
+ event.isDefaultPrevented = returnTrue;
+ };
+
+ event.isDefaultPrevented = returnFalse;
+
+ // Stop the event from bubbling
+ event.stopPropagation = function () {
+ if (old.stopPropagation) {
+ old.stopPropagation();
+ }
+ event.cancelBubble = true;
+ event.isPropagationStopped = returnTrue;
+ };
+
+ event.isPropagationStopped = returnFalse;
+
+ // Stop the event from bubbling and executing other handlers
+ event.stopImmediatePropagation = function () {
+ if (old.stopImmediatePropagation) {
+ old.stopImmediatePropagation();
+ }
+ event.isImmediatePropagationStopped = returnTrue;
+ event.stopPropagation();
+ };
+
+ event.isImmediatePropagationStopped = returnFalse;
+
+ // Handle mouse position
+ if (event.clientX != null) {
+ var doc = document.documentElement, body = document.body;
+
+ event.pageX = event.clientX +
+ (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
+ (doc && doc.clientLeft || body && body.clientLeft || 0);
+ event.pageY = event.clientY +
+ (doc && doc.scrollTop || body && body.scrollTop || 0) -
+ (doc && doc.clientTop || body && body.clientTop || 0);
+ }
+
+ // Handle key presses
+ event.which = event.charCode || event.keyCode;
+
+ // Fix button for mouse clicks:
+ // 0 == left; 1 == middle; 2 == right
+ if (event.button != null) {
+ event.button = (event.button & 1 ? 0 :
+ (event.button & 4 ? 1 :
+ (event.button & 2 ? 2 : 0)));
+ }
+ }
+
+ // Returns fixed-up instance
+ return event;
+};
+
+/**
+ * Trigger an event for an element
+ * @param {Element|Object} elem Element to trigger an event on
+ * @param {String} event Type of event to trigger
+ */
+vjs.trigger = function(elem, event) {
+ // Fetches element data and a reference to the parent (for bubbling).
+ // Don't want to add a data object to cache for every parent,
+ // so checking hasData first.
+ var elemData = (vjs.hasData(elem)) ? vjs.getData(elem) : {};
+ var parent = elem.parentNode || elem.ownerDocument;
+ // type = event.type || event,
+ // handler;
+
+ // If an event name was passed as a string, creates an event out of it
+ if (typeof event === 'string') {
+ event = { type:event, target:elem };
+ }
+ // Normalizes the event properties.
+ event = vjs.fixEvent(event);
+
+ // If the passed element has a dispatcher, executes the established handlers.
+ if (elemData.dispatcher) {
+ elemData.dispatcher.call(elem, event);
+ }
+
+ // Unless explicitly stopped or the event does not bubble (e.g. media events)
+ // recursively calls this function to bubble the event up the DOM.
+ if (parent && !event.isPropagationStopped() && event.bubbles !== false) {
+ vjs.trigger(parent, event);
+
+ // If at the top of the DOM, triggers the default action unless disabled.
+ } else if (!parent && !event.isDefaultPrevented()) {
+ var targetData = vjs.getData(event.target);
+
+ // Checks if the target has a default action for this event.
+ if (event.target[event.type]) {
+ // Temporarily disables event dispatching on the target as we have already executed the handler.
+ targetData.disabled = true;
+ // Executes the default action.
+ if (typeof event.target[event.type] === 'function') {
+ event.target[event.type]();
+ }
+ // Re-enables event dispatching.
+ targetData.disabled = false;
+ }
+ }
+
+ // Inform the triggerer if the default was prevented by returning false
+ return !event.isDefaultPrevented();
+ /* Original version of js ninja events wasn't complete.
+ * We've since updated to the latest version, but keeping this around
+ * for now just in case.
+ */
+ // // Added in attion to book. Book code was broke.
+ // event = typeof event === 'object' ?
+ // event[vjs.expando] ?
+ // event :
+ // new vjs.Event(type, event) :
+ // new vjs.Event(type);
+
+ // event.type = type;
+ // if (handler) {
+ // handler.call(elem, event);
+ // }
+
+ // // Clean up the event in case it is being reused
+ // event.result = undefined;
+ // event.target = elem;
+};
+
+/**
+ * Trigger a listener only once for an event
+ * @param {Element|Object} elem Element or object to
+ * @param {[type]} type [description]
+ * @param {Function} fn [description]
+ * @return {[type]}
+ */
+vjs.one = function(elem, type, fn) {
+ var func = function(){
+ vjs.off(elem, type, func);
+ fn.apply(this, arguments);
+ };
+ func.guid = fn.guid = fn.guid || vjs.guid++;
+ vjs.on(elem, type, func);
+};
+var hasOwnProp = Object.prototype.hasOwnProperty;
+
+/**
+ * Creates an element and applies properties.
+ * @param {String=} tagName Name of tag to be created.
+ * @param {Object=} properties Element properties to be applied.
+ * @return {Element}
+ */
+vjs.createEl = function(tagName, properties){
+ var el, propName;
+
+ el = document.createElement(tagName || 'div');
+
+ for (propName in properties){
+ if (hasOwnProp.call(properties, propName)) {
+ //el[propName] = properties[propName];
+ // Not remembering why we were checking for dash
+ // but using setAttribute means you have to use getAttribute
+
+ // The check for dash checks for the aria-* attributes, like aria-label, aria-valuemin.
+ // The additional check for "role" is because the default method for adding attributes does not
+ // add the attribute "role". My guess is because it's not a valid attribute in some namespaces, although
+ // browsers handle the attribute just fine. The W3C allows for aria-* attributes to be used in pre-HTML5 docs.
+ // http://www.w3.org/TR/wai-aria-primer/#ariahtml. Using setAttribute gets around this problem.
+
+ if (propName.indexOf('aria-') !== -1 || propName=='role') {
+ el.setAttribute(propName, properties[propName]);
+ } else {
+ el[propName] = properties[propName];
+ }
+ }
+ }
+ return el;
+};
+
+/**
+ * Uppercase the first letter of a string
+ * @param {String} string String to be uppercased
+ * @return {String}
+ */
+vjs.capitalize = function(string){
+ return string.charAt(0).toUpperCase() + string.slice(1);
+};
+
+/**
+ * Object functions container
+ * @type {Object}
+ */
+vjs.obj = {};
+
+/**
+ * Object.create shim for prototypal inheritance.
+ * https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create
+ * @param {Object} obj Object to use as prototype
+ */
+ vjs.obj.create = Object.create || function(obj){
+ //Create a new function called 'F' which is just an empty object.
+ function F() {}
+
+ //the prototype of the 'F' function should point to the
+ //parameter of the anonymous function.
+ F.prototype = obj;
+
+ //create a new constructor function based off of the 'F' function.
+ return new F();
+};
+
+/**
+ * Loop through each property in an object and call a function
+ * whose arguments are (key,value)
+ * @param {Object} obj Object of properties
+ * @param {Function} fn Function to be called on each property.
+ * @this {*}
+ */
+vjs.obj.each = function(obj, fn, context){
+ for (var key in obj) {
+ if (hasOwnProp.call(obj, key)) {
+ fn.call(context || this, key, obj[key]);
+ }
+ }
+};
+
+/**
+ * Merge two objects together and return the original.
+ * @param {Object} obj1
+ * @param {Object} obj2
+ * @return {Object}
+ */
+vjs.obj.merge = function(obj1, obj2){
+ if (!obj2) { return obj1; }
+ for (var key in obj2){
+ if (hasOwnProp.call(obj2, key)) {
+ obj1[key] = obj2[key];
+ }
+ }
+ return obj1;
+};
+
+/**
+ * Merge two objects, and merge any properties that are objects
+ * instead of just overwriting one. Uses to merge options hashes
+ * where deeper default settings are important.
+ * @param {Object} obj1 Object to override
+ * @param {Object} obj2 Overriding object
+ * @return {Object} New object. Obj1 and Obj2 will be untouched.
+ */
+vjs.obj.deepMerge = function(obj1, obj2){
+ var key, val1, val2;
+
+ // make a copy of obj1 so we're not ovewriting original values.
+ // like prototype.options_ and all sub options objects
+ obj1 = vjs.obj.copy(obj1);
+
+ for (key in obj2){
+ if (hasOwnProp.call(obj2, key)) {
+ val1 = obj1[key];
+ val2 = obj2[key];
+
+ // Check if both properties are pure objects and do a deep merge if so
+ if (vjs.obj.isPlain(val1) && vjs.obj.isPlain(val2)) {
+ obj1[key] = vjs.obj.deepMerge(val1, val2);
+ } else {
+ obj1[key] = obj2[key];
+ }
+ }
+ }
+ return obj1;
+};
+
+/**
+ * Make a copy of the supplied object
+ * @param {Object} obj Object to copy
+ * @return {Object} Copy of object
+ */
+vjs.obj.copy = function(obj){
+ return vjs.obj.merge({}, obj);
+};
+
+/**
+ * Check if an object is plain, and not a dom node or any object sub-instance
+ * @param {Object} obj Object to check
+ * @return {Boolean} True if plain, false otherwise
+ */
+vjs.obj.isPlain = function(obj){
+ return !!obj
+ && typeof obj === 'object'
+ && obj.toString() === '[object Object]'
+ && obj.constructor === Object;
+};
+
+/**
+ * Bind (a.k.a proxy or Context). A simple method for changing the context of a function
+ It also stores a unique id on the function so it can be easily removed from events
+ * @param {*} context The object to bind as scope
+ * @param {Function} fn The function to be bound to a scope
+ * @param {Number=} uid An optional unique ID for the function to be set
+ * @return {Function}
+ */
+vjs.bind = function(context, fn, uid) {
+ // Make sure the function has a unique ID
+ if (!fn.guid) { fn.guid = vjs.guid++; }
+
+ // Create the new function that changes the context
+ var ret = function() {
+ return fn.apply(context, arguments);
+ };
+
+ // Allow for the ability to individualize this function
+ // Needed in the case where multiple objects might share the same prototype
+ // IF both items add an event listener with the same function, then you try to remove just one
+ // it will remove both because they both have the same guid.
+ // when using this, you need to use the bind method when you remove the listener as well.
+ // currently used in text tracks
+ ret.guid = (uid) ? uid + '_' + fn.guid : fn.guid;
+
+ return ret;
+};
+
+/**
+ * Element Data Store. Allows for binding data to an element without putting it directly on the element.
+ * Ex. Event listneres are stored here.
+ * (also from jsninja.com, slightly modified and updated for closure compiler)
+ * @type {Object}
+ */
+vjs.cache = {};
+
+/**
+ * Unique ID for an element or function
+ * @type {Number}
+ */
+vjs.guid = 1;
+
+/**
+ * Unique attribute name to store an element's guid in
+ * @type {String}
+ * @constant
+ */
+vjs.expando = 'vdata' + (new Date()).getTime();
+
+/**
+ * Returns the cache object where data for an element is stored
+ * @param {Element} el Element to store data for.
+ * @return {Object}
+ */
+vjs.getData = function(el){
+ var id = el[vjs.expando];
+ if (!id) {
+ id = el[vjs.expando] = vjs.guid++;
+ vjs.cache[id] = {};
+ }
+ return vjs.cache[id];
+};
+
+/**
+ * Returns the cache object where data for an element is stored
+ * @param {Element} el Element to store data for.
+ * @return {Object}
+ */
+vjs.hasData = function(el){
+ var id = el[vjs.expando];
+ return !(!id || vjs.isEmpty(vjs.cache[id]));
+};
+
+/**
+ * Delete data for the element from the cache and the guid attr from getElementById
+ * @param {Element} el Remove data for an element
+ */
+vjs.removeData = function(el){
+ var id = el[vjs.expando];
+ if (!id) { return; }
+ // Remove all stored data
+ // Changed to = null
+ // http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/
+ // vjs.cache[id] = null;
+ delete vjs.cache[id];
+
+ // Remove the expando property from the DOM node
+ try {
+ delete el[vjs.expando];
+ } catch(e) {
+ if (el.removeAttribute) {
+ el.removeAttribute(vjs.expando);
+ } else {
+ // IE doesn't appear to support removeAttribute on the document element
+ el[vjs.expando] = null;
+ }
+ }
+};
+
+vjs.isEmpty = function(obj) {
+ for (var prop in obj) {
+ // Inlude null properties as empty.
+ if (obj[prop] !== null) {
+ return false;
+ }
+ }
+ return true;
+};
+
+/**
+ * Add a CSS class name to an element
+ * @param {Element} element Element to add class name to
+ * @param {String} classToAdd Classname to add
+ */
+vjs.addClass = function(element, classToAdd){
+ if ((' '+element.className+' ').indexOf(' '+classToAdd+' ') == -1) {
+ element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;
+ }
+};
+
+/**
+ * Remove a CSS class name from an element
+ * @param {Element} element Element to remove from class name
+ * @param {String} classToAdd Classname to remove
+ */
+vjs.removeClass = function(element, classToRemove){
+ var classNames, i;
+
+ if (element.className.indexOf(classToRemove) == -1) { return; }
+
+ classNames = element.className.split(' ');
+
+ // no arr.indexOf in ie8, and we don't want to add a big shim
+ for (i = classNames.length - 1; i >= 0; i--) {
+ if (classNames[i] === classToRemove) {
+ classNames.splice(i,1);
+ }
+ }
+
+ element.className = classNames.join(' ');
+};
+
+/**
+ * Element for testing browser HTML5 video capabilities
+ * @type {Element}
+ * @constant
+ */
+vjs.TEST_VID = vjs.createEl('video');
+
+/**
+ * Useragent for browser testing.
+ * @type {String}
+ * @constant
+ */
+vjs.USER_AGENT = navigator.userAgent;
+
+/**
+ * Device is an iPhone
+ * @type {Boolean}
+ * @constant
+ */
+vjs.IS_IPHONE = (/iPhone/i).test(vjs.USER_AGENT);
+vjs.IS_IPAD = (/iPad/i).test(vjs.USER_AGENT);
+vjs.IS_IPOD = (/iPod/i).test(vjs.USER_AGENT);
+vjs.IS_IOS = vjs.IS_IPHONE || vjs.IS_IPAD || vjs.IS_IPOD;
+
+vjs.IOS_VERSION = (function(){
+ var match = vjs.USER_AGENT.match(/OS (\d+)_/i);
+ if (match && match[1]) { return match[1]; }
+})();
+
+vjs.IS_ANDROID = (/Android/i).test(vjs.USER_AGENT);
+vjs.ANDROID_VERSION = (function() {
+ // This matches Android Major.Minor.Patch versions
+ // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned
+ var match = vjs.USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),
+ major,
+ minor;
+
+ if (!match) {
+ return null;
+ }
+
+ major = match[1] && parseFloat(match[1]);
+ minor = match[2] && parseFloat(match[2]);
+
+ if (major && minor) {
+ return parseFloat(match[1] + '.' + match[2]);
+ } else if (major) {
+ return major;
+ } else {
+ return null;
+ }
+})();
+// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser
+vjs.IS_OLD_ANDROID = vjs.IS_ANDROID && (/webkit/i).test(vjs.USER_AGENT) && vjs.ANDROID_VERSION < 2.3;
+
+vjs.IS_FIREFOX = (/Firefox/i).test(vjs.USER_AGENT);
+vjs.IS_CHROME = (/Chrome/i).test(vjs.USER_AGENT);
+
+vjs.TOUCH_ENABLED = ('ontouchstart' in window);
+
+/**
+ * Get an element's attribute values, as defined on the HTML tag
+ * Attributs are not the same as properties. They're defined on the tag
+ * or with setAttribute (which shouldn't be used with HTML)
+ * This will return true or false for boolean attributes.
+ * @param {Element} tag Element from which to get tag attributes
+ * @return {Object}
+ */
+vjs.getAttributeValues = function(tag){
+ var obj, knownBooleans, attrs, attrName, attrVal;
+
+ obj = {};
+
+ // known boolean attributes
+ // we can check for matching boolean properties, but older browsers
+ // won't know about HTML5 boolean attributes that we still read from
+ knownBooleans = ','+'autoplay,controls,loop,muted,default'+',';
+
+ if (tag && tag.attributes && tag.attributes.length > 0) {
+ attrs = tag.attributes;
+
+ for (var i = attrs.length - 1; i >= 0; i--) {
+ attrName = attrs[i].name;
+ attrVal = attrs[i].value;
+
+ // check for known booleans
+ // the matching element property will return a value for typeof
+ if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(','+attrName+',') !== -1) {
+ // the value of an included boolean attribute is typically an empty
+ // string ('') which would equal false if we just check for a false value.
+ // we also don't want support bad code like autoplay='false'
+ attrVal = (attrVal !== null) ? true : false;
+ }
+
+ obj[attrName] = attrVal;
+ }
+ }
+
+ return obj;
+};
+
+/**
+ * Get the computed style value for an element
+ * From http://robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element/
+ * @param {Element} el Element to get style value for
+ * @param {String} strCssRule Style name
+ * @return {String} Style value
+ */
+vjs.getComputedDimension = function(el, strCssRule){
+ var strValue = '';
+ if(document.defaultView && document.defaultView.getComputedStyle){
+ strValue = document.defaultView.getComputedStyle(el, '').getPropertyValue(strCssRule);
+
+ } else if(el.currentStyle){
+ // IE8 Width/Height support
+ strValue = el['client'+strCssRule.substr(0,1).toUpperCase() + strCssRule.substr(1)] + 'px';
+ }
+ return strValue;
+};
+
+/**
+ * Insert an element as the first child node of another
+ * @param {Element} child Element to insert
+ * @param {[type]} parent Element to insert child into
+ */
+vjs.insertFirst = function(child, parent){
+ if (parent.firstChild) {
+ parent.insertBefore(child, parent.firstChild);
+ } else {
+ parent.appendChild(child);
+ }
+};
+
+/**
+ * Object to hold browser support information
+ * @type {Object}
+ */
+vjs.support = {};
+
+/**
+ * Shorthand for document.getElementById()
+ * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.
+ * @param {String} id Element ID
+ * @return {Element} Element with supplied ID
+ */
+vjs.el = function(id){
+ if (id.indexOf('#') === 0) {
+ id = id.slice(1);
+ }
+
+ return document.getElementById(id);
+};
+
+/**
+ * Format seconds as a time string, H:MM:SS or M:SS
+ * Supplying a guide (in seconds) will force a number of leading zeros
+ * to cover the length of the guide
+ * @param {Number} seconds Number of seconds to be turned into a string
+ * @param {Number} guide Number (in seconds) to model the string after
+ * @return {String} Time formatted as H:MM:SS or M:SS
+ */
+vjs.formatTime = function(seconds, guide) {
+ // Default to using seconds as guide
+ guide = guide || seconds;
+ var s = Math.floor(seconds % 60),
+ m = Math.floor(seconds / 60 % 60),
+ h = Math.floor(seconds / 3600),
+ gm = Math.floor(guide / 60 % 60),
+ gh = Math.floor(guide / 3600);
+
+ // handle invalid times
+ if (isNaN(seconds) || seconds === Infinity) {
+ // '-' is false for all relational operators (e.g. <, >=) so this setting
+ // will add the minimum number of fields specified by the guide
+ h = m = s = '-';
+ }
+
+ // Check if we need to show hours
+ h = (h > 0 || gh > 0) ? h + ':' : '';
+
+ // If hours are showing, we may need to add a leading zero.
+ // Always show at least one digit of minutes.
+ m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';
+
+ // Check if leading zero is need for seconds
+ s = (s < 10) ? '0' + s : s;
+
+ return h + m + s;
+};
+
+// Attempt to block the ability to select text while dragging controls
+vjs.blockTextSelection = function(){
+ document.body.focus();
+ document.onselectstart = function () { return false; };
+};
+// Turn off text selection blocking
+vjs.unblockTextSelection = function(){ document.onselectstart = function () { return true; }; };
+
+/**
+ * Trim whitespace from the ends of a string.
+ * @param {String} string String to trim
+ * @return {String} Trimmed string
+ */
+vjs.trim = function(str){
+ return (str+'').replace(/^\s+|\s+$/g, '');
+};
+
+/**
+ * Should round off a number to a decimal place
+ * @param {Number} num Number to round
+ * @param {Number} dec Number of decimal places to round to
+ * @return {Number} Rounded number
+ */
+vjs.round = function(num, dec) {
+ if (!dec) { dec = 0; }
+ return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
+};
+
+/**
+ * Should create a fake TimeRange object
+ * Mimics an HTML5 time range instance, which has functions that
+ * return the start and end times for a range
+ * TimeRanges are returned by the buffered() method
+ * @param {Number} start Start time in seconds
+ * @param {Number} end End time in seconds
+ * @return {Object} Fake TimeRange object
+ */
+vjs.createTimeRange = function(start, end){
+ return {
+ length: 1,
+ start: function() { return start; },
+ end: function() { return end; }
+ };
+};
+
+/**
+ * Simple http request for retrieving external files (e.g. text tracks)
+ * @param {String} url URL of resource
+ * @param {Function=} onSuccess Success callback
+ * @param {Function=} onError Error callback
+ */
+vjs.get = function(url, onSuccess, onError){
+ var local, request;
+
+ if (typeof XMLHttpRequest === 'undefined') {
+ window.XMLHttpRequest = function () {
+ try { return new window.ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch (e) {}
+ try { return new window.ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch (f) {}
+ try { return new window.ActiveXObject('Msxml2.XMLHTTP'); } catch (g) {}
+ throw new Error('This browser does not support XMLHttpRequest.');
+ };
+ }
+
+ request = new XMLHttpRequest();
+ try {
+ request.open('GET', url);
+ } catch(e) {
+ onError(e);
+ }
+
+ local = (url.indexOf('file:') === 0 || (window.location.href.indexOf('file:') === 0 && url.indexOf('http') === -1));
+
+ request.onreadystatechange = function() {
+ if (request.readyState === 4) {
+ if (request.status === 200 || local && request.status === 0) {
+ onSuccess(request.responseText);
+ } else {
+ if (onError) {
+ onError();
+ }
+ }
+ }
+ };
+
+ try {
+ request.send();
+ } catch(e) {
+ if (onError) {
+ onError(e);
+ }
+ }
+};
+
+/* Local Storage
+================================================================================ */
+vjs.setLocalStorage = function(key, value){
+ try {
+ // IE was throwing errors referencing the var anywhere without this
+ var localStorage = window.localStorage || false;
+ if (!localStorage) { return; }
+ localStorage[key] = value;
+ } catch(e) {
+ if (e.code == 22 || e.code == 1014) { // Webkit == 22 / Firefox == 1014
+ vjs.log('LocalStorage Full (VideoJS)', e);
+ } else {
+ if (e.code == 18) {
+ vjs.log('LocalStorage not allowed (VideoJS)', e);
+ } else {
+ vjs.log('LocalStorage Error (VideoJS)', e);
+ }
+ }
+ }
+};
+
+/**
+ * Get abosolute version of relative URL. Used to tell flash correct URL.
+ * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
+ * @param {String} url URL to make absolute
+ * @return {String} Absolute URL
+ */
+vjs.getAbsoluteURL = function(url){
+
+ // Check if absolute URL
+ if (!url.match(/^https?:\/\//)) {
+ // Convert to absolute URL. Flash hosted off-site needs an absolute URL.
+ url = vjs.createEl('div', {
+ innerHTML: '<a href="'+url+'">x</a>'
+ }).firstChild.href;
+ }
+
+ return url;
+};
+
+// usage: log('inside coolFunc',this,arguments);
+// http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
+vjs.log = function(){
+ vjs.log.history = vjs.log.history || []; // store logs to an array for reference
+ vjs.log.history.push(arguments);
+ if(window.console){
+ window.console.log(Array.prototype.slice.call(arguments));
+ }
+};
+
+// Offset Left
+// getBoundingClientRect technique from John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/
+vjs.findPosition = function(el) {
+ var box, docEl, body, clientLeft, scrollLeft, left, clientTop, scrollTop, top;
+
+ if (el.getBoundingClientRect && el.parentNode) {
+ box = el.getBoundingClientRect();
+ }
+
+ if (!box) {
+ return {
+ left: 0,
+ top: 0
+ };
+ }
+
+ docEl = document.documentElement;
+ body = document.body;
+
+ clientLeft = docEl.clientLeft || body.clientLeft || 0;
+ scrollLeft = window.pageXOffset || body.scrollLeft;
+ left = box.left + scrollLeft - clientLeft;
+
+ clientTop = docEl.clientTop || body.clientTop || 0;
+ scrollTop = window.pageYOffset || body.scrollTop;
+ top = box.top + scrollTop - clientTop;
+
+ return {
+ left: left,
+ top: top
+ };
+};
+/**
+ * @fileoverview Player Component - Base class for all UI objects
+ *
+ */
+
+/**
+ * Base UI Component class
+ * @param {Object} player Main Player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.Component = vjs.CoreObject.extend({
+ /** @constructor */
+ init: function(player, options, ready){
+ this.player_ = player;
+
+ // Make a copy of prototype.options_ to protect against overriding global defaults
+ this.options_ = vjs.obj.copy(this.options_);
+
+ // Updated options with supplied options
+ options = this.options(options);
+
+ // Get ID from options, element, or create using player ID and unique ID
+ this.id_ = options['id'] || ((options['el'] && options['el']['id']) ? options['el']['id'] : player.id() + '_component_' + vjs.guid++ );
+
+ this.name_ = options['name'] || null;
+
+ // Create element if one wasn't provided in options
+ this.el_ = options['el'] || this.createEl();
+
+ this.children_ = [];
+ this.childIndex_ = {};
+ this.childNameIndex_ = {};
+
+ // Add any child components in options
+ this.initChildren();
+
+ this.ready(ready);
+ // Don't want to trigger ready here or it will before init is actually
+ // finished for all children that run this constructor
+ }
+});
+
+/**
+ * Dispose of the component and all child components.
+ */
+vjs.Component.prototype.dispose = function(){
+ this.trigger('dispose');
+
+ // Dispose all children.
+ if (this.children_) {
+ for (var i = this.children_.length - 1; i >= 0; i--) {
+ if (this.children_[i].dispose) {
+ this.children_[i].dispose();
+ }
+ }
+ }
+
+ // Delete child references
+ this.children_ = null;
+ this.childIndex_ = null;
+ this.childNameIndex_ = null;
+
+ // Remove all event listeners.
+ this.off();
+
+ // Remove element from DOM
+ if (this.el_.parentNode) {
+ this.el_.parentNode.removeChild(this.el_);
+ }
+
+ vjs.removeData(this.el_);
+ this.el_ = null;
+};
+
+/**
+ * Reference to main player instance.
+ * @type {vjs.Player}
+ * @private
+ */
+vjs.Component.prototype.player_;
+
+/**
+ * Return the component's player.
+ * @return {vjs.Player}
+ */
+vjs.Component.prototype.player = function(){
+ return this.player_;
+};
+
+/**
+ * Component options object.
+ * @type {Object}
+ * @private
+ */
+vjs.Component.prototype.options_;
+
+/**
+ * Deep merge of options objects
+ * Whenever a property is an object on both options objects
+ * the two properties will be merged using vjs.obj.deepMerge.
+ *
+ * This is used for merging options for child components. We
+ * want it to be easy to override individual options on a child
+ * component without having to rewrite all the other default options.
+ *
+ * Parent.prototype.options_ = {
+ * children: {
+ * 'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },
+ * 'childTwo': {},
+ * 'childThree': {}
+ * }
+ * }
+ * newOptions = {
+ * children: {
+ * 'childOne': { 'foo': 'baz', 'abc': '123' }
+ * 'childTwo': null,
+ * 'childFour': {}
+ * }
+ * }
+ *
+ * this.options(newOptions);
+ *
+ * RESULT
+ *
+ * {
+ * children: {
+ * 'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },
+ * 'childTwo': null, // Disabled. Won't be initialized.
+ * 'childThree': {},
+ * 'childFour': {}
+ * }
+ * }
+ *
+ * @param {Object} obj Object whose values will be overwritten
+ * @return {Object} NEW merged object. Does not return obj1.
+ */
+vjs.Component.prototype.options = function(obj){
+ if (obj === undefined) return this.options_;
+
+ return this.options_ = vjs.obj.deepMerge(this.options_, obj);
+};
+
+/**
+ * The DOM element for the component.
+ * @type {Element}
+ * @private
+ */
+vjs.Component.prototype.el_;
+
+/**
+ * Create the component's DOM element.
+ * @param {String=} tagName Element's node type. e.g. 'div'
+ * @param {Object=} attributes An object of element attributes that should be set on the element.
+ * @return {Element}
+ */
+vjs.Component.prototype.createEl = function(tagName, attributes){
+ return vjs.createEl(tagName, attributes);
+};
+
+/**
+ * Return the component's DOM element.
+ * @return {Element}
+ */
+vjs.Component.prototype.el = function(){
+ return this.el_;
+};
+
+/**
+ * An optional element where, if defined, children will be inserted
+ * instead of directly in el_
+ * @type {Element}
+ * @private
+ */
+vjs.Component.prototype.contentEl_;
+
+/**
+ * Return the component's DOM element for embedding content.
+ * will either be el_ or a new element defined in createEl
+ * @return {Element}
+ */
+vjs.Component.prototype.contentEl = function(){
+ return this.contentEl_ || this.el_;
+};
+
+/**
+ * The ID for the component.
+ * @type {String}
+ * @private
+ */
+vjs.Component.prototype.id_;
+
+/**
+ * Return the component's ID.
+ * @return {String}
+ */
+vjs.Component.prototype.id = function(){
+ return this.id_;
+};
+
+/**
+ * The name for the component. Often used to reference the component.
+ * @type {String}
+ * @private
+ */
+vjs.Component.prototype.name_;
+
+/**
+ * Return the component's ID.
+ * @return {String}
+ */
+vjs.Component.prototype.name = function(){
+ return this.name_;
+};
+
+/**
+ * Array of child components
+ * @type {Array}
+ * @private
+ */
+vjs.Component.prototype.children_;
+
+/**
+ * Returns array of all child components.
+ * @return {Array}
+ */
+vjs.Component.prototype.children = function(){
+ return this.children_;
+};
+
+/**
+ * Object of child components by ID
+ * @type {Object}
+ * @private
+ */
+vjs.Component.prototype.childIndex_;
+
+/**
+ * Returns a child component with the provided ID.
+ * @return {Array}
+ */
+vjs.Component.prototype.getChildById = function(id){
+ return this.childIndex_[id];
+};
+
+/**
+ * Object of child components by Name
+ * @type {Object}
+ * @private
+ */
+vjs.Component.prototype.childNameIndex_;
+
+/**
+ * Returns a child component with the provided ID.
+ * @return {Array}
+ */
+vjs.Component.prototype.getChild = function(name){
+ return this.childNameIndex_[name];
+};
+
+/**
+ * Adds a child component inside this component.
+ * @param {String|vjs.Component} child The class name or instance of a child to add.
+ * @param {Object=} options Optional options, including options to be passed to
+ * children of the child.
+ * @return {vjs.Component} The child component, because it might be created in this process.
+ * @suppress {accessControls|checkRegExp|checkTypes|checkVars|const|constantProperty|deprecated|duplicate|es5Strict|fileoverviewTags|globalThis|invalidCasts|missingProperties|nonStandardJsDocs|strictModuleDepCheck|undefinedNames|undefinedVars|unknownDefines|uselessCode|visibility}
+ */
+vjs.Component.prototype.addChild = function(child, options){
+ var component, componentClass, componentName, componentId;
+
+ // If string, create new component with options
+ if (typeof child === 'string') {
+
+ componentName = child;
+
+ // Make sure options is at least an empty object to protect against errors
+ options = options || {};
+
+ // Assume name of set is a lowercased name of the UI Class (PlayButton, etc.)
+ componentClass = options['componentClass'] || vjs.capitalize(componentName);
+
+ // Set name through options
+ options['name'] = componentName;
+
+ // Create a new object & element for this controls set
+ // If there's no .player_, this is a player
+ // Closure Compiler throws an 'incomplete alias' warning if we use the vjs variable directly.
+ // Every class should be exported, so this should never be a problem here.
+ component = new window['videojs'][componentClass](this.player_ || this, options);
+
+ // child is a component instance
+ } else {
+ component = child;
+ }
+
+ this.children_.push(component);
+
+ if (typeof component.id === 'function') {
+ this.childIndex_[component.id()] = component;
+ }
+
+ // If a name wasn't used to create the component, check if we can use the
+ // name function of the component
+ componentName = componentName || (component.name && component.name());
+
+ if (componentName) {
+ this.childNameIndex_[componentName] = component;
+ }
+
+ // Add the UI object's element to the container div (box)
+ // Having an element is not required
+ if (typeof component['el'] === 'function' && component['el']()) {
+ this.contentEl().appendChild(component['el']());
+ }
+
+ // Return so it can stored on parent object if desired.
+ return component;
+};
+
+vjs.Component.prototype.removeChild = function(component){
+ if (typeof component === 'string') {
+ component = this.getChild(component);
+ }
+
+ if (!component || !this.children_) return;
+
+ var childFound = false;
+ for (var i = this.children_.length - 1; i >= 0; i--) {
+ if (this.children_[i] === component) {
+ childFound = true;
+ this.children_.splice(i,1);
+ break;
+ }
+ }
+
+ if (!childFound) return;
+
+ this.childIndex_[component.id] = null;
+ this.childNameIndex_[component.name] = null;
+
+ var compEl = component.el();
+ if (compEl && compEl.parentNode === this.contentEl()) {
+ this.contentEl().removeChild(component.el());
+ }
+};
+
+/**
+ * Initialize default child components from options
+ */
+vjs.Component.prototype.initChildren = function(){
+ var options = this.options_;
+
+ if (options && options['children']) {
+ var self = this;
+
+ // Loop through components and add them to the player
+ vjs.obj.each(options['children'], function(name, opts){
+ // Allow for disabling default components
+ // e.g. vjs.options['children']['posterImage'] = false
+ if (opts === false) return;
+
+ // Allow waiting to add components until a specific event is called
+ var tempAdd = function(){
+ // Set property name on player. Could cause conflicts with other prop names, but it's worth making refs easy.
+ self[name] = self.addChild(name, opts);
+ };
+
+ if (opts['loadEvent']) {
+ // this.one(opts.loadEvent, tempAdd)
+ } else {
+ tempAdd();
+ }
+ });
+ }
+};
+
+vjs.Component.prototype.buildCSSClass = function(){
+ // Child classes can include a function that does:
+ // return 'CLASS NAME' + this._super();
+ return '';
+};
+
+/* Events
+============================================================================= */
+
+/**
+ * Add an event listener to this component's element. Context will be the component.
+ * @param {String} type Event type e.g. 'click'
+ * @param {Function} fn Event listener
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.on = function(type, fn){
+ vjs.on(this.el_, type, vjs.bind(this, fn));
+ return this;
+};
+
+/**
+ * Remove an event listener from the component's element
+ * @param {String=} type Optional event type. Without type it will remove all listeners.
+ * @param {Function=} fn Optional event listener. Without fn it will remove all listeners for a type.
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.off = function(type, fn){
+ vjs.off(this.el_, type, fn);
+ return this;
+};
+
+/**
+ * Add an event listener to be triggered only once and then removed
+ * @param {String} type Event type
+ * @param {Function} fn Event listener
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.one = function(type, fn) {
+ vjs.one(this.el_, type, vjs.bind(this, fn));
+ return this;
+};
+
+/**
+ * Trigger an event on an element
+ * @param {String} type Event type to trigger
+ * @param {Event|Object} event Event object to be passed to the listener
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.trigger = function(type, event){
+ vjs.trigger(this.el_, type, event);
+ return this;
+};
+
+/* Ready
+================================================================================ */
+/**
+ * Is the component loaded.
+ * @type {Boolean}
+ * @private
+ */
+vjs.Component.prototype.isReady_;
+
+/**
+ * Trigger ready as soon as initialization is finished.
+ * Allows for delaying ready. Override on a sub class prototype.
+ * If you set this.isReadyOnInitFinish_ it will affect all components.
+ * Specially used when waiting for the Flash player to asynchrnously load.
+ * @type {Boolean}
+ * @private
+ */
+vjs.Component.prototype.isReadyOnInitFinish_ = true;
+
+/**
+ * List of ready listeners
+ * @type {Array}
+ * @private
+ */
+vjs.Component.prototype.readyQueue_;
+
+/**
+ * Bind a listener to the component's ready state.
+ * Different from event listeners in that if the ready event has already happend
+ * it will trigger the function immediately.
+ * @param {Function} fn Ready listener
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.ready = function(fn){
+ if (fn) {
+ if (this.isReady_) {
+ fn.call(this);
+ } else {
+ if (this.readyQueue_ === undefined) {
+ this.readyQueue_ = [];
+ }
+ this.readyQueue_.push(fn);
+ }
+ }
+ return this;
+};
+
+/**
+ * Trigger the ready listeners
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.triggerReady = function(){
+ this.isReady_ = true;
+
+ var readyQueue = this.readyQueue_;
+
+ if (readyQueue && readyQueue.length > 0) {
+
+ for (var i = 0, j = readyQueue.length; i < j; i++) {
+ readyQueue[i].call(this);
+ }
+
+ // Reset Ready Queue
+ this.readyQueue_ = [];
+
+ // Allow for using event listeners also, in case you want to do something everytime a source is ready.
+ this.trigger('ready');
+ }
+};
+
+/* Display
+============================================================================= */
+
+/**
+ * Add a CSS class name to the component's element
+ * @param {String} classToAdd Classname to add
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.addClass = function(classToAdd){
+ vjs.addClass(this.el_, classToAdd);
+ return this;
+};
+
+/**
+ * Remove a CSS class name from the component's element
+ * @param {String} classToRemove Classname to remove
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.removeClass = function(classToRemove){
+ vjs.removeClass(this.el_, classToRemove);
+ return this;
+};
+
+/**
+ * Show the component element if hidden
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.show = function(){
+ this.el_.style.display = 'block';
+ return this;
+};
+
+/**
+ * Hide the component element if hidden
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.hide = function(){
+ this.el_.style.display = 'none';
+ return this;
+};
+
+/**
+ * Lock an item in its visible state. To be used with fadeIn/fadeOut.
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.lockShowing = function(){
+ this.addClass('vjs-lock-showing');
+ return this;
+};
+
+/**
+ * Unlock an item to be hidden. To be used with fadeIn/fadeOut.
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.unlockShowing = function(){
+ this.removeClass('vjs-lock-showing');
+ return this;
+};
+
+/**
+ * Disable component by making it unshowable
+ */
+vjs.Component.prototype.disable = function(){
+ this.hide();
+ this.show = function(){};
+};
+
+/**
+ * If a value is provided it will change the width of the player to that value
+ * otherwise the width is returned
+ * http://dev.w3.org/html5/spec/dimension-attributes.html#attr-dim-height
+ * Video tag width/height only work in pixels. No percents.
+ * But allowing limited percents use. e.g. width() will return number+%, not computed width
+ * @param {Number|String=} num Optional width number
+ * @param {[type]} skipListeners Skip the 'resize' event trigger
+ * @return {vjs.Component|Number|String} Returns 'this' if dimension was set.
+ * Otherwise it returns the dimension.
+ */
+vjs.Component.prototype.width = function(num, skipListeners){
+ return this.dimension('width', num, skipListeners);
+};
+
+/**
+ * Get or set the height of the player
+ * @param {Number|String=} num Optional new player height
+ * @param {Boolean=} skipListeners Optional skip resize event trigger
+ * @return {vjs.Component|Number|String} The player, or the dimension
+ */
+vjs.Component.prototype.height = function(num, skipListeners){
+ return this.dimension('height', num, skipListeners);
+};
+
+/**
+ * Set both width and height at the same time.
+ * @param {Number|String} width
+ * @param {Number|String} height
+ * @return {vjs.Component} The player.
+ */
+vjs.Component.prototype.dimensions = function(width, height){
+ // Skip resize listeners on width for optimization
+ return this.width(width, true).height(height);
+};
+
+/**
+ * Get or set width or height.
+ * All for an integer, integer + 'px' or integer + '%';
+ * Known issue: hidden elements. Hidden elements officially have a width of 0.
+ * So we're defaulting to the style.width value and falling back to computedStyle
+ * which has the hidden element issue.
+ * Info, but probably not an efficient fix:
+ * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/
+ * @param {String=} widthOrHeight 'width' or 'height'
+ * @param {Number|String=} num New dimension
+ * @param {Boolean=} skipListeners Skip resize event trigger
+ * @return {vjs.Component|Number|String} Return the player if setting a dimension.
+ * Otherwise it returns the dimension.
+ */
+vjs.Component.prototype.dimension = function(widthOrHeight, num, skipListeners){
+ if (num !== undefined) {
+
+ // Check if using css width/height (% or px) and adjust
+ if ((''+num).indexOf('%') !== -1 || (''+num).indexOf('px') !== -1) {
+ this.el_.style[widthOrHeight] = num;
+ } else if (num === 'auto') {
+ this.el_.style[widthOrHeight] = '';
+ } else {
+ this.el_.style[widthOrHeight] = num+'px';
+ }
+
+ // skipListeners allows us to avoid triggering the resize event when setting both width and height
+ if (!skipListeners) { this.trigger('resize'); }
+
+ // Return component
+ return this;
+ }
+
+ // Not setting a value, so getting it
+ // Make sure element exists
+ if (!this.el_) return 0;
+
+ // Get dimension value from style
+ var val = this.el_.style[widthOrHeight];
+ var pxIndex = val.indexOf('px');
+ if (pxIndex !== -1) {
+ // Return the pixel value with no 'px'
+ return parseInt(val.slice(0,pxIndex), 10);
+
+ // No px so using % or no style was set, so falling back to offsetWidth/height
+ // If component has display:none, offset will return 0
+ // TODO: handle display:none and no dimension style using px
+ } else {
+
+ return parseInt(this.el_['offset'+vjs.capitalize(widthOrHeight)], 10);
+
+ // ComputedStyle version.
+ // Only difference is if the element is hidden it will return
+ // the percent value (e.g. '100%'')
+ // instead of zero like offsetWidth returns.
+ // var val = vjs.getComputedStyleValue(this.el_, widthOrHeight);
+ // var pxIndex = val.indexOf('px');
+
+ // if (pxIndex !== -1) {
+ // return val.slice(0, pxIndex);
+ // } else {
+ // return val;
+ // }
+ }
+};
+
+/**
+ * Emit 'tap' events when touch events are supported. We're requireing them to
+ * be enabled because otherwise every component would have this extra overhead
+ * unnecessarily, on mobile devices where extra overhead is especially bad.
+ *
+ * This is being implemented so we can support taps on the video element
+ * toggling the controls.
+ */
+vjs.Component.prototype.emitTapEvents = function(){
+ var touchStart, touchTime, couldBeTap, noTap;
+
+ // Track the start time so we can determine how long the touch lasted
+ touchStart = 0;
+
+ this.on('touchstart', function(event) {
+ // Record start time so we can detect a tap vs. "touch and hold"
+ touchStart = new Date().getTime();
+ // Reset couldBeTap tracking
+ couldBeTap = true;
+ });
+
+ noTap = function(){
+ couldBeTap = false;
+ };
+ // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s
+ this.on('touchmove', noTap);
+ this.on('touchleave', noTap);
+ this.on('touchcancel', noTap);
+
+ // When the touch ends, measure how long it took and trigger the appropriate
+ // event
+ this.on('touchend', function() {
+ // Proceed only if the touchmove/leave/cancel event didn't happen
+ if (couldBeTap === true) {
+ // Measure how long the touch lasted
+ touchTime = new Date().getTime() - touchStart;
+ // The touch needs to be quick in order to consider it a tap
+ if (touchTime < 250) {
+ this.trigger('tap');
+ // It may be good to copy the touchend event object and change the
+ // type to tap, if the other event properties aren't exact after
+ // vjs.fixEvent runs (e.g. event.target)
+ }
+ }
+ });
+};
+/* Button - Base class for all buttons
+================================================================================ */
+/**
+ * Base class for all buttons
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.Button = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+
+ var touchstart = false;
+ this.on('touchstart', function(event) {
+ // Stop click and other mouse events from triggering also
+ event.preventDefault();
+ touchstart = true;
+ });
+ this.on('touchmove', function() {
+ touchstart = false;
+ });
+ var self = this;
+ this.on('touchend', function(event) {
+ if (touchstart) {
+ self.onClick(event);
+ }
+ event.preventDefault();
+ });
+
+ this.on('click', this.onClick);
+ this.on('focus', this.onFocus);
+ this.on('blur', this.onBlur);
+ }
+});
+
+vjs.Button.prototype.createEl = function(type, props){
+ // Add standard Aria and Tabindex info
+ props = vjs.obj.merge({
+ className: this.buildCSSClass(),
+ innerHTML: '<div class="vjs-control-content"><span class="vjs-control-text">' + (this.buttonText || 'Need Text') + '</span></div>',
+ role: 'button',
+ 'aria-live': 'polite', // let the screen reader user know that the text of the button may change
+ tabIndex: 0
+ }, props);
+
+ return vjs.Component.prototype.createEl.call(this, type, props);
+};
+
+vjs.Button.prototype.buildCSSClass = function(){
+ // TODO: Change vjs-control to vjs-button?
+ return 'vjs-control ' + vjs.Component.prototype.buildCSSClass.call(this);
+};
+
+ // Click - Override with specific functionality for button
+vjs.Button.prototype.onClick = function(){};
+
+ // Focus - Add keyboard functionality to element
+vjs.Button.prototype.onFocus = function(){
+ vjs.on(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+
+ // KeyPress (document level) - Trigger click when keys are pressed
+vjs.Button.prototype.onKeyPress = function(event){
+ // Check for space bar (32) or enter (13) keys
+ if (event.which == 32 || event.which == 13) {
+ event.preventDefault();
+ this.onClick();
+ }
+};
+
+// Blur - Remove keyboard triggers
+vjs.Button.prototype.onBlur = function(){
+ vjs.off(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+/* Slider
+================================================================================ */
+/**
+ * Parent for seek bar and volume slider
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.Slider = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+
+ // Set property names to bar and handle to match with the child Slider class is looking for
+ this.bar = this.getChild(this.options_['barName']);
+ this.handle = this.getChild(this.options_['handleName']);
+
+ player.on(this.playerEvent, vjs.bind(this, this.update));
+
+ this.on('mousedown', this.onMouseDown);
+ this.on('touchstart', this.onMouseDown);
+ this.on('focus', this.onFocus);
+ this.on('blur', this.onBlur);
+ this.on('click', this.onClick);
+
+ this.player_.on('controlsvisible', vjs.bind(this, this.update));
+
+ // This is actually to fix the volume handle position. http://twitter.com/#!/gerritvanaaken/status/159046254519787520
+ // this.player_.one('timeupdate', vjs.bind(this, this.update));
+
+ player.ready(vjs.bind(this, this.update));
+
+ this.boundEvents = {};
+ }
+});
+
+vjs.Slider.prototype.createEl = function(type, props) {
+ props = props || {};
+ // Add the slider element class to all sub classes
+ props.className = props.className + ' vjs-slider';
+ props = vjs.obj.merge({
+ role: 'slider',
+ 'aria-valuenow': 0,
+ 'aria-valuemin': 0,
+ 'aria-valuemax': 100,
+ tabIndex: 0
+ }, props);
+
+ return vjs.Component.prototype.createEl.call(this, type, props);
+};
+
+vjs.Slider.prototype.onMouseDown = function(event){
+ event.preventDefault();
+ vjs.blockTextSelection();
+
+ this.boundEvents.move = vjs.bind(this, this.onMouseMove);
+ this.boundEvents.end = vjs.bind(this, this.onMouseUp);
+
+ vjs.on(document, 'mousemove', this.boundEvents.move);
+ vjs.on(document, 'mouseup', this.boundEvents.end);
+ vjs.on(document, 'touchmove', this.boundEvents.move);
+ vjs.on(document, 'touchend', this.boundEvents.end);
+
+ this.onMouseMove(event);
+};
+
+vjs.Slider.prototype.onMouseUp = function() {
+ vjs.unblockTextSelection();
+ vjs.off(document, 'mousemove', this.boundEvents.move, false);
+ vjs.off(document, 'mouseup', this.boundEvents.end, false);
+ vjs.off(document, 'touchmove', this.boundEvents.move, false);
+ vjs.off(document, 'touchend', this.boundEvents.end, false);
+
+ this.update();
+};
+
+vjs.Slider.prototype.update = function(){
+ // In VolumeBar init we have a setTimeout for update that pops and update to the end of the
+ // execution stack. The player is destroyed before then update will cause an error
+ if (!this.el_) return;
+
+ // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.
+ // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.
+ // var progress = (this.player_.scrubbing) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();
+
+ var barProgress,
+ progress = this.getPercent(),
+ handle = this.handle,
+ bar = this.bar;
+
+ // Protect against no duration and other division issues
+ if (isNaN(progress)) { progress = 0; }
+
+ barProgress = progress;
+
+ // If there is a handle, we need to account for the handle in our calculation for progress bar
+ // so that it doesn't fall short of or extend past the handle.
+ if (handle) {
+
+ var box = this.el_,
+ boxWidth = box.offsetWidth,
+
+ handleWidth = handle.el().offsetWidth,
+
+ // The width of the handle in percent of the containing box
+ // In IE, widths may not be ready yet causing NaN
+ handlePercent = (handleWidth) ? handleWidth / boxWidth : 0,
+
+ // Get the adjusted size of the box, considering that the handle's center never touches the left or right side.
+ // There is a margin of half the handle's width on both sides.
+ boxAdjustedPercent = 1 - handlePercent,
+
+ // Adjust the progress that we'll use to set widths to the new adjusted box width
+ adjustedProgress = progress * boxAdjustedPercent;
+
+ // The bar does reach the left side, so we need to account for this in the bar's width
+ barProgress = adjustedProgress + (handlePercent / 2);
+
+ // Move the handle from the left based on the adjected progress
+ handle.el().style.left = vjs.round(adjustedProgress * 100, 2) + '%';
+ }
+
+ // Set the new bar width
+ bar.el().style.width = vjs.round(barProgress * 100, 2) + '%';
+};
+
+vjs.Slider.prototype.calculateDistance = function(event){
+ var el, box, boxX, boxY, boxW, boxH, handle, pageX, pageY;
+
+ el = this.el_;
+ box = vjs.findPosition(el);
+ boxW = boxH = el.offsetWidth;
+ handle = this.handle;
+
+ if (this.options_.vertical) {
+ boxY = box.top;
+
+ if (event.changedTouches) {
+ pageY = event.changedTouches[0].pageY;
+ } else {
+ pageY = event.pageY;
+ }
+
+ if (handle) {
+ var handleH = handle.el().offsetHeight;
+ // Adjusted X and Width, so handle doesn't go outside the bar
+ boxY = boxY + (handleH / 2);
+ boxH = boxH - handleH;
+ }
+
+ // Percent that the click is through the adjusted area
+ return Math.max(0, Math.min(1, ((boxY - pageY) + boxH) / boxH));
+
+ } else {
+ boxX = box.left;
+
+ if (event.changedTouches) {
+ pageX = event.changedTouches[0].pageX;
+ } else {
+ pageX = event.pageX;
+ }
+
+ if (handle) {
+ var handleW = handle.el().offsetWidth;
+
+ // Adjusted X and Width, so handle doesn't go outside the bar
+ boxX = boxX + (handleW / 2);
+ boxW = boxW - handleW;
+ }
+
+ // Percent that the click is through the adjusted area
+ return Math.max(0, Math.min(1, (pageX - boxX) / boxW));
+ }
+};
+
+vjs.Slider.prototype.onFocus = function(){
+ vjs.on(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+
+vjs.Slider.prototype.onKeyPress = function(event){
+ if (event.which == 37) { // Left Arrow
+ event.preventDefault();
+ this.stepBack();
+ } else if (event.which == 39) { // Right Arrow
+ event.preventDefault();
+ this.stepForward();
+ }
+};
+
+vjs.Slider.prototype.onBlur = function(){
+ vjs.off(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+
+/**
+ * Listener for click events on slider, used to prevent clicks
+ * from bubbling up to parent elements like button menus.
+ * @param {Object} event Event object
+ */
+vjs.Slider.prototype.onClick = function(event){
+ event.stopImmediatePropagation();
+ event.preventDefault();
+};
+
+/**
+ * SeekBar Behavior includes play progress bar, and seek handle
+ * Needed so it can determine seek position based on handle position/size
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.SliderHandle = vjs.Component.extend();
+
+/**
+ * Default value of the slider
+ * @type {Number}
+ */
+vjs.SliderHandle.prototype.defaultValue = 0;
+
+/** @inheritDoc */
+vjs.SliderHandle.prototype.createEl = function(type, props) {
+ props = props || {};
+ // Add the slider element class to all sub classes
+ props.className = props.className + ' vjs-slider-handle';
+ props = vjs.obj.merge({
+ innerHTML: '<span class="vjs-control-text">'+this.defaultValue+'</span>'
+ }, props);
+
+ return vjs.Component.prototype.createEl.call(this, 'div', props);
+};
+/* Menu
+================================================================================ */
+/**
+ * The base for text track and settings menu buttons.
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.Menu = vjs.Component.extend();
+
+/**
+ * Add a menu item to the menu
+ * @param {Object|String} component Component or component type to add
+ */
+vjs.Menu.prototype.addItem = function(component){
+ this.addChild(component);
+ component.on('click', vjs.bind(this, function(){
+ this.unlockShowing();
+ }));
+};
+
+/** @inheritDoc */
+vjs.Menu.prototype.createEl = function(){
+ var contentElType = this.options().contentElType || 'ul';
+ this.contentEl_ = vjs.createEl(contentElType, {
+ className: 'vjs-menu-content'
+ });
+ var el = vjs.Component.prototype.createEl.call(this, 'div', {
+ append: this.contentEl_,
+ className: 'vjs-menu'
+ });
+ el.appendChild(this.contentEl_);
+
+ // Prevent clicks from bubbling up. Needed for Menu Buttons,
+ // where a click on the parent is significant
+ vjs.on(el, 'click', function(event){
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ });
+
+ return el;
+};
+
+/**
+ * Menu item
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.MenuItem = vjs.Button.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Button.call(this, player, options);
+ this.selected(options['selected']);
+ }
+});
+
+/** @inheritDoc */
+vjs.MenuItem.prototype.createEl = function(type, props){
+ return vjs.Button.prototype.createEl.call(this, 'li', vjs.obj.merge({
+ className: 'vjs-menu-item',
+ innerHTML: this.options_['label']
+ }, props));
+};
+
+/** @inheritDoc */
+vjs.MenuItem.prototype.onClick = function(){
+ this.selected(true);
+};
+
+/**
+ * Set this menu item as selected or not
+ * @param {Boolean} selected
+ */
+vjs.MenuItem.prototype.selected = function(selected){
+ if (selected) {
+ this.addClass('vjs-selected');
+ this.el_.setAttribute('aria-selected',true);
+ } else {
+ this.removeClass('vjs-selected');
+ this.el_.setAttribute('aria-selected',false);
+ }
+};
+
+
+/**
+ * A button class with a popup menu
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.MenuButton = vjs.Button.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Button.call(this, player, options);
+
+ this.menu = this.createMenu();
+
+ // Add list to element
+ this.addChild(this.menu);
+
+ // Automatically hide empty menu buttons
+ if (this.items && this.items.length === 0) {
+ this.hide();
+ }
+
+ this.on('keyup', this.onKeyPress);
+ this.el_.setAttribute('aria-haspopup', true);
+ this.el_.setAttribute('role', 'button');
+ }
+});
+
+/**
+ * Track the state of the menu button
+ * @type {Boolean}
+ */
+vjs.MenuButton.prototype.buttonPressed_ = false;
+
+vjs.MenuButton.prototype.createMenu = function(){
+ var menu = new vjs.Menu(this.player_);
+
+ // Add a title list item to the top
+ if (this.options().title) {
+ menu.el().appendChild(vjs.createEl('li', {
+ className: 'vjs-menu-title',
+ innerHTML: vjs.capitalize(this.kind_),
+ tabindex: -1
+ }));
+ }
+
+ this.items = this['createItems']();
+
+ if (this.items) {
+ // Add menu items to the menu
+ for (var i = 0; i < this.items.length; i++) {
+ menu.addItem(this.items[i]);
+ }
+ }
+
+ return menu;
+};
+
+/**
+ * Create the list of menu items. Specific to each subclass.
+ */
+vjs.MenuButton.prototype.createItems = function(){};
+
+/** @inheritDoc */
+vjs.MenuButton.prototype.buildCSSClass = function(){
+ return this.className + ' vjs-menu-button ' + vjs.Button.prototype.buildCSSClass.call(this);
+};
+
+// Focus - Add keyboard functionality to element
+// This function is not needed anymore. Instead, the keyboard functionality is handled by
+// treating the button as triggering a submenu. When the button is pressed, the submenu
+// appears. Pressing the button again makes the submenu disappear.
+vjs.MenuButton.prototype.onFocus = function(){};
+// Can't turn off list display that we turned on with focus, because list would go away.
+vjs.MenuButton.prototype.onBlur = function(){};
+
+vjs.MenuButton.prototype.onClick = function(){
+ // When you click the button it adds focus, which will show the menu indefinitely.
+ // So we'll remove focus when the mouse leaves the button.
+ // Focus is needed for tab navigation.
+ this.one('mouseout', vjs.bind(this, function(){
+ this.menu.unlockShowing();
+ this.el_.blur();
+ }));
+ if (this.buttonPressed_){
+ this.unpressButton();
+ } else {
+ this.pressButton();
+ }
+};
+
+vjs.MenuButton.prototype.onKeyPress = function(event){
+ event.preventDefault();
+
+ // Check for space bar (32) or enter (13) keys
+ if (event.which == 32 || event.which == 13) {
+ if (this.buttonPressed_){
+ this.unpressButton();
+ } else {
+ this.pressButton();
+ }
+ // Check for escape (27) key
+ } else if (event.which == 27){
+ if (this.buttonPressed_){
+ this.unpressButton();
+ }
+ }
+};
+
+vjs.MenuButton.prototype.pressButton = function(){
+ this.buttonPressed_ = true;
+ this.menu.lockShowing();
+ this.el_.setAttribute('aria-pressed', true);
+ if (this.items && this.items.length > 0) {
+ this.items[0].el().focus(); // set the focus to the title of the submenu
+ }
+};
+
+vjs.MenuButton.prototype.unpressButton = function(){
+ this.buttonPressed_ = false;
+ this.menu.unlockShowing();
+ this.el_.setAttribute('aria-pressed', false);
+};
+
+/**
+ * Main player class. A player instance is returned by _V_(id);
+ * @param {Element} tag The original video tag used for configuring options
+ * @param {Object=} options Player options
+ * @param {Function=} ready Ready callback function
+ * @constructor
+ */
+vjs.Player = vjs.Component.extend({
+ /** @constructor */
+ init: function(tag, options, ready){
+ this.tag = tag; // Store the original tag used to set options
+
+ // Set Options
+ // The options argument overrides options set in the video tag
+ // which overrides globally set options.
+ // This latter part coincides with the load order
+ // (tag must exist before Player)
+ options = vjs.obj.merge(this.getTagSettings(tag), options);
+
+ // Cache for video property values.
+ this.cache_ = {};
+
+ // Set poster
+ this.poster_ = options['poster'];
+ // Set controls
+ this.controls_ = options['controls'];
+ // Original tag settings stored in options
+ // now remove immediately so native controls don't flash.
+ // May be turned back on by HTML5 tech if nativeControlsForTouch is true
+ tag.controls = false;
+
+ // Run base component initializing with new options.
+ // Builds the element through createEl()
+ // Inits and embeds any child components in opts
+ vjs.Component.call(this, this, options, ready);
+
+ // Update controls className. Can't do this when the controls are initially
+ // set because the element doesn't exist yet.
+ if (this.controls()) {
+ this.addClass('vjs-controls-enabled');
+ } else {
+ this.addClass('vjs-controls-disabled');
+ }
+
+ // TODO: Make this smarter. Toggle user state between touching/mousing
+ // using events, since devices can have both touch and mouse events.
+ // if (vjs.TOUCH_ENABLED) {
+ // this.addClass('vjs-touch-enabled');
+ // }
+
+ // Firstplay event implimentation. Not sold on the event yet.
+ // Could probably just check currentTime==0?
+ this.one('play', function(e){
+ var fpEvent = { type: 'firstplay', target: this.el_ };
+ // Using vjs.trigger so we can check if default was prevented
+ var keepGoing = vjs.trigger(this.el_, fpEvent);
+
+ if (!keepGoing) {
+ e.preventDefault();
+ e.stopPropagation();
+ e.stopImmediatePropagation();
+ }
+ });
+
+ this.on('ended', this.onEnded);
+ this.on('play', this.onPlay);
+ this.on('firstplay', this.onFirstPlay);
+ this.on('pause', this.onPause);
+ this.on('progress', this.onProgress);
+ this.on('durationchange', this.onDurationChange);
+ this.on('error', this.onError);
+ this.on('fullscreenchange', this.onFullscreenChange);
+
+ // Make player easily findable by ID
+ vjs.players[this.id_] = this;
+
+ if (options['plugins']) {
+ vjs.obj.each(options['plugins'], function(key, val){
+ this[key](val);
+ }, this);
+ }
+
+ this.listenForUserActivity();
+ }
+});
+
+/**
+ * Player instance options, surfaced using vjs.options
+ * vjs.options = vjs.Player.prototype.options_
+ * Make changes in vjs.options, not here.
+ * All options should use string keys so they avoid
+ * renaming by closure compiler
+ * @type {Object}
+ * @private
+ */
+vjs.Player.prototype.options_ = vjs.options;
+
+vjs.Player.prototype.dispose = function(){
+ this.trigger('dispose');
+ // prevent dispose from being called twice
+ this.off('dispose');
+
+ // Kill reference to this player
+ vjs.players[this.id_] = null;
+ if (this.tag && this.tag['player']) { this.tag['player'] = null; }
+ if (this.el_ && this.el_['player']) { this.el_['player'] = null; }
+
+ // Ensure that tracking progress and time progress will stop and plater deleted
+ this.stopTrackingProgress();
+ this.stopTrackingCurrentTime();
+
+ if (this.tech) { this.tech.dispose(); }
+
+ // Component dispose
+ vjs.Component.prototype.dispose.call(this);
+};
+
+vjs.Player.prototype.getTagSettings = function(tag){
+ var options = {
+ 'sources': [],
+ 'tracks': []
+ };
+
+ vjs.obj.merge(options, vjs.getAttributeValues(tag));
+
+ // Get tag children settings
+ if (tag.hasChildNodes()) {
+ var children, child, childName, i, j;
+
+ children = tag.childNodes;
+
+ for (i=0,j=children.length; i<j; i++) {
+ child = children[i];
+ // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/
+ childName = child.nodeName.toLowerCase();
+ if (childName === 'source') {
+ options['sources'].push(vjs.getAttributeValues(child));
+ } else if (childName === 'track') {
+ options['tracks'].push(vjs.getAttributeValues(child));
+ }
+ }
+ }
+
+ return options;
+};
+
+vjs.Player.prototype.createEl = function(){
+ var el = this.el_ = vjs.Component.prototype.createEl.call(this, 'div');
+ var tag = this.tag;
+
+ // Remove width/height attrs from tag so CSS can make it 100% width/height
+ tag.removeAttribute('width');
+ tag.removeAttribute('height');
+ // Empty video tag sources and tracks so the built-in player doesn't use them also.
+ // This may not be fast enough to stop HTML5 browsers from reading the tags
+ // so we'll need to turn off any default tracks if we're manually doing
+ // captions and subtitles. videoElement.textTracks
+ if (tag.hasChildNodes()) {
+ var nodes, nodesLength, i, node, nodeName, removeNodes;
+
+ nodes = tag.childNodes;
+ nodesLength = nodes.length;
+ removeNodes = [];
+
+ while (nodesLength--) {
+ node = nodes[nodesLength];
+ nodeName = node.nodeName.toLowerCase();
+ if (nodeName === 'source' || nodeName === 'track') {
+ removeNodes.push(node);
+ }
+ }
+
+ for (i=0; i<removeNodes.length; i++) {
+ tag.removeChild(removeNodes[i]);
+ }
+ }
+
+ // Make sure tag ID exists
+ tag.id = tag.id || 'vjs_video_' + vjs.guid++;
+
+ // Give video tag ID and class to player div
+ // ID will now reference player box, not the video tag
+ el.id = tag.id;
+ el.className = tag.className;
+
+ // Update tag id/class for use as HTML5 playback tech
+ // Might think we should do this after embedding in container so .vjs-tech class
+ // doesn't flash 100% width/height, but class only applies with .video-js parent
+ tag.id += '_html5_api';
+ tag.className = 'vjs-tech';
+
+ // Make player findable on elements
+ tag['player'] = el['player'] = this;
+ // Default state of video is paused
+ this.addClass('vjs-paused');
+
+ // Make box use width/height of tag, or rely on default implementation
+ // Enforce with CSS since width/height attrs don't work on divs
+ this.width(this.options_['width'], true); // (true) Skip resize listener on load
+ this.height(this.options_['height'], true);
+
+ // Wrap video tag in div (el/box) container
+ if (tag.parentNode) {
+ tag.parentNode.insertBefore(el, tag);
+ }
+ vjs.insertFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.
+
+ return el;
+};
+
+// /* Media Technology (tech)
+// ================================================================================ */
+// Load/Create an instance of playback technlogy including element and API methods
+// And append playback element in player div.
+vjs.Player.prototype.loadTech = function(techName, source){
+
+ // Pause and remove current playback technology
+ if (this.tech) {
+ this.unloadTech();
+
+ // If the first time loading, HTML5 tag will exist but won't be initialized
+ // So we need to remove it if we're not loading HTML5
+ } else if (techName !== 'Html5' && this.tag) {
+ this.el_.removeChild(this.tag);
+ this.tag['player'] = null;
+ this.tag = null;
+ }
+
+ this.techName = techName;
+
+ // Turn off API access because we're loading a new tech that might load asynchronously
+ this.isReady_ = false;
+
+ var techReady = function(){
+ this.player_.triggerReady();
+
+ // Manually track progress in cases where the browser/flash player doesn't report it.
+ if (!this.features['progressEvents']) {
+ this.player_.manualProgressOn();
+ }
+
+ // Manually track timeudpates in cases where the browser/flash player doesn't report it.
+ if (!this.features['timeupdateEvents']) {
+ this.player_.manualTimeUpdatesOn();
+ }
+ };
+
+ // Grab tech-specific options from player options and add source and parent element to use.
+ var techOptions = vjs.obj.merge({ 'source': source, 'parentEl': this.el_ }, this.options_[techName.toLowerCase()]);
+
+ if (source) {
+ if (source.src == this.cache_.src && this.cache_.currentTime > 0) {
+ techOptions['startTime'] = this.cache_.currentTime;
+ }
+
+ this.cache_.src = source.src;
+ }
+
+ // Initialize tech instance
+ this.tech = new window['videojs'][techName](this, techOptions);
+
+ this.tech.ready(techReady);
+};
+
+vjs.Player.prototype.unloadTech = function(){
+ this.isReady_ = false;
+ this.tech.dispose();
+
+ // Turn off any manual progress or timeupdate tracking
+ if (this.manualProgress) { this.manualProgressOff(); }
+
+ if (this.manualTimeUpdates) { this.manualTimeUpdatesOff(); }
+
+ this.tech = false;
+};
+
+// There's many issues around changing the size of a Flash (or other plugin) object.
+// First is a plugin reload issue in Firefox that has been around for 11 years: https://bugzilla.mozilla.org/show_bug.cgi?id=90268
+// Then with the new fullscreen API, Mozilla and webkit browsers will reload the flash object after going to fullscreen.
+// To get around this, we're unloading the tech, caching source and currentTime values, and reloading the tech once the plugin is resized.
+// reloadTech: function(betweenFn){
+// vjs.log('unloadingTech')
+// this.unloadTech();
+// vjs.log('unloadedTech')
+// if (betweenFn) { betweenFn.call(); }
+// vjs.log('LoadingTech')
+// this.loadTech(this.techName, { src: this.cache_.src })
+// vjs.log('loadedTech')
+// },
+
+/* Fallbacks for unsupported event types
+================================================================================ */
+// Manually trigger progress events based on changes to the buffered amount
+// Many flash players and older HTML5 browsers don't send progress or progress-like events
+vjs.Player.prototype.manualProgressOn = function(){
+ this.manualProgress = true;
+
+ // Trigger progress watching when a source begins loading
+ this.trackProgress();
+
+ // Watch for a native progress event call on the tech element
+ // In HTML5, some older versions don't support the progress event
+ // So we're assuming they don't, and turning off manual progress if they do.
+ // As opposed to doing user agent detection
+ this.tech.one('progress', function(){
+
+ // Update known progress support for this playback technology
+ this.features['progressEvents'] = true;
+
+ // Turn off manual progress tracking
+ this.player_.manualProgressOff();
+ });
+};
+
+vjs.Player.prototype.manualProgressOff = function(){
+ this.manualProgress = false;
+ this.stopTrackingProgress();
+};
+
+vjs.Player.prototype.trackProgress = function(){
+
+ this.progressInterval = setInterval(vjs.bind(this, function(){
+ // Don't trigger unless buffered amount is greater than last time
+ // log(this.cache_.bufferEnd, this.buffered().end(0), this.duration())
+ /* TODO: update for multiple buffered regions */
+ if (this.cache_.bufferEnd < this.buffered().end(0)) {
+ this.trigger('progress');
+ } else if (this.bufferedPercent() == 1) {
+ this.stopTrackingProgress();
+ this.trigger('progress'); // Last update
+ }
+ }), 500);
+};
+vjs.Player.prototype.stopTrackingProgress = function(){ clearInterval(this.progressInterval); };
+
+/* Time Tracking -------------------------------------------------------------- */
+vjs.Player.prototype.manualTimeUpdatesOn = function(){
+ this.manualTimeUpdates = true;
+
+ this.on('play', this.trackCurrentTime);
+ this.on('pause', this.stopTrackingCurrentTime);
+ // timeupdate is also called by .currentTime whenever current time is set
+
+ // Watch for native timeupdate event
+ this.tech.one('timeupdate', function(){
+ // Update known progress support for this playback technology
+ this.features['timeupdateEvents'] = true;
+ // Turn off manual progress tracking
+ this.player_.manualTimeUpdatesOff();
+ });
+};
+
+vjs.Player.prototype.manualTimeUpdatesOff = function(){
+ this.manualTimeUpdates = false;
+ this.stopTrackingCurrentTime();
+ this.off('play', this.trackCurrentTime);
+ this.off('pause', this.stopTrackingCurrentTime);
+};
+
+vjs.Player.prototype.trackCurrentTime = function(){
+ if (this.currentTimeInterval) { this.stopTrackingCurrentTime(); }
+ this.currentTimeInterval = setInterval(vjs.bind(this, function(){
+ this.trigger('timeupdate');
+ }), 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15
+};
+
+// Turn off play progress tracking (when paused or dragging)
+vjs.Player.prototype.stopTrackingCurrentTime = function(){ clearInterval(this.currentTimeInterval); };
+
+// /* Player event handlers (how the player reacts to certain events)
+// ================================================================================ */
+vjs.Player.prototype.onEnded = function(){
+ if (this.options_['loop']) {
+ this.currentTime(0);
+ this.play();
+ }
+};
+
+vjs.Player.prototype.onPlay = function(){
+ vjs.removeClass(this.el_, 'vjs-paused');
+ vjs.addClass(this.el_, 'vjs-playing');
+};
+
+vjs.Player.prototype.onFirstPlay = function(){
+ //If the first starttime attribute is specified
+ //then we will start at the given offset in seconds
+ if(this.options_['starttime']){
+ this.currentTime(this.options_['starttime']);
+ }
+
+ this.addClass('vjs-has-started');
+};
+
+vjs.Player.prototype.onPause = function(){
+ vjs.removeClass(this.el_, 'vjs-playing');
+ vjs.addClass(this.el_, 'vjs-paused');
+};
+
+vjs.Player.prototype.onProgress = function(){
+ // Add custom event for when source is finished downloading.
+ if (this.bufferedPercent() == 1) {
+ this.trigger('loadedalldata');
+ }
+};
+
+// Update duration with durationchange event
+// Allows for cacheing value instead of asking player each time.
+vjs.Player.prototype.onDurationChange = function(){
+ this.duration(this.techGet('duration'));
+};
+
+vjs.Player.prototype.onError = function(e) {
+ vjs.log('Video Error', e);
+};
+
+vjs.Player.prototype.onFullscreenChange = function() {
+ if (this.isFullScreen) {
+ this.addClass('vjs-fullscreen');
+ } else {
+ this.removeClass('vjs-fullscreen');
+ }
+};
+
+// /* Player API
+// ================================================================================ */
+
+/**
+ * Object for cached values.
+ * @private
+ */
+vjs.Player.prototype.cache_;
+
+vjs.Player.prototype.getCache = function(){
+ return this.cache_;
+};
+
+// Pass values to the playback tech
+vjs.Player.prototype.techCall = function(method, arg){
+ // If it's not ready yet, call method when it is
+ if (this.tech && !this.tech.isReady_) {
+ this.tech.ready(function(){
+ this[method](arg);
+ });
+
+ // Otherwise call method now
+ } else {
+ try {
+ this.tech[method](arg);
+ } catch(e) {
+ vjs.log(e);
+ throw e;
+ }
+ }
+};
+
+// Get calls can't wait for the tech, and sometimes don't need to.
+vjs.Player.prototype.techGet = function(method){
+
+ if (this.tech && this.tech.isReady_) {
+
+ // Flash likes to die and reload when you hide or reposition it.
+ // In these cases the object methods go away and we get errors.
+ // When that happens we'll catch the errors and inform tech that it's not ready any more.
+ try {
+ return this.tech[method]();
+ } catch(e) {
+ // When building additional tech libs, an expected method may not be defined yet
+ if (this.tech[method] === undefined) {
+ vjs.log('Video.js: ' + method + ' method not defined for '+this.techName+' playback technology.', e);
+ } else {
+ // When a method isn't available on the object it throws a TypeError
+ if (e.name == 'TypeError') {
+ vjs.log('Video.js: ' + method + ' unavailable on '+this.techName+' playback technology element.', e);
+ this.tech.isReady_ = false;
+ } else {
+ vjs.log(e);
+ }
+ }
+ throw e;
+ }
+ }
+
+ return;
+};
+
+/**
+ * Start media playback
+ * http://dev.w3.org/html5/spec/video.html#dom-media-play
+ * We're triggering the 'play' event here instead of relying on the
+ * media element to allow using event.preventDefault() to stop
+ * play from happening if desired. Usecase: preroll ads.
+ */
+vjs.Player.prototype.play = function(){
+ this.techCall('play');
+ return this;
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-pause
+vjs.Player.prototype.pause = function(){
+ this.techCall('pause');
+ return this;
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-paused
+// The initial state of paused should be true (in Safari it's actually false)
+vjs.Player.prototype.paused = function(){
+ return (this.techGet('paused') === false) ? false : true;
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-currenttime
+vjs.Player.prototype.currentTime = function(seconds){
+ if (seconds !== undefined) {
+
+ // Cache the last set value for smoother scrubbing.
+ this.cache_.lastSetCurrentTime = seconds;
+
+ this.techCall('setCurrentTime', seconds);
+
+ // Improve the accuracy of manual timeupdates
+ if (this.manualTimeUpdates) { this.trigger('timeupdate'); }
+
+ return this;
+ }
+
+ // Cache last currentTime and return
+ // Default to 0 seconds
+ return this.cache_.currentTime = (this.techGet('currentTime') || 0);
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-duration
+// Duration should return NaN if not available. ParseFloat will turn false-ish values to NaN.
+vjs.Player.prototype.duration = function(seconds){
+ if (seconds !== undefined) {
+
+ // Cache the last set value for optimiized scrubbing (esp. Flash)
+ this.cache_.duration = parseFloat(seconds);
+
+ return this;
+ }
+
+ return this.cache_.duration;
+};
+
+// Calculates how much time is left. Not in spec, but useful.
+vjs.Player.prototype.remainingTime = function(){
+ return this.duration() - this.currentTime();
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-buffered
+// Buffered returns a timerange object.
+// Kind of like an array of portions of the video that have been downloaded.
+// So far no browsers return more than one range (portion)
+vjs.Player.prototype.buffered = function(){
+ var buffered = this.techGet('buffered'),
+ start = 0,
+ buflast = buffered.length - 1,
+ // Default end to 0 and store in values
+ end = this.cache_.bufferEnd = this.cache_.bufferEnd || 0;
+
+ if (buffered && buflast >= 0 && buffered.end(buflast) !== end) {
+ end = buffered.end(buflast);
+ // Storing values allows them be overridden by setBufferedFromProgress
+ this.cache_.bufferEnd = end;
+ }
+
+ return vjs.createTimeRange(start, end);
+};
+
+// Calculates amount of buffer is full. Not in spec but useful.
+vjs.Player.prototype.bufferedPercent = function(){
+ return (this.duration()) ? this.buffered().end(0) / this.duration() : 0;
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-volume
+vjs.Player.prototype.volume = function(percentAsDecimal){
+ var vol;
+
+ if (percentAsDecimal !== undefined) {
+ vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1
+ this.cache_.volume = vol;
+ this.techCall('setVolume', vol);
+ vjs.setLocalStorage('volume', vol);
+ return this;
+ }
+
+ // Default to 1 when returning current volume.
+ vol = parseFloat(this.techGet('volume'));
+ return (isNaN(vol)) ? 1 : vol;
+};
+
+// http://dev.w3.org/html5/spec/video.html#attr-media-muted
+vjs.Player.prototype.muted = function(muted){
+ if (muted !== undefined) {
+ this.techCall('setMuted', muted);
+ return this;
+ }
+ return this.techGet('muted') || false; // Default to false
+};
+
+// Check if current tech can support native fullscreen (e.g. with built in controls lik iOS, so not our flash swf)
+vjs.Player.prototype.supportsFullScreen = function(){ return this.techGet('supportsFullScreen') || false; };
+
+// Turn on fullscreen (or window) mode
+vjs.Player.prototype.requestFullScreen = function(){
+ var requestFullScreen = vjs.support.requestFullScreen;
+ this.isFullScreen = true;
+
+ if (requestFullScreen) {
+ // the browser supports going fullscreen at the element level so we can
+ // take the controls fullscreen as well as the video
+
+ // Trigger fullscreenchange event after change
+ // We have to specifically add this each time, and remove
+ // when cancelling fullscreen. Otherwise if there's multiple
+ // players on a page, they would all be reacting to the same fullscreen
+ // events
+ vjs.on(document, requestFullScreen.eventName, vjs.bind(this, function(e){
+ this.isFullScreen = document[requestFullScreen.isFullScreen];
+
+ // If cancelling fullscreen, remove event listener.
+ if (this.isFullScreen === false) {
+ vjs.off(document, requestFullScreen.eventName, arguments.callee);
+ }
+
+ this.trigger('fullscreenchange');
+ }));
+
+ this.el_[requestFullScreen.requestFn]();
+
+ } else if (this.tech.supportsFullScreen()) {
+ // we can't take the video.js controls fullscreen but we can go fullscreen
+ // with native controls
+ this.techCall('enterFullScreen');
+ } else {
+ // fullscreen isn't supported so we'll just stretch the video element to
+ // fill the viewport
+ this.enterFullWindow();
+ this.trigger('fullscreenchange');
+ }
+
+ return this;
+};
+
+vjs.Player.prototype.cancelFullScreen = function(){
+ var requestFullScreen = vjs.support.requestFullScreen;
+ this.isFullScreen = false;
+
+ // Check for browser element fullscreen support
+ if (requestFullScreen) {
+ document[requestFullScreen.cancelFn]();
+ } else if (this.tech.supportsFullScreen()) {
+ this.techCall('exitFullScreen');
+ } else {
+ this.exitFullWindow();
+ this.trigger('fullscreenchange');
+ }
+
+ return this;
+};
+
+// When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.
+vjs.Player.prototype.enterFullWindow = function(){
+ this.isFullWindow = true;
+
+ // Storing original doc overflow value to return to when fullscreen is off
+ this.docOrigOverflow = document.documentElement.style.overflow;
+
+ // Add listener for esc key to exit fullscreen
+ vjs.on(document, 'keydown', vjs.bind(this, this.fullWindowOnEscKey));
+
+ // Hide any scroll bars
+ document.documentElement.style.overflow = 'hidden';
+
+ // Apply fullscreen styles
+ vjs.addClass(document.body, 'vjs-full-window');
+
+ this.trigger('enterFullWindow');
+};
+vjs.Player.prototype.fullWindowOnEscKey = function(event){
+ if (event.keyCode === 27) {
+ if (this.isFullScreen === true) {
+ this.cancelFullScreen();
+ } else {
+ this.exitFullWindow();
+ }
+ }
+};
+
+vjs.Player.prototype.exitFullWindow = function(){
+ this.isFullWindow = false;
+ vjs.off(document, 'keydown', this.fullWindowOnEscKey);
+
+ // Unhide scroll bars.
+ document.documentElement.style.overflow = this.docOrigOverflow;
+
+ // Remove fullscreen styles
+ vjs.removeClass(document.body, 'vjs-full-window');
+
+ // Resize the box, controller, and poster to original sizes
+ // this.positionAll();
+ this.trigger('exitFullWindow');
+};
+
+vjs.Player.prototype.selectSource = function(sources){
+
+ // Loop through each playback technology in the options order
+ for (var i=0,j=this.options_['techOrder'];i<j.length;i++) {
+ var techName = vjs.capitalize(j[i]),
+ tech = window['videojs'][techName];
+
+ // Check if the browser supports this technology
+ if (tech.isSupported()) {
+ // Loop through each source object
+ for (var a=0,b=sources;a<b.length;a++) {
+ var source = b[a];
+
+ // Check if source can be played with this technology
+ if (tech['canPlaySource'](source)) {
+ return { source: source, tech: techName };
+ }
+ }
+ }
+ }
+
+ return false;
+};
+
+// src is a pretty powerful function
+// If you pass it an array of source objects, it will find the best source to play and use that object.src
+// If the new source requires a new playback technology, it will switch to that.
+// If you pass it an object, it will set the source to object.src
+// If you pass it anything else (url string) it will set the video source to that
+vjs.Player.prototype.src = function(source){
+ // Case: Array of source objects to choose from and pick the best to play
+ if (source instanceof Array) {
+
+ var sourceTech = this.selectSource(source),
+ techName;
+
+ if (sourceTech) {
+ source = sourceTech.source;
+ techName = sourceTech.tech;
+
+ // If this technology is already loaded, set source
+ if (techName == this.techName) {
+ this.src(source); // Passing the source object
+ // Otherwise load this technology with chosen source
+ } else {
+ this.loadTech(techName, source);
+ }
+ } else {
+ this.el_.appendChild(vjs.createEl('p', {
+ innerHTML: this.options()['notSupportedMessage']
+ }));
+ }
+
+ // Case: Source object { src: '', type: '' ... }
+ } else if (source instanceof Object) {
+
+ if (window['videojs'][this.techName]['canPlaySource'](source)) {
+ this.src(source.src);
+ } else {
+ // Send through tech loop to check for a compatible technology.
+ this.src([source]);
+ }
+
+ // Case: URL String (http://myvideo...)
+ } else {
+ // Cache for getting last set source
+ this.cache_.src = source;
+
+ if (!this.isReady_) {
+ this.ready(function(){
+ this.src(source);
+ });
+ } else {
+ this.techCall('src', source);
+ if (this.options_['preload'] == 'auto') {
+ this.load();
+ }
+ if (this.options_['autoplay']) {
+ this.play();
+ }
+ }
+ }
+ return this;
+};
+
+// Begin loading the src data
+// http://dev.w3.org/html5/spec/video.html#dom-media-load
+vjs.Player.prototype.load = function(){
+ this.techCall('load');
+ return this;
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-currentsrc
+vjs.Player.prototype.currentSrc = function(){
+ return this.techGet('currentSrc') || this.cache_.src || '';
+};
+
+// Attributes/Options
+vjs.Player.prototype.preload = function(value){
+ if (value !== undefined) {
+ this.techCall('setPreload', value);
+ this.options_['preload'] = value;
+ return this;
+ }
+ return this.techGet('preload');
+};
+vjs.Player.prototype.autoplay = function(value){
+ if (value !== undefined) {
+ this.techCall('setAutoplay', value);
+ this.options_['autoplay'] = value;
+ return this;
+ }
+ return this.techGet('autoplay', value);
+};
+vjs.Player.prototype.loop = function(value){
+ if (value !== undefined) {
+ this.techCall('setLoop', value);
+ this.options_['loop'] = value;
+ return this;
+ }
+ return this.techGet('loop');
+};
+
+/**
+ * The url of the poster image source.
+ * @type {String}
+ * @private
+ */
+vjs.Player.prototype.poster_;
+
+/**
+ * Get or set the poster image source url.
+ * @param {String} src Poster image source URL
+ * @return {String} Poster image source URL or null
+ */
+vjs.Player.prototype.poster = function(src){
+ if (src !== undefined) {
+ this.poster_ = src;
+ }
+ return this.poster_;
+};
+
+/**
+ * Whether or not the controls are showing
+ * @type {Boolean}
+ * @private
+ */
+vjs.Player.prototype.controls_;
+
+/**
+ * Get or set whether or not the controls are showing.
+ * @param {Boolean} controls Set controls to showing or not
+ * @return {Boolean} Controls are showing
+ */
+vjs.Player.prototype.controls = function(bool){
+ if (bool !== undefined) {
+ bool = !!bool; // force boolean
+ // Don't trigger a change event unless it actually changed
+ if (this.controls_ !== bool) {
+ this.controls_ = bool;
+ if (bool) {
+ this.removeClass('vjs-controls-disabled');
+ this.addClass('vjs-controls-enabled');
+ this.trigger('controlsenabled');
+ } else {
+ this.removeClass('vjs-controls-enabled');
+ this.addClass('vjs-controls-disabled');
+ this.trigger('controlsdisabled');
+ }
+ }
+ return this;
+ }
+ return this.controls_;
+};
+
+vjs.Player.prototype.usingNativeControls_;
+
+/**
+ * Toggle native controls on/off. Native controls are the controls built into
+ * devices (e.g. default iPhone controls), Flash, or other techs
+ * (e.g. Vimeo Controls)
+ *
+ * **This should only be set by the current tech, because only the tech knows
+ * if it can support native controls**
+ *
+ * @param {Boolean} bool True signals that native controls are on
+ * @return {vjs.Player} Returns the player
+ */
+vjs.Player.prototype.usingNativeControls = function(bool){
+ if (bool !== undefined) {
+ bool = !!bool; // force boolean
+ // Don't trigger a change event unless it actually changed
+ if (this.usingNativeControls_ !== bool) {
+ this.usingNativeControls_ = bool;
+ if (bool) {
+ this.addClass('vjs-using-native-controls');
+ this.trigger('usingnativecontrols');
+ } else {
+ this.removeClass('vjs-using-native-controls');
+ this.trigger('usingcustomcontrols');
+ }
+ }
+ return this;
+ }
+ return this.usingNativeControls_;
+};
+
+vjs.Player.prototype.error = function(){ return this.techGet('error'); };
+vjs.Player.prototype.ended = function(){ return this.techGet('ended'); };
+vjs.Player.prototype.seeking = function(){ return this.techGet('seeking'); };
+
+// When the player is first initialized, trigger activity so components
+// like the control bar show themselves if needed
+vjs.Player.prototype.userActivity_ = true;
+vjs.Player.prototype.reportUserActivity = function(event){
+ this.userActivity_ = true;
+};
+
+vjs.Player.prototype.userActive_ = true;
+vjs.Player.prototype.userActive = function(bool){
+ if (bool !== undefined) {
+ bool = !!bool;
+ if (bool !== this.userActive_) {
+ this.userActive_ = bool;
+ if (bool) {
+ // If the user was inactive and is now active we want to reset the
+ // inactivity timer
+ this.userActivity_ = true;
+ this.removeClass('vjs-user-inactive');
+ this.addClass('vjs-user-active');
+ this.trigger('useractive');
+ } else {
+ // We're switching the state to inactive manually, so erase any other
+ // activity
+ this.userActivity_ = false;
+
+ // Chrome/Safari/IE have bugs where when you change the cursor it can
+ // trigger a mousemove event. This causes an issue when you're hiding
+ // the cursor when the user is inactive, and a mousemove signals user
+ // activity. Making it impossible to go into inactive mode. Specifically
+ // this happens in fullscreen when we really need to hide the cursor.
+ //
+ // When this gets resolved in ALL browsers it can be removed
+ // https://code.google.com/p/chromium/issues/detail?id=103041
+ this.tech.one('mousemove', function(e){
+ e.stopPropagation();
+ e.preventDefault();
+ });
+ this.removeClass('vjs-user-active');
+ this.addClass('vjs-user-inactive');
+ this.trigger('userinactive');
+ }
+ }
+ return this;
+ }
+ return this.userActive_;
+};
+
+vjs.Player.prototype.listenForUserActivity = function(){
+ var onMouseActivity, onMouseDown, mouseInProgress, onMouseUp,
+ activityCheck, inactivityTimeout;
+
+ onMouseActivity = this.reportUserActivity;
+
+ onMouseDown = function() {
+ onMouseActivity();
+ // For as long as the they are touching the device or have their mouse down,
+ // we consider them active even if they're not moving their finger or mouse.
+ // So we want to continue to update that they are active
+ clearInterval(mouseInProgress);
+ // Setting userActivity=true now and setting the interval to the same time
+ // as the activityCheck interval (250) should ensure we never miss the
+ // next activityCheck
+ mouseInProgress = setInterval(vjs.bind(this, onMouseActivity), 250);
+ };
+
+ onMouseUp = function(event) {
+ onMouseActivity();
+ // Stop the interval that maintains activity if the mouse/touch is down
+ clearInterval(mouseInProgress);
+ };
+
+ // Any mouse movement will be considered user activity
+ this.on('mousedown', onMouseDown);
+ this.on('mousemove', onMouseActivity);
+ this.on('mouseup', onMouseUp);
+
+ // Listen for keyboard navigation
+ // Shouldn't need to use inProgress interval because of key repeat
+ this.on('keydown', onMouseActivity);
+ this.on('keyup', onMouseActivity);
+
+ // Consider any touch events that bubble up to be activity
+ // Certain touches on the tech will be blocked from bubbling because they
+ // toggle controls
+ this.on('touchstart', onMouseDown);
+ this.on('touchmove', onMouseActivity);
+ this.on('touchend', onMouseUp);
+ this.on('touchcancel', onMouseUp);
+
+ // Run an interval every 250 milliseconds instead of stuffing everything into
+ // the mousemove/touchmove function itself, to prevent performance degradation.
+ // `this.reportUserActivity` simply sets this.userActivity_ to true, which
+ // then gets picked up by this loop
+ // http://ejohn.org/blog/learning-from-twitter/
+ activityCheck = setInterval(vjs.bind(this, function() {
+ // Check to see if mouse/touch activity has happened
+ if (this.userActivity_) {
+ // Reset the activity tracker
+ this.userActivity_ = false;
+
+ // If the user state was inactive, set the state to active
+ this.userActive(true);
+
+ // Clear any existing inactivity timeout to start the timer over
+ clearTimeout(inactivityTimeout);
+
+ // In X seconds, if no more activity has occurred the user will be
+ // considered inactive
+ inactivityTimeout = setTimeout(vjs.bind(this, function() {
+ // Protect against the case where the inactivityTimeout can trigger just
+ // before the next user activity is picked up by the activityCheck loop
+ // causing a flicker
+ if (!this.userActivity_) {
+ this.userActive(false);
+ }
+ }), 2000);
+ }
+ }), 250);
+
+ // Clean up the intervals when we kill the player
+ this.on('dispose', function(){
+ clearInterval(activityCheck);
+ clearTimeout(inactivityTimeout);
+ });
+};
+
+// Methods to add support for
+// networkState: function(){ return this.techCall('networkState'); },
+// readyState: function(){ return this.techCall('readyState'); },
+// seeking: function(){ return this.techCall('seeking'); },
+// initialTime: function(){ return this.techCall('initialTime'); },
+// startOffsetTime: function(){ return this.techCall('startOffsetTime'); },
+// played: function(){ return this.techCall('played'); },
+// seekable: function(){ return this.techCall('seekable'); },
+// videoTracks: function(){ return this.techCall('videoTracks'); },
+// audioTracks: function(){ return this.techCall('audioTracks'); },
+// videoWidth: function(){ return this.techCall('videoWidth'); },
+// videoHeight: function(){ return this.techCall('videoHeight'); },
+// defaultPlaybackRate: function(){ return this.techCall('defaultPlaybackRate'); },
+// playbackRate: function(){ return this.techCall('playbackRate'); },
+// mediaGroup: function(){ return this.techCall('mediaGroup'); },
+// controller: function(){ return this.techCall('controller'); },
+// defaultMuted: function(){ return this.techCall('defaultMuted'); }
+
+// TODO
+// currentSrcList: the array of sources including other formats and bitrates
+// playList: array of source lists in order of playback
+
+// RequestFullscreen API
+(function(){
+ var prefix, requestFS, div;
+
+ div = document.createElement('div');
+
+ requestFS = {};
+
+ // Current W3C Spec
+ // http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#api
+ // Mozilla Draft: https://wiki.mozilla.org/Gecko:FullScreenAPI#fullscreenchange_event
+ // New: https://dvcs.w3.org/hg/fullscreen/raw-file/529a67b8d9f3/Overview.html
+ if (div.cancelFullscreen !== undefined) {
+ requestFS.requestFn = 'requestFullscreen';
+ requestFS.cancelFn = 'exitFullscreen';
+ requestFS.eventName = 'fullscreenchange';
+ requestFS.isFullScreen = 'fullScreen';
+
+ // Webkit (Chrome/Safari) and Mozilla (Firefox) have working implementations
+ // that use prefixes and vary slightly from the new W3C spec. Specifically,
+ // using 'exit' instead of 'cancel', and lowercasing the 'S' in Fullscreen.
+ // Other browsers don't have any hints of which version they might follow yet,
+ // so not going to try to predict by looping through all prefixes.
+ } else {
+
+ if (document.mozCancelFullScreen) {
+ prefix = 'moz';
+ requestFS.isFullScreen = prefix + 'FullScreen';
+ } else {
+ prefix = 'webkit';
+ requestFS.isFullScreen = prefix + 'IsFullScreen';
+ }
+
+ if (div[prefix + 'RequestFullScreen']) {
+ requestFS.requestFn = prefix + 'RequestFullScreen';
+ requestFS.cancelFn = prefix + 'CancelFullScreen';
+ }
+ requestFS.eventName = prefix + 'fullscreenchange';
+ }
+
+ if (document[requestFS.cancelFn]) {
+ vjs.support.requestFullScreen = requestFS;
+ }
+
+})();
+
+
+/**
+ * Container of main controls
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.ControlBar = vjs.Component.extend();
+
+vjs.ControlBar.prototype.options_ = {
+ loadEvent: 'play',
+ children: {
+ 'playToggle': {},
+ 'currentTimeDisplay': {},
+ 'timeDivider': {},
+ 'durationDisplay': {},
+ 'remainingTimeDisplay': {},
+ 'progressControl': {},
+ 'fullscreenToggle': {},
+ 'volumeControl': {},
+ 'muteToggle': {}
+ // 'volumeMenuButton': {}
+ }
+};
+
+vjs.ControlBar.prototype.createEl = function(){
+ return vjs.createEl('div', {
+ className: 'vjs-control-bar'
+ });
+};
+/**
+ * Button to toggle between play and pause
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.PlayToggle = vjs.Button.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Button.call(this, player, options);
+
+ player.on('play', vjs.bind(this, this.onPlay));
+ player.on('pause', vjs.bind(this, this.onPause));
+ }
+});
+
+vjs.PlayToggle.prototype.buttonText = 'Play';
+
+vjs.PlayToggle.prototype.buildCSSClass = function(){
+ return 'vjs-play-control ' + vjs.Button.prototype.buildCSSClass.call(this);
+};
+
+ // OnClick - Toggle between play and pause
+vjs.PlayToggle.prototype.onClick = function(){
+ if (this.player_.paused()) {
+ this.player_.play();
+ } else {
+ this.player_.pause();
+ }
+};
+
+ // OnPlay - Add the vjs-playing class to the element so it can change appearance
+vjs.PlayToggle.prototype.onPlay = function(){
+ vjs.removeClass(this.el_, 'vjs-paused');
+ vjs.addClass(this.el_, 'vjs-playing');
+ this.el_.children[0].children[0].innerHTML = 'Pause'; // change the button text to "Pause"
+};
+
+ // OnPause - Add the vjs-paused class to the element so it can change appearance
+vjs.PlayToggle.prototype.onPause = function(){
+ vjs.removeClass(this.el_, 'vjs-playing');
+ vjs.addClass(this.el_, 'vjs-paused');
+ this.el_.children[0].children[0].innerHTML = 'Play'; // change the button text to "Play"
+};/**
+ * Displays the current time
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.CurrentTimeDisplay = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+
+ player.on('timeupdate', vjs.bind(this, this.updateContent));
+ }
+});
+
+vjs.CurrentTimeDisplay.prototype.createEl = function(){
+ var el = vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-current-time vjs-time-controls vjs-control'
+ });
+
+ this.content = vjs.createEl('div', {
+ className: 'vjs-current-time-display',
+ innerHTML: '<span class="vjs-control-text">Current Time </span>' + '0:00', // label the current time for screen reader users
+ 'aria-live': 'off' // tell screen readers not to automatically read the time as it changes
+ });
+
+ el.appendChild(vjs.createEl('div').appendChild(this.content));
+ return el;
+};
+
+vjs.CurrentTimeDisplay.prototype.updateContent = function(){
+ // Allows for smooth scrubbing, when player can't keep up.
+ var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();
+ this.content.innerHTML = '<span class="vjs-control-text">Current Time </span>' + vjs.formatTime(time, this.player_.duration());
+};
+
+/**
+ * Displays the duration
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.DurationDisplay = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+
+ player.on('timeupdate', vjs.bind(this, this.updateContent)); // this might need to be changes to 'durationchange' instead of 'timeupdate' eventually, however the durationchange event fires before this.player_.duration() is set, so the value cannot be written out using this method. Once the order of durationchange and this.player_.duration() being set is figured out, this can be updated.
+ }
+});
+
+vjs.DurationDisplay.prototype.createEl = function(){
+ var el = vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-duration vjs-time-controls vjs-control'
+ });
+
+ this.content = vjs.createEl('div', {
+ className: 'vjs-duration-display',
+ innerHTML: '<span class="vjs-control-text">Duration Time </span>' + '0:00', // label the duration time for screen reader users
+ 'aria-live': 'off' // tell screen readers not to automatically read the time as it changes
+ });
+
+ el.appendChild(vjs.createEl('div').appendChild(this.content));
+ return el;
+};
+
+vjs.DurationDisplay.prototype.updateContent = function(){
+ var duration = this.player_.duration();
+ if (duration) {
+ this.content.innerHTML = '<span class="vjs-control-text">Duration Time </span>' + vjs.formatTime(duration); // label the duration time for screen reader users
+ }
+};
+
+/**
+ * Time Separator (Not used in main skin, but still available, and could be used as a 'spare element')
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.TimeDivider = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+ }
+});
+
+vjs.TimeDivider.prototype.createEl = function(){
+ return vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-time-divider',
+ innerHTML: '<div><span>/</span></div>'
+ });
+};
+
+/**
+ * Displays the time left in the video
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.RemainingTimeDisplay = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+
+ player.on('timeupdate', vjs.bind(this, this.updateContent));
+ }
+});
+
+vjs.RemainingTimeDisplay.prototype.createEl = function(){
+ var el = vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-remaining-time vjs-time-controls vjs-control'
+ });
+
+ this.content = vjs.createEl('div', {
+ className: 'vjs-remaining-time-display',
+ innerHTML: '<span class="vjs-control-text">Remaining Time </span>' + '-0:00', // label the remaining time for screen reader users
+ 'aria-live': 'off' // tell screen readers not to automatically read the time as it changes
+ });
+
+ el.appendChild(vjs.createEl('div').appendChild(this.content));
+ return el;
+};
+
+vjs.RemainingTimeDisplay.prototype.updateContent = function(){
+ if (this.player_.duration()) {
+ this.content.innerHTML = '<span class="vjs-control-text">Remaining Time </span>' + '-'+ vjs.formatTime(this.player_.remainingTime());
+ }
+
+ // Allows for smooth scrubbing, when player can't keep up.
+ // var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();
+ // this.content.innerHTML = vjs.formatTime(time, this.player_.duration());
+};
+/**
+ * Toggle fullscreen video
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.FullscreenToggle = vjs.Button.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Button.call(this, player, options);
+ }
+});
+
+vjs.FullscreenToggle.prototype.buttonText = 'Fullscreen';
+
+vjs.FullscreenToggle.prototype.buildCSSClass = function(){
+ return 'vjs-fullscreen-control ' + vjs.Button.prototype.buildCSSClass.call(this);
+};
+
+vjs.FullscreenToggle.prototype.onClick = function(){
+ if (!this.player_.isFullScreen) {
+ this.player_.requestFullScreen();
+ this.el_.children[0].children[0].innerHTML = 'Non-Fullscreen'; // change the button text to "Non-Fullscreen"
+ } else {
+ this.player_.cancelFullScreen();
+ this.el_.children[0].children[0].innerHTML = 'Fullscreen'; // change the button to "Fullscreen"
+ }
+};/**
+ * Seek, Load Progress, and Play Progress
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.ProgressControl = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+ }
+});
+
+vjs.ProgressControl.prototype.options_ = {
+ children: {
+ 'seekBar': {}
+ }
+};
+
+vjs.ProgressControl.prototype.createEl = function(){
+ return vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-progress-control vjs-control'
+ });
+};
+
+/**
+ * Seek Bar and holder for the progress bars
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.SeekBar = vjs.Slider.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Slider.call(this, player, options);
+ player.on('timeupdate', vjs.bind(this, this.updateARIAAttributes));
+ player.ready(vjs.bind(this, this.updateARIAAttributes));
+ }
+});
+
+vjs.SeekBar.prototype.options_ = {
+ children: {
+ 'loadProgressBar': {},
+ 'playProgressBar': {},
+ 'seekHandle': {}
+ },
+ 'barName': 'playProgressBar',
+ 'handleName': 'seekHandle'
+};
+
+vjs.SeekBar.prototype.playerEvent = 'timeupdate';
+
+vjs.SeekBar.prototype.createEl = function(){
+ return vjs.Slider.prototype.createEl.call(this, 'div', {
+ className: 'vjs-progress-holder',
+ 'aria-label': 'video progress bar'
+ });
+};
+
+vjs.SeekBar.prototype.updateARIAAttributes = function(){
+ // Allows for smooth scrubbing, when player can't keep up.
+ var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();
+ this.el_.setAttribute('aria-valuenow',vjs.round(this.getPercent()*100, 2)); // machine readable value of progress bar (percentage complete)
+ this.el_.setAttribute('aria-valuetext',vjs.formatTime(time, this.player_.duration())); // human readable value of progress bar (time complete)
+};
+
+vjs.SeekBar.prototype.getPercent = function(){
+ var currentTime;
+ // Flash RTMP provider will not report the correct time
+ // immediately after a seek. This isn't noticeable if you're
+ // seeking while the video is playing, but it is if you seek
+ // while the video is paused.
+ if (this.player_.techName === 'Flash' && this.player_.seeking()) {
+ var cache = this.player_.getCache();
+ if (cache.lastSetCurrentTime) {
+ currentTime = cache.lastSetCurrentTime;
+ }
+ else {
+ currentTime = this.player_.currentTime();
+ }
+ }
+ else {
+ currentTime = this.player_.currentTime();
+ }
+
+ return currentTime / this.player_.duration();
+};
+
+vjs.SeekBar.prototype.onMouseDown = function(event){
+ vjs.Slider.prototype.onMouseDown.call(this, event);
+
+ this.player_.scrubbing = true;
+
+ this.videoWasPlaying = !this.player_.paused();
+ this.player_.pause();
+};
+
+vjs.SeekBar.prototype.onMouseMove = function(event){
+ var newTime = this.calculateDistance(event) * this.player_.duration();
+
+ // Don't let video end while scrubbing.
+ if (newTime == this.player_.duration()) { newTime = newTime - 0.1; }
+
+ // Set new time (tell player to seek to new time)
+ this.player_.currentTime(newTime);
+};
+
+vjs.SeekBar.prototype.onMouseUp = function(event){
+ vjs.Slider.prototype.onMouseUp.call(this, event);
+
+ this.player_.scrubbing = false;
+ if (this.videoWasPlaying) {
+ this.player_.play();
+ }
+};
+
+vjs.SeekBar.prototype.stepForward = function(){
+ this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users
+};
+
+vjs.SeekBar.prototype.stepBack = function(){
+ this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users
+};
+
+
+/**
+ * Shows load progres
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.LoadProgressBar = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+ player.on('progress', vjs.bind(this, this.update));
+ }
+});
+
+vjs.LoadProgressBar.prototype.createEl = function(){
+ return vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-load-progress',
+ innerHTML: '<span class="vjs-control-text">Loaded: 0%</span>'
+ });
+};
+
+vjs.LoadProgressBar.prototype.update = function(){
+ if (this.el_.style) { this.el_.style.width = vjs.round(this.player_.bufferedPercent() * 100, 2) + '%'; }
+};
+
+
+/**
+ * Shows play progress
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.PlayProgressBar = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+ }
+});
+
+vjs.PlayProgressBar.prototype.createEl = function(){
+ return vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-play-progress',
+ innerHTML: '<span class="vjs-control-text">Progress: 0%</span>'
+ });
+};
+
+/**
+ * SeekBar component includes play progress bar, and seek handle
+ * Needed so it can determine seek position based on handle position/size
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.SeekHandle = vjs.SliderHandle.extend();
+
+/** @inheritDoc */
+vjs.SeekHandle.prototype.defaultValue = '00:00';
+
+/** @inheritDoc */
+vjs.SeekHandle.prototype.createEl = function(){
+ return vjs.SliderHandle.prototype.createEl.call(this, 'div', {
+ className: 'vjs-seek-handle'
+ });
+};/**
+ * Control the volume
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.VolumeControl = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+
+ // hide volume controls when they're not supported by the current tech
+ if (player.tech && player.tech.features && player.tech.features['volumeControl'] === false) {
+ this.addClass('vjs-hidden');
+ }
+ player.on('loadstart', vjs.bind(this, function(){
+ if (player.tech.features && player.tech.features['volumeControl'] === false) {
+ this.addClass('vjs-hidden');
+ } else {
+ this.removeClass('vjs-hidden');
+ }
+ }));
+ }
+});
+
+vjs.VolumeControl.prototype.options_ = {
+ children: {
+ 'volumeBar': {}
+ }
+};
+
+vjs.VolumeControl.prototype.createEl = function(){
+ return vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-volume-control vjs-control'
+ });
+};
+
+/**
+ * Contains volume level
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.VolumeBar = vjs.Slider.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Slider.call(this, player, options);
+ player.on('volumechange', vjs.bind(this, this.updateARIAAttributes));
+ player.ready(vjs.bind(this, this.updateARIAAttributes));
+ setTimeout(vjs.bind(this, this.update), 0); // update when elements is in DOM
+ }
+});
+
+vjs.VolumeBar.prototype.updateARIAAttributes = function(){
+ // Current value of volume bar as a percentage
+ this.el_.setAttribute('aria-valuenow',vjs.round(this.player_.volume()*100, 2));
+ this.el_.setAttribute('aria-valuetext',vjs.round(this.player_.volume()*100, 2)+'%');
+};
+
+vjs.VolumeBar.prototype.options_ = {
+ children: {
+ 'volumeLevel': {},
+ 'volumeHandle': {}
+ },
+ 'barName': 'volumeLevel',
+ 'handleName': 'volumeHandle'
+};
+
+vjs.VolumeBar.prototype.playerEvent = 'volumechange';
+
+vjs.VolumeBar.prototype.createEl = function(){
+ return vjs.Slider.prototype.createEl.call(this, 'div', {
+ className: 'vjs-volume-bar',
+ 'aria-label': 'volume level'
+ });
+};
+
+vjs.VolumeBar.prototype.onMouseMove = function(event) {
+ this.player_.volume(this.calculateDistance(event));
+};
+
+vjs.VolumeBar.prototype.getPercent = function(){
+ if (this.player_.muted()) {
+ return 0;
+ } else {
+ return this.player_.volume();
+ }
+};
+
+vjs.VolumeBar.prototype.stepForward = function(){
+ this.player_.volume(this.player_.volume() + 0.1);
+};
+
+vjs.VolumeBar.prototype.stepBack = function(){
+ this.player_.volume(this.player_.volume() - 0.1);
+};
+
+/**
+ * Shows volume level
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.VolumeLevel = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+ }
+});
+
+vjs.VolumeLevel.prototype.createEl = function(){
+ return vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-volume-level',
+ innerHTML: '<span class="vjs-control-text"></span>'
+ });
+};
+
+/**
+ * Change volume level
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+ vjs.VolumeHandle = vjs.SliderHandle.extend();
+
+ /** @inheritDoc */
+ vjs.VolumeHandle.prototype.defaultValue = '00:00';
+
+ /** @inheritDoc */
+ vjs.VolumeHandle.prototype.createEl = function(){
+ return vjs.SliderHandle.prototype.createEl.call(this, 'div', {
+ className: 'vjs-volume-handle'
+ });
+ };
+/**
+ * Mute the audio
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.MuteToggle = vjs.Button.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Button.call(this, player, options);
+
+ player.on('volumechange', vjs.bind(this, this.update));
+
+ // hide mute toggle if the current tech doesn't support volume control
+ if (player.tech && player.tech.features && player.tech.features['volumeControl'] === false) {
+ this.addClass('vjs-hidden');
+ }
+ player.on('loadstart', vjs.bind(this, function(){
+ if (player.tech.features && player.tech.features['volumeControl'] === false) {
+ this.addClass('vjs-hidden');
+ } else {
+ this.removeClass('vjs-hidden');
+ }
+ }));
+ }
+});
+
+vjs.MuteToggle.prototype.createEl = function(){
+ return vjs.Button.prototype.createEl.call(this, 'div', {
+ className: 'vjs-mute-control vjs-control',
+ innerHTML: '<div><span class="vjs-control-text">Mute</span></div>'
+ });
+};
+
+vjs.MuteToggle.prototype.onClick = function(){
+ this.player_.muted( this.player_.muted() ? false : true );
+};
+
+vjs.MuteToggle.prototype.update = function(){
+ var vol = this.player_.volume(),
+ level = 3;
+
+ if (vol === 0 || this.player_.muted()) {
+ level = 0;
+ } else if (vol < 0.33) {
+ level = 1;
+ } else if (vol < 0.67) {
+ level = 2;
+ }
+
+ // Don't rewrite the button text if the actual text doesn't change.
+ // This causes unnecessary and confusing information for screen reader users.
+ // This check is needed because this function gets called every time the volume level is changed.
+ if(this.player_.muted()){
+ if(this.el_.children[0].children[0].innerHTML!='Unmute'){
+ this.el_.children[0].children[0].innerHTML = 'Unmute'; // change the button text to "Unmute"
+ }
+ } else {
+ if(this.el_.children[0].children[0].innerHTML!='Mute'){
+ this.el_.children[0].children[0].innerHTML = 'Mute'; // change the button text to "Mute"
+ }
+ }
+
+ /* TODO improve muted icon classes */
+ for (var i = 0; i < 4; i++) {
+ vjs.removeClass(this.el_, 'vjs-vol-'+i);
+ }
+ vjs.addClass(this.el_, 'vjs-vol-'+level);
+};
+/**
+ * Menu button with a popup for showing the volume slider.
+ * @constructor
+ */
+vjs.VolumeMenuButton = vjs.MenuButton.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.MenuButton.call(this, player, options);
+
+ // Same listeners as MuteToggle
+ player.on('volumechange', vjs.bind(this, this.update));
+
+ // hide mute toggle if the current tech doesn't support volume control
+ if (player.tech && player.tech.features && player.tech.features.volumeControl === false) {
+ this.addClass('vjs-hidden');
+ }
+ player.on('loadstart', vjs.bind(this, function(){
+ if (player.tech.features && player.tech.features.volumeControl === false) {
+ this.addClass('vjs-hidden');
+ } else {
+ this.removeClass('vjs-hidden');
+ }
+ }));
+ this.addClass('vjs-menu-button');
+ }
+});
+
+vjs.VolumeMenuButton.prototype.createMenu = function(){
+ var menu = new vjs.Menu(this.player_, {
+ contentElType: 'div'
+ });
+ var vc = new vjs.VolumeBar(this.player_, vjs.obj.merge({vertical: true}, this.options_.volumeBar));
+ menu.addChild(vc);
+ return menu;
+};
+
+vjs.VolumeMenuButton.prototype.onClick = function(){
+ vjs.MuteToggle.prototype.onClick.call(this);
+ vjs.MenuButton.prototype.onClick.call(this);
+};
+
+vjs.VolumeMenuButton.prototype.createEl = function(){
+ return vjs.Button.prototype.createEl.call(this, 'div', {
+ className: 'vjs-volume-menu-button vjs-menu-button vjs-control',
+ innerHTML: '<div><span class="vjs-control-text">Mute</span></div>'
+ });
+};
+vjs.VolumeMenuButton.prototype.update = vjs.MuteToggle.prototype.update;
+/* Poster Image
+================================================================================ */
+/**
+ * Poster image. Shows before the video plays.
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.PosterImage = vjs.Button.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Button.call(this, player, options);
+
+ if (!player.poster() || !player.controls()) {
+ this.hide();
+ }
+
+ player.on('play', vjs.bind(this, this.hide));
+ }
+});
+
+vjs.PosterImage.prototype.createEl = function(){
+ var el = vjs.createEl('div', {
+ className: 'vjs-poster',
+
+ // Don't want poster to be tabbable.
+ tabIndex: -1
+ }),
+ poster = this.player_.poster();
+
+ if (poster) {
+ if ('backgroundSize' in el.style) {
+ el.style.backgroundImage = 'url("' + poster + '")';
+ } else {
+ el.appendChild(vjs.createEl('img', { src: poster }));
+ }
+ }
+
+ return el;
+};
+
+vjs.PosterImage.prototype.onClick = function(){
+ // Only accept clicks when controls are enabled
+ if (this.player().controls()) {
+ this.player_.play();
+ }
+};
+/* Loading Spinner
+================================================================================ */
+/**
+ * Loading spinner for waiting events
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.LoadingSpinner = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+
+ player.on('canplay', vjs.bind(this, this.hide));
+ player.on('canplaythrough', vjs.bind(this, this.hide));
+ player.on('playing', vjs.bind(this, this.hide));
+ player.on('seeked', vjs.bind(this, this.hide));
+
+ player.on('seeking', vjs.bind(this, this.show));
+
+ // in some browsers seeking does not trigger the 'playing' event,
+ // so we also need to trap 'seeked' if we are going to set a
+ // 'seeking' event
+ player.on('seeked', vjs.bind(this, this.hide));
+
+ player.on('error', vjs.bind(this, this.show));
+
+ // Not showing spinner on stalled any more. Browsers may stall and then not trigger any events that would remove the spinner.
+ // Checked in Chrome 16 and Safari 5.1.2. http://help.videojs.com/discussions/problems/883-why-is-the-download-progress-showing
+ // player.on('stalled', vjs.bind(this, this.show));
+
+ player.on('waiting', vjs.bind(this, this.show));
+ }
+});
+
+vjs.LoadingSpinner.prototype.createEl = function(){
+ return vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-loading-spinner'
+ });
+};
+/* Big Play Button
+================================================================================ */
+/**
+ * Initial play button. Shows before the video has played. The hiding of the
+ * big play button is done via CSS and player states.
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.BigPlayButton = vjs.Button.extend();
+
+vjs.BigPlayButton.prototype.createEl = function(){
+ return vjs.Button.prototype.createEl.call(this, 'div', {
+ className: 'vjs-big-play-button',
+ innerHTML: '<span></span>',
+ 'aria-label': 'play video'
+ });
+};
+
+vjs.BigPlayButton.prototype.onClick = function(){
+ this.player_.play();
+};
+/**
+ * @fileoverview Media Technology Controller - Base class for media playback
+ * technology controllers like Flash and HTML5
+ */
+
+/**
+ * Base class for media (HTML5 Video, Flash) controllers
+ * @param {vjs.Player|Object} player Central player instance
+ * @param {Object=} options Options object
+ * @constructor
+ */
+vjs.MediaTechController = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options, ready){
+ vjs.Component.call(this, player, options, ready);
+
+ this.initControlsListeners();
+ }
+});
+
+/**
+ * Set up click and touch listeners for the playback element
+ * On desktops, a click on the video itself will toggle playback,
+ * on a mobile device a click on the video toggles controls.
+ * (toggling controls is done by toggling the user state between active and
+ * inactive)
+ *
+ * A tap can signal that a user has become active, or has become inactive
+ * e.g. a quick tap on an iPhone movie should reveal the controls. Another
+ * quick tap should hide them again (signaling the user is in an inactive
+ * viewing state)
+ *
+ * In addition to this, we still want the user to be considered inactive after
+ * a few seconds of inactivity.
+ *
+ * Note: the only part of iOS interaction we can't mimic with this setup
+ * is a touch and hold on the video element counting as activity in order to
+ * keep the controls showing, but that shouldn't be an issue. A touch and hold on
+ * any controls will still keep the user active
+ */
+vjs.MediaTechController.prototype.initControlsListeners = function(){
+ var player, tech, activateControls, deactivateControls;
+
+ tech = this;
+ player = this.player();
+
+ var activateControls = function(){
+ if (player.controls() && !player.usingNativeControls()) {
+ tech.addControlsListeners();
+ }
+ };
+
+ deactivateControls = vjs.bind(tech, tech.removeControlsListeners);
+
+ // Set up event listeners once the tech is ready and has an element to apply
+ // listeners to
+ this.ready(activateControls);
+ player.on('controlsenabled', activateControls);
+ player.on('controlsdisabled', deactivateControls);
+};
+
+vjs.MediaTechController.prototype.addControlsListeners = function(){
+ var preventBubble, userWasActive;
+
+ // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do
+ // trigger mousedown/up.
+ // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object
+ // Any touch events are set to block the mousedown event from happening
+ this.on('mousedown', this.onClick);
+
+ // We need to block touch events on the video element from bubbling up,
+ // otherwise they'll signal activity prematurely. The specific use case is
+ // when the video is playing and the controls have faded out. In this case
+ // only a tap (fast touch) should toggle the user active state and turn the
+ // controls back on. A touch and move or touch and hold should not trigger
+ // the controls (per iOS as an example at least)
+ //
+ // We always want to stop propagation on touchstart because touchstart
+ // at the player level starts the touchInProgress interval. We can still
+ // report activity on the other events, but won't let them bubble for
+ // consistency. We don't want to bubble a touchend without a touchstart.
+ this.on('touchstart', function(event) {
+ // Stop the mouse events from also happening
+ event.preventDefault();
+ event.stopPropagation();
+ // Record if the user was active now so we don't have to keep polling it
+ userWasActive = this.player_.userActive();
+ });
+
+ preventBubble = function(event){
+ event.stopPropagation();
+ if (userWasActive) {
+ this.player_.reportUserActivity();
+ }
+ };
+
+ // Treat all touch events the same for consistency
+ this.on('touchmove', preventBubble);
+ this.on('touchleave', preventBubble);
+ this.on('touchcancel', preventBubble);
+ this.on('touchend', preventBubble);
+
+ // Turn on component tap events
+ this.emitTapEvents();
+
+ // The tap listener needs to come after the touchend listener because the tap
+ // listener cancels out any reportedUserActivity when setting userActive(false)
+ this.on('tap', this.onTap);
+};
+
+/**
+ * Remove the listeners used for click and tap controls. This is needed for
+ * toggling to controls disabled, where a tap/touch should do nothing.
+ */
+vjs.MediaTechController.prototype.removeControlsListeners = function(){
+ // We don't want to just use `this.off()` because there might be other needed
+ // listeners added by techs that extend this.
+ this.off('tap');
+ this.off('touchstart');
+ this.off('touchmove');
+ this.off('touchleave');
+ this.off('touchcancel');
+ this.off('touchend');
+ this.off('click');
+ this.off('mousedown');
+};
+
+/**
+ * Handle a click on the media element. By default will play/pause the media.
+ */
+vjs.MediaTechController.prototype.onClick = function(event){
+ // We're using mousedown to detect clicks thanks to Flash, but mousedown
+ // will also be triggered with right-clicks, so we need to prevent that
+ if (event.button !== 0) return;
+
+ // When controls are disabled a click should not toggle playback because
+ // the click is considered a control
+ if (this.player().controls()) {
+ if (this.player().paused()) {
+ this.player().play();
+ } else {
+ this.player().pause();
+ }
+ }
+};
+
+/**
+ * Handle a tap on the media element. By default it will toggle the user
+ * activity state, which hides and shows the controls.
+ */
+
+vjs.MediaTechController.prototype.onTap = function(){
+ this.player().userActive(!this.player().userActive());
+};
+
+vjs.MediaTechController.prototype.features = {
+ 'volumeControl': true,
+
+ // Resizing plugins using request fullscreen reloads the plugin
+ 'fullscreenResize': false,
+
+ // Optional events that we can manually mimic with timers
+ // currently not triggered by video-js-swf
+ 'progressEvents': false,
+ 'timeupdateEvents': false
+};
+
+vjs.media = {};
+
+/**
+ * List of default API methods for any MediaTechController
+ * @type {String}
+ */
+vjs.media.ApiMethods = 'play,pause,paused,currentTime,setCurrentTime,duration,buffered,volume,setVolume,muted,setMuted,width,height,supportsFullScreen,enterFullScreen,src,load,currentSrc,preload,setPreload,autoplay,setAutoplay,loop,setLoop,error,networkState,readyState,seeking,initialTime,startOffsetTime,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks,defaultPlaybackRate,playbackRate,mediaGroup,controller,controls,defaultMuted'.split(',');
+// Create placeholder methods for each that warn when a method isn't supported by the current playback technology
+
+function createMethod(methodName){
+ return function(){
+ throw new Error('The "'+methodName+'" method is not available on the playback technology\'s API');
+ };
+}
+
+for (var i = vjs.media.ApiMethods.length - 1; i >= 0; i--) {
+ var methodName = vjs.media.ApiMethods[i];
+ vjs.MediaTechController.prototype[vjs.media.ApiMethods[i]] = createMethod(methodName);
+}
+/**
+ * @fileoverview HTML5 Media Controller - Wrapper for HTML5 Media API
+ */
+
+/**
+ * HTML5 Media Controller - Wrapper for HTML5 Media API
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @param {Function=} ready
+ * @constructor
+ */
+vjs.Html5 = vjs.MediaTechController.extend({
+ /** @constructor */
+ init: function(player, options, ready){
+ // volume cannot be changed from 1 on iOS
+ this.features['volumeControl'] = vjs.Html5.canControlVolume();
+
+ // In iOS, if you move a video element in the DOM, it breaks video playback.
+ this.features['movingMediaElementInDOM'] = !vjs.IS_IOS;
+
+ // HTML video is able to automatically resize when going to fullscreen
+ this.features['fullscreenResize'] = true;
+
+ vjs.MediaTechController.call(this, player, options, ready);
+
+ var source = options['source'];
+
+ // If the element source is already set, we may have missed the loadstart event, and want to trigger it.
+ // We don't want to set the source again and interrupt playback.
+ if (source && this.el_.currentSrc == source.src) {
+ player.trigger('loadstart');
+
+ // Otherwise set the source if one was provided.
+ } else if (source) {
+ this.el_.src = source.src;
+ }
+
+ // Determine if native controls should be used
+ // Our goal should be to get the custom controls on mobile solid everywhere
+ // so we can remove this all together. Right now this will block custom
+ // controls on touch enabled laptops like the Chrome Pixel
+ if (vjs.TOUCH_ENABLED && player.options()['nativeControlsForTouch'] !== false) {
+ this.useNativeControls();
+ }
+
+ // Chrome and Safari both have issues with autoplay.
+ // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.
+ // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)
+ // This fixes both issues. Need to wait for API, so it updates displays correctly
+ player.ready(function(){
+ if (this.tag && this.options_['autoplay'] && this.paused()) {
+ delete this.tag['poster']; // Chrome Fix. Fixed in Chrome v16.
+ this.play();
+ }
+ });
+
+ this.setupTriggers();
+ this.triggerReady();
+ }
+});
+
+vjs.Html5.prototype.dispose = function(){
+ vjs.MediaTechController.prototype.dispose.call(this);
+};
+
+vjs.Html5.prototype.createEl = function(){
+ var player = this.player_,
+ // If possible, reuse original tag for HTML5 playback technology element
+ el = player.tag,
+ newEl;
+
+ // Check if this browser supports moving the element into the box.
+ // On the iPhone video will break if you move the element,
+ // So we have to create a brand new element.
+ if (!el || this.features['movingMediaElementInDOM'] === false) {
+
+ // If the original tag is still there, remove it.
+ if (el) {
+ el['player'] = null;
+ player.tag = null;
+ player.el().removeChild(el);
+ el = el.cloneNode(false);
+ } else {
+ el = vjs.createEl('video', {
+ id:player.id() + '_html5_api',
+ className:'vjs-tech'
+ });
+ }
+ // associate the player with the new tag
+ el['player'] = player;
+
+ vjs.insertFirst(el, player.el());
+ }
+
+ // Update specific tag settings, in case they were overridden
+ var attrs = ['autoplay','preload','loop','muted'];
+ for (var i = attrs.length - 1; i >= 0; i--) {
+ var attr = attrs[i];
+ if (player.options_[attr] !== null) {
+ el[attr] = player.options_[attr];
+ }
+ }
+
+ return el;
+ // jenniisawesome = true;
+};
+
+// Make video events trigger player events
+// May seem verbose here, but makes other APIs possible.
+vjs.Html5.prototype.setupTriggers = function(){
+ for (var i = vjs.Html5.Events.length - 1; i >= 0; i--) {
+ vjs.on(this.el_, vjs.Html5.Events[i], vjs.bind(this.player_, this.eventHandler));
+ }
+};
+// Triggers removed using this.off when disposed
+
+vjs.Html5.prototype.eventHandler = function(e){
+ this.trigger(e);
+
+ // No need for media events to bubble up.
+ e.stopPropagation();
+};
+
+vjs.Html5.prototype.useNativeControls = function(){
+ var tech, player, controlsOn, controlsOff, cleanUp;
+
+ tech = this;
+ player = this.player();
+
+ // If the player controls are enabled turn on the native controls
+ tech.setControls(player.controls());
+
+ // Update the native controls when player controls state is updated
+ controlsOn = function(){
+ tech.setControls(true);
+ };
+ controlsOff = function(){
+ tech.setControls(false);
+ };
+ player.on('controlsenabled', controlsOn);
+ player.on('controlsdisabled', controlsOff);
+
+ // Clean up when not using native controls anymore
+ cleanUp = function(){
+ player.off('controlsenabled', controlsOn);
+ player.off('controlsdisabled', controlsOff);
+ };
+ tech.on('dispose', cleanUp);
+ player.on('usingcustomcontrols', cleanUp);
+
+ // Update the state of the player to using native controls
+ player.usingNativeControls(true);
+};
+
+
+vjs.Html5.prototype.play = function(){ this.el_.play(); };
+vjs.Html5.prototype.pause = function(){ this.el_.pause(); };
+vjs.Html5.prototype.paused = function(){ return this.el_.paused; };
+
+vjs.Html5.prototype.currentTime = function(){ return this.el_.currentTime; };
+vjs.Html5.prototype.setCurrentTime = function(seconds){
+ try {
+ this.el_.currentTime = seconds;
+ } catch(e) {
+ vjs.log(e, 'Video is not ready. (Video.js)');
+ // this.warning(VideoJS.warnings.videoNotReady);
+ }
+};
+
+vjs.Html5.prototype.duration = function(){ return this.el_.duration || 0; };
+vjs.Html5.prototype.buffered = function(){ return this.el_.buffered; };
+
+vjs.Html5.prototype.volume = function(){ return this.el_.volume; };
+vjs.Html5.prototype.setVolume = function(percentAsDecimal){ this.el_.volume = percentAsDecimal; };
+vjs.Html5.prototype.muted = function(){ return this.el_.muted; };
+vjs.Html5.prototype.setMuted = function(muted){ this.el_.muted = muted; };
+
+vjs.Html5.prototype.width = function(){ return this.el_.offsetWidth; };
+vjs.Html5.prototype.height = function(){ return this.el_.offsetHeight; };
+
+vjs.Html5.prototype.supportsFullScreen = function(){
+ if (typeof this.el_.webkitEnterFullScreen == 'function') {
+
+ // Seems to be broken in Chromium/Chrome && Safari in Leopard
+ if (/Android/.test(vjs.USER_AGENT) || !/Chrome|Mac OS X 10.5/.test(vjs.USER_AGENT)) {
+ return true;
+ }
+ }
+ return false;
+};
+
+vjs.Html5.prototype.enterFullScreen = function(){
+ var video = this.el_;
+ if (video.paused && video.networkState <= video.HAVE_METADATA) {
+ // attempt to prime the video element for programmatic access
+ // this isn't necessary on the desktop but shouldn't hurt
+ this.el_.play();
+
+ // playing and pausing synchronously during the transition to fullscreen
+ // can get iOS ~6.1 devices into a play/pause loop
+ setTimeout(function(){
+ video.pause();
+ video.webkitEnterFullScreen();
+ }, 0);
+ } else {
+ video.webkitEnterFullScreen();
+ }
+};
+vjs.Html5.prototype.exitFullScreen = function(){
+ this.el_.webkitExitFullScreen();
+};
+vjs.Html5.prototype.src = function(src){ this.el_.src = src; };
+vjs.Html5.prototype.load = function(){ this.el_.load(); };
+vjs.Html5.prototype.currentSrc = function(){ return this.el_.currentSrc; };
+
+vjs.Html5.prototype.preload = function(){ return this.el_.preload; };
+vjs.Html5.prototype.setPreload = function(val){ this.el_.preload = val; };
+
+vjs.Html5.prototype.autoplay = function(){ return this.el_.autoplay; };
+vjs.Html5.prototype.setAutoplay = function(val){ this.el_.autoplay = val; };
+
+vjs.Html5.prototype.controls = function(){ return this.el_.controls; }
+vjs.Html5.prototype.setControls = function(val){ this.el_.controls = !!val; }
+
+vjs.Html5.prototype.loop = function(){ return this.el_.loop; };
+vjs.Html5.prototype.setLoop = function(val){ this.el_.loop = val; };
+
+vjs.Html5.prototype.error = function(){ return this.el_.error; };
+vjs.Html5.prototype.seeking = function(){ return this.el_.seeking; };
+vjs.Html5.prototype.ended = function(){ return this.el_.ended; };
+vjs.Html5.prototype.defaultMuted = function(){ return this.el_.defaultMuted; };
+
+/* HTML5 Support Testing ---------------------------------------------------- */
+
+vjs.Html5.isSupported = function(){
+ return !!vjs.TEST_VID.canPlayType;
+};
+
+vjs.Html5.canPlaySource = function(srcObj){
+ // IE9 on Windows 7 without MediaPlayer throws an error here
+ // https://github.com/videojs/video.js/issues/519
+ try {
+ return !!vjs.TEST_VID.canPlayType(srcObj.type);
+ } catch(e) {
+ return '';
+ }
+ // TODO: Check Type
+ // If no Type, check ext
+ // Check Media Type
+};
+
+vjs.Html5.canControlVolume = function(){
+ var volume = vjs.TEST_VID.volume;
+ vjs.TEST_VID.volume = (volume / 2) + 0.1;
+ return volume !== vjs.TEST_VID.volume;
+};
+
+// List of all HTML5 events (various uses).
+vjs.Html5.Events = 'loadstart,suspend,abort,error,emptied,stalled,loadedmetadata,loadeddata,canplay,canplaythrough,playing,waiting,seeking,seeked,ended,durationchange,timeupdate,progress,play,pause,ratechange,volumechange'.split(',');
+
+
+// HTML5 Feature detection and Device Fixes --------------------------------- //
+
+ // Override Android 2.2 and less canPlayType method which is broken
+if (vjs.IS_OLD_ANDROID) {
+ document.createElement('video').constructor.prototype.canPlayType = function(type){
+ return (type && type.toLowerCase().indexOf('video/mp4') != -1) ? 'maybe' : '';
+ };
+}
+/**
+ * @fileoverview VideoJS-SWF - Custom Flash Player with HTML5-ish API
+ * https://github.com/zencoder/video-js-swf
+ * Not using setupTriggers. Using global onEvent func to distribute events
+ */
+
+/**
+ * HTML5 Media Controller - Wrapper for HTML5 Media API
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @param {Function=} ready
+ * @constructor
+ */
+vjs.Flash = vjs.MediaTechController.extend({
+ /** @constructor */
+ init: function(player, options, ready){
+ vjs.MediaTechController.call(this, player, options, ready);
+
+ var source = options['source'],
+
+ // Which element to embed in
+ parentEl = options['parentEl'],
+
+ // Create a temporary element to be replaced by swf object
+ placeHolder = this.el_ = vjs.createEl('div', { id: player.id() + '_temp_flash' }),
+
+ // Generate ID for swf object
+ objId = player.id()+'_flash_api',
+
+ // Store player options in local var for optimization
+ // TODO: switch to using player methods instead of options
+ // e.g. player.autoplay();
+ playerOptions = player.options_,
+
+ // Merge default flashvars with ones passed in to init
+ flashVars = vjs.obj.merge({
+
+ // SWF Callback Functions
+ 'readyFunction': 'videojs.Flash.onReady',
+ 'eventProxyFunction': 'videojs.Flash.onEvent',
+ 'errorEventProxyFunction': 'videojs.Flash.onError',
+
+ // Player Settings
+ 'autoplay': playerOptions.autoplay,
+ 'preload': playerOptions.preload,
+ 'loop': playerOptions.loop,
+ 'muted': playerOptions.muted
+
+ }, options['flashVars']),
+
+ // Merge default parames with ones passed in
+ params = vjs.obj.merge({
+ 'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance
+ 'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading
+ }, options['params']),
+
+ // Merge default attributes with ones passed in
+ attributes = vjs.obj.merge({
+ 'id': objId,
+ 'name': objId, // Both ID and Name needed or swf to identifty itself
+ 'class': 'vjs-tech'
+ }, options['attributes'])
+ ;
+
+ // If source was supplied pass as a flash var.
+ if (source) {
+ if (source.type && vjs.Flash.isStreamingType(source.type)) {
+ var parts = vjs.Flash.streamToParts(source.src);
+ flashVars['rtmpConnection'] = encodeURIComponent(parts.connection);
+ flashVars['rtmpStream'] = encodeURIComponent(parts.stream);
+ }
+ else {
+ flashVars['src'] = encodeURIComponent(vjs.getAbsoluteURL(source.src));
+ }
+ }
+
+ // Add placeholder to player div
+ vjs.insertFirst(placeHolder, parentEl);
+
+ // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers
+ // This allows resetting the playhead when we catch the reload
+ if (options['startTime']) {
+ this.ready(function(){
+ this.load();
+ this.play();
+ this.currentTime(options['startTime']);
+ });
+ }
+
+ // Flash iFrame Mode
+ // In web browsers there are multiple instances where changing the parent element or visibility of a plugin causes the plugin to reload.
+ // - Firefox just about always. https://bugzilla.mozilla.org/show_bug.cgi?id=90268 (might be fixed by version 13)
+ // - Webkit when hiding the plugin
+ // - Webkit and Firefox when using requestFullScreen on a parent element
+ // Loading the flash plugin into a dynamically generated iFrame gets around most of these issues.
+ // Issues that remain include hiding the element and requestFullScreen in Firefox specifically
+
+ // There's on particularly annoying issue with this method which is that Firefox throws a security error on an offsite Flash object loaded into a dynamically created iFrame.
+ // Even though the iframe was inserted into a page on the web, Firefox + Flash considers it a local app trying to access an internet file.
+ // I tried mulitple ways of setting the iframe src attribute but couldn't find a src that worked well. Tried a real/fake source, in/out of domain.
+ // Also tried a method from stackoverflow that caused a security error in all browsers. http://stackoverflow.com/questions/2486901/how-to-set-document-domain-for-a-dynamically-generated-iframe
+ // In the end the solution I found to work was setting the iframe window.location.href right before doing a document.write of the Flash object.
+ // The only downside of this it seems to trigger another http request to the original page (no matter what's put in the href). Not sure why that is.
+
+ // NOTE (2012-01-29): Cannot get Firefox to load the remote hosted SWF into a dynamically created iFrame
+ // Firefox 9 throws a security error, unleess you call location.href right before doc.write.
+ // Not sure why that even works, but it causes the browser to look like it's continuously trying to load the page.
+ // Firefox 3.6 keeps calling the iframe onload function anytime I write to it, causing an endless loop.
+
+ if (options['iFrameMode'] === true && !vjs.IS_FIREFOX) {
+
+ // Create iFrame with vjs-tech class so it's 100% width/height
+ var iFrm = vjs.createEl('iframe', {
+ 'id': objId + '_iframe',
+ 'name': objId + '_iframe',
+ 'className': 'vjs-tech',
+ 'scrolling': 'no',
+ 'marginWidth': 0,
+ 'marginHeight': 0,
+ 'frameBorder': 0
+ });
+
+ // Update ready function names in flash vars for iframe window
+ flashVars['readyFunction'] = 'ready';
+ flashVars['eventProxyFunction'] = 'events';
+ flashVars['errorEventProxyFunction'] = 'errors';
+
+ // Tried multiple methods to get this to work in all browsers
+
+ // Tried embedding the flash object in the page first, and then adding a place holder to the iframe, then replacing the placeholder with the page object.
+ // The goal here was to try to load the swf URL in the parent page first and hope that got around the firefox security error
+ // var newObj = vjs.Flash.embed(options['swf'], placeHolder, flashVars, params, attributes);
+ // (in onload)
+ // var temp = vjs.createEl('a', { id:'asdf', innerHTML: 'asdf' } );
+ // iDoc.body.appendChild(temp);
+
+ // Tried embedding the flash object through javascript in the iframe source.
+ // This works in webkit but still triggers the firefox security error
+ // iFrm.src = 'javascript: document.write('"+vjs.Flash.getEmbedCode(options['swf'], flashVars, params, attributes)+"');";
+
+ // Tried an actual local iframe just to make sure that works, but it kills the easiness of the CDN version if you require the user to host an iframe
+ // We should add an option to host the iframe locally though, because it could help a lot of issues.
+ // iFrm.src = "iframe.html";
+
+ // Wait until iFrame has loaded to write into it.
+ vjs.on(iFrm, 'load', vjs.bind(this, function(){
+
+ var iDoc,
+ iWin = iFrm.contentWindow;
+
+ // The one working method I found was to use the iframe's document.write() to create the swf object
+ // This got around the security issue in all browsers except firefox.
+ // I did find a hack where if I call the iframe's window.location.href='', it would get around the security error
+ // However, the main page would look like it was loading indefinitely (URL bar loading spinner would never stop)
+ // Plus Firefox 3.6 didn't work no matter what I tried.
+ // if (vjs.USER_AGENT.match('Firefox')) {
+ // iWin.location.href = '';
+ // }
+
+ // Get the iFrame's document depending on what the browser supports
+ iDoc = iFrm.contentDocument ? iFrm.contentDocument : iFrm.contentWindow.document;
+
+ // Tried ensuring both document domains were the same, but they already were, so that wasn't the issue.
+ // Even tried adding /. that was mentioned in a browser security writeup
+ // document.domain = document.domain+'/.';
+ // iDoc.domain = document.domain+'/.';
+
+ // Tried adding the object to the iframe doc's innerHTML. Security error in all browsers.
+ // iDoc.body.innerHTML = swfObjectHTML;
+
+ // Tried appending the object to the iframe doc's body. Security error in all browsers.
+ // iDoc.body.appendChild(swfObject);
+
+ // Using document.write actually got around the security error that browsers were throwing.
+ // Again, it's a dynamically generated (same domain) iframe, loading an external Flash swf.
+ // Not sure why that's a security issue, but apparently it is.
+ iDoc.write(vjs.Flash.getEmbedCode(options['swf'], flashVars, params, attributes));
+
+ // Setting variables on the window needs to come after the doc write because otherwise they can get reset in some browsers
+ // So far no issues with swf ready event being called before it's set on the window.
+ iWin['player'] = this.player_;
+
+ // Create swf ready function for iFrame window
+ iWin['ready'] = vjs.bind(this.player_, function(currSwf){
+ var el = iDoc.getElementById(currSwf),
+ player = this,
+ tech = player.tech;
+
+ // Update reference to playback technology element
+ tech.el_ = el;
+
+ // Make sure swf is actually ready. Sometimes the API isn't actually yet.
+ vjs.Flash.checkReady(tech);
+ });
+
+ // Create event listener for all swf events
+ iWin['events'] = vjs.bind(this.player_, function(swfID, eventName){
+ var player = this;
+ if (player && player.techName === 'flash') {
+ player.trigger(eventName);
+ }
+ });
+
+ // Create error listener for all swf errors
+ iWin['errors'] = vjs.bind(this.player_, function(swfID, eventName){
+ vjs.log('Flash Error', eventName);
+ });
+
+ }));
+
+ // Replace placeholder with iFrame (it will load now)
+ placeHolder.parentNode.replaceChild(iFrm, placeHolder);
+
+ // If not using iFrame mode, embed as normal object
+ } else {
+ vjs.Flash.embed(options['swf'], placeHolder, flashVars, params, attributes);
+ }
+ }
+});
+
+vjs.Flash.prototype.dispose = function(){
+ vjs.MediaTechController.prototype.dispose.call(this);
+};
+
+vjs.Flash.prototype.play = function(){
+ this.el_.vjs_play();
+};
+
+vjs.Flash.prototype.pause = function(){
+ this.el_.vjs_pause();
+};
+
+vjs.Flash.prototype.src = function(src){
+ if (vjs.Flash.isStreamingSrc(src)) {
+ src = vjs.Flash.streamToParts(src);
+ this.setRtmpConnection(src.connection);
+ this.setRtmpStream(src.stream);
+ }
+ else {
+ // Make sure source URL is abosolute.
+ src = vjs.getAbsoluteURL(src);
+ this.el_.vjs_src(src);
+ }
+
+ // Currently the SWF doesn't autoplay if you load a source later.
+ // e.g. Load player w/ no source, wait 2s, set src.
+ if (this.player_.autoplay()) {
+ var tech = this;
+ setTimeout(function(){ tech.play(); }, 0);
+ }
+};
+
+vjs.Flash.prototype.currentSrc = function(){
+ var src = this.el_.vjs_getProperty('currentSrc');
+ // no src, check and see if RTMP
+ if (src == null) {
+ var connection = this.rtmpConnection(),
+ stream = this.rtmpStream();
+
+ if (connection && stream) {
+ src = vjs.Flash.streamFromParts(connection, stream);
+ }
+ }
+ return src;
+};
+
+vjs.Flash.prototype.load = function(){
+ this.el_.vjs_load();
+};
+
+vjs.Flash.prototype.poster = function(){
+ this.el_.vjs_getProperty('poster');
+};
+
+vjs.Flash.prototype.buffered = function(){
+ return vjs.createTimeRange(0, this.el_.vjs_getProperty('buffered'));
+};
+
+vjs.Flash.prototype.supportsFullScreen = function(){
+ return false; // Flash does not allow fullscreen through javascript
+};
+
+vjs.Flash.prototype.enterFullScreen = function(){
+ return false;
+};
+
+
+// Create setters and getters for attributes
+var api = vjs.Flash.prototype,
+ readWrite = 'rtmpConnection,rtmpStream,preload,currentTime,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(','),
+ readOnly = 'error,currentSrc,networkState,readyState,seeking,initialTime,duration,startOffsetTime,paused,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks'.split(',');
+ // Overridden: buffered
+
+/**
+ * @this {*}
+ */
+var createSetter = function(attr){
+ var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);
+ api['set'+attrUpper] = function(val){ return this.el_.vjs_setProperty(attr, val); };
+};
+
+/**
+ * @this {*}
+ */
+var createGetter = function(attr){
+ api[attr] = function(){ return this.el_.vjs_getProperty(attr); };
+};
+
+(function(){
+ var i;
+ // Create getter and setters for all read/write attributes
+ for (i = 0; i < readWrite.length; i++) {
+ createGetter(readWrite[i]);
+ createSetter(readWrite[i]);
+ }
+
+ // Create getters for read-only attributes
+ for (i = 0; i < readOnly.length; i++) {
+ createGetter(readOnly[i]);
+ }
+})();
+
+/* Flash Support Testing -------------------------------------------------------- */
+
+vjs.Flash.isSupported = function(){
+ return vjs.Flash.version()[0] >= 10;
+ // return swfobject.hasFlashPlayerVersion('10');
+};
+
+vjs.Flash.canPlaySource = function(srcObj){
+ if (srcObj.type in vjs.Flash.formats || srcObj.type in vjs.Flash.streamingFormats) { return 'maybe'; }
+};
+
+vjs.Flash.formats = {
+ 'video/flv': 'FLV',
+ 'video/x-flv': 'FLV',
+ 'video/mp4': 'MP4',
+ 'video/m4v': 'MP4'
+};
+
+vjs.Flash.streamingFormats = {
+ 'rtmp/mp4': 'MP4',
+ 'rtmp/flv': 'FLV'
+};
+
+vjs.Flash['onReady'] = function(currSwf){
+ var el = vjs.el(currSwf);
+
+ // Get player from box
+ // On firefox reloads, el might already have a player
+ var player = el['player'] || el.parentNode['player'],
+ tech = player.tech;
+
+ // Reference player on tech element
+ el['player'] = player;
+
+ // Update reference to playback technology element
+ tech.el_ = el;
+
+ vjs.Flash.checkReady(tech);
+};
+
+// The SWF isn't alwasy ready when it says it is. Sometimes the API functions still need to be added to the object.
+// If it's not ready, we set a timeout to check again shortly.
+vjs.Flash.checkReady = function(tech){
+
+ // Check if API property exists
+ if (tech.el().vjs_getProperty) {
+
+ // If so, tell tech it's ready
+ tech.triggerReady();
+
+ // Otherwise wait longer.
+ } else {
+
+ setTimeout(function(){
+ vjs.Flash.checkReady(tech);
+ }, 50);
+
+ }
+};
+
+// Trigger events from the swf on the player
+vjs.Flash['onEvent'] = function(swfID, eventName){
+ var player = vjs.el(swfID)['player'];
+ player.trigger(eventName);
+};
+
+// Log errors from the swf
+vjs.Flash['onError'] = function(swfID, err){
+ var player = vjs.el(swfID)['player'];
+ player.trigger('error');
+ vjs.log('Flash Error', err, swfID);
+};
+
+// Flash Version Check
+vjs.Flash.version = function(){
+ var version = '0,0,0';
+
+ // IE
+ try {
+ version = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
+
+ // other browsers
+ } catch(e) {
+ try {
+ if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin){
+ version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
+ }
+ } catch(err) {}
+ }
+ return version.split(',');
+};
+
+// Flash embedding method. Only used in non-iframe mode
+vjs.Flash.embed = function(swf, placeHolder, flashVars, params, attributes){
+ var code = vjs.Flash.getEmbedCode(swf, flashVars, params, attributes),
+
+ // Get element by embedding code and retrieving created element
+ obj = vjs.createEl('div', { innerHTML: code }).childNodes[0],
+
+ par = placeHolder.parentNode
+ ;
+
+ placeHolder.parentNode.replaceChild(obj, placeHolder);
+
+ // IE6 seems to have an issue where it won't initialize the swf object after injecting it.
+ // This is a dumb fix
+ var newObj = par.childNodes[0];
+ setTimeout(function(){
+ newObj.style.display = 'block';
+ }, 1000);
+
+ return obj;
+
+};
+
+vjs.Flash.getEmbedCode = function(swf, flashVars, params, attributes){
+
+ var objTag = '<object type="application/x-shockwave-flash"',
+ flashVarsString = '',
+ paramsString = '',
+ attrsString = '';
+
+ // Convert flash vars to string
+ if (flashVars) {
+ vjs.obj.each(flashVars, function(key, val){
+ flashVarsString += (key + '=' + val + '&amp;');
+ });
+ }
+
+ // Add swf, flashVars, and other default params
+ params = vjs.obj.merge({
+ 'movie': swf,
+ 'flashvars': flashVarsString,
+ 'allowScriptAccess': 'always', // Required to talk to swf
+ 'allowNetworking': 'all' // All should be default, but having security issues.
+ }, params);
+
+ // Create param tags string
+ vjs.obj.each(params, function(key, val){
+ paramsString += '<param name="'+key+'" value="'+val+'" />';
+ });
+
+ attributes = vjs.obj.merge({
+ // Add swf to attributes (need both for IE and Others to work)
+ 'data': swf,
+
+ // Default to 100% width/height
+ 'width': '100%',
+ 'height': '100%'
+
+ }, attributes);
+
+ // Create Attributes string
+ vjs.obj.each(attributes, function(key, val){
+ attrsString += (key + '="' + val + '" ');
+ });
+
+ return objTag + attrsString + '>' + paramsString + '</object>';
+};
+
+vjs.Flash.streamFromParts = function(connection, stream) {
+ return connection + '&' + stream;
+};
+
+vjs.Flash.streamToParts = function(src) {
+ var parts = {
+ connection: '',
+ stream: ''
+ };
+
+ if (! src) {
+ return parts;
+ }
+
+ // Look for the normal URL separator we expect, '&'.
+ // If found, we split the URL into two pieces around the
+ // first '&'.
+ var connEnd = src.indexOf('&');
+ var streamBegin;
+ if (connEnd !== -1) {
+ streamBegin = connEnd + 1;
+ }
+ else {
+ // If there's not a '&', we use the last '/' as the delimiter.
+ connEnd = streamBegin = src.lastIndexOf('/') + 1;
+ if (connEnd === 0) {
+ // really, there's not a '/'?
+ connEnd = streamBegin = src.length;
+ }
+ }
+ parts.connection = src.substring(0, connEnd);
+ parts.stream = src.substring(streamBegin, src.length);
+
+ return parts;
+};
+
+vjs.Flash.isStreamingType = function(srcType) {
+ return srcType in vjs.Flash.streamingFormats;
+};
+
+// RTMP has four variations, any string starting
+// with one of these protocols should be valid
+vjs.Flash.RTMP_RE = /^rtmp[set]?:\/\//i;
+
+vjs.Flash.isStreamingSrc = function(src) {
+ return vjs.Flash.RTMP_RE.test(src);
+};
+/**
+ * @constructor
+ */
+vjs.MediaLoader = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options, ready){
+ vjs.Component.call(this, player, options, ready);
+
+ // If there are no sources when the player is initialized,
+ // load the first supported playback technology.
+ if (!player.options_['sources'] || player.options_['sources'].length === 0) {
+ for (var i=0,j=player.options_['techOrder']; i<j.length; i++) {
+ var techName = vjs.capitalize(j[i]),
+ tech = window['videojs'][techName];
+
+ // Check if the browser supports this technology
+ if (tech && tech.isSupported()) {
+ player.loadTech(techName);
+ break;
+ }
+ }
+ } else {
+ // // Loop through playback technologies (HTML5, Flash) and check for support.
+ // // Then load the best source.
+ // // A few assumptions here:
+ // // All playback technologies respect preload false.
+ player.src(player.options_['sources']);
+ }
+ }
+});/**
+ * @fileoverview Text Tracks
+ * Text tracks are tracks of timed text events.
+ * Captions - text displayed over the video for the hearing impared
+ * Subtitles - text displayed over the video for those who don't understand langauge in the video
+ * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video
+ * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device
+ */
+
+// Player Additions - Functions add to the player object for easier access to tracks
+
+/**
+ * List of associated text tracks
+ * @type {Array}
+ * @private
+ */
+vjs.Player.prototype.textTracks_;
+
+/**
+ * Get an array of associated text tracks. captions, subtitles, chapters, descriptions
+ * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks
+ * @return {Array} Array of track objects
+ */
+vjs.Player.prototype.textTracks = function(){
+ this.textTracks_ = this.textTracks_ || [];
+ return this.textTracks_;
+};
+
+/**
+ * Add a text track
+ * In addition to the W3C settings we allow adding additional info through options.
+ * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack
+ * @param {String} kind Captions, subtitles, chapters, descriptions, or metadata
+ * @param {String=} label Optional label
+ * @param {String=} language Optional language
+ * @param {Object=} options Additional track options, like src
+ */
+vjs.Player.prototype.addTextTrack = function(kind, label, language, options){
+ var tracks = this.textTracks_ = this.textTracks_ || [];
+ options = options || {};
+
+ options['kind'] = kind;
+ options['label'] = label;
+ options['language'] = language;
+
+ // HTML5 Spec says default to subtitles.
+ // Uppercase first letter to match class names
+ var Kind = vjs.capitalize(kind || 'subtitles');
+
+ // Create correct texttrack class. CaptionsTrack, etc.
+ var track = new window['videojs'][Kind + 'Track'](this, options);
+
+ tracks.push(track);
+
+ // If track.dflt() is set, start showing immediately
+ // TODO: Add a process to deterime the best track to show for the specific kind
+ // Incase there are mulitple defaulted tracks of the same kind
+ // Or the user has a set preference of a specific language that should override the default
+ // if (track.dflt()) {
+ // this.ready(vjs.bind(track, track.show));
+ // }
+
+ return track;
+};
+
+/**
+ * Add an array of text tracks. captions, subtitles, chapters, descriptions
+ * Track objects will be stored in the player.textTracks() array
+ * @param {Array} trackList Array of track elements or objects (fake track elements)
+ */
+vjs.Player.prototype.addTextTracks = function(trackList){
+ var trackObj;
+
+ for (var i = 0; i < trackList.length; i++) {
+ trackObj = trackList[i];
+ this.addTextTrack(trackObj['kind'], trackObj['label'], trackObj['language'], trackObj);
+ }
+
+ return this;
+};
+
+// Show a text track
+// disableSameKind: disable all other tracks of the same kind. Value should be a track kind (captions, etc.)
+vjs.Player.prototype.showTextTrack = function(id, disableSameKind){
+ var tracks = this.textTracks_,
+ i = 0,
+ j = tracks.length,
+ track, showTrack, kind;
+
+ // Find Track with same ID
+ for (;i<j;i++) {
+ track = tracks[i];
+ if (track.id() === id) {
+ track.show();
+ showTrack = track;
+
+ // Disable tracks of the same kind
+ } else if (disableSameKind && track.kind() == disableSameKind && track.mode() > 0) {
+ track.disable();
+ }
+ }
+
+ // Get track kind from shown track or disableSameKind
+ kind = (showTrack) ? showTrack.kind() : ((disableSameKind) ? disableSameKind : false);
+
+ // Trigger trackchange event, captionstrackchange, subtitlestrackchange, etc.
+ if (kind) {
+ this.trigger(kind+'trackchange');
+ }
+
+ return this;
+};
+
+/**
+ * Track Class
+ * Contains track methods for loading, showing, parsing cues of tracks
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.TextTrack = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.Component.call(this, player, options);
+
+ // Apply track info to track object
+ // Options will often be a track element
+
+ // Build ID if one doesn't exist
+ this.id_ = options['id'] || ('vjs_' + options['kind'] + '_' + options['language'] + '_' + vjs.guid++);
+ this.src_ = options['src'];
+ // 'default' is a reserved keyword in js so we use an abbreviated version
+ this.dflt_ = options['default'] || options['dflt'];
+ this.title_ = options['title'];
+ this.language_ = options['srclang'];
+ this.label_ = options['label'];
+ this.cues_ = [];
+ this.activeCues_ = [];
+ this.readyState_ = 0;
+ this.mode_ = 0;
+
+ this.player_.on('fullscreenchange', vjs.bind(this, this.adjustFontSize));
+ }
+});
+
+/**
+ * Track kind value. Captions, subtitles, etc.
+ * @private
+ */
+vjs.TextTrack.prototype.kind_;
+
+/**
+ * Get the track kind value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.kind = function(){
+ return this.kind_;
+};
+
+/**
+ * Track src value
+ * @private
+ */
+vjs.TextTrack.prototype.src_;
+
+/**
+ * Get the track src value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.src = function(){
+ return this.src_;
+};
+
+/**
+ * Track default value
+ * If default is used, subtitles/captions to start showing
+ * @private
+ */
+vjs.TextTrack.prototype.dflt_;
+
+/**
+ * Get the track default value
+ * 'default' is a reserved keyword
+ * @return {Boolean}
+ */
+vjs.TextTrack.prototype.dflt = function(){
+ return this.dflt_;
+};
+
+/**
+ * Track title value
+ * @private
+ */
+vjs.TextTrack.prototype.title_;
+
+/**
+ * Get the track title value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.title = function(){
+ return this.title_;
+};
+
+/**
+ * Language - two letter string to represent track language, e.g. 'en' for English
+ * Spec def: readonly attribute DOMString language;
+ * @private
+ */
+vjs.TextTrack.prototype.language_;
+
+/**
+ * Get the track language value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.language = function(){
+ return this.language_;
+};
+
+/**
+ * Track label e.g. 'English'
+ * Spec def: readonly attribute DOMString label;
+ * @private
+ */
+vjs.TextTrack.prototype.label_;
+
+/**
+ * Get the track label value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.label = function(){
+ return this.label_;
+};
+
+/**
+ * All cues of the track. Cues have a startTime, endTime, text, and other properties.
+ * Spec def: readonly attribute TextTrackCueList cues;
+ * @private
+ */
+vjs.TextTrack.prototype.cues_;
+
+/**
+ * Get the track cues
+ * @return {Array}
+ */
+vjs.TextTrack.prototype.cues = function(){
+ return this.cues_;
+};
+
+/**
+ * ActiveCues is all cues that are currently showing
+ * Spec def: readonly attribute TextTrackCueList activeCues;
+ * @private
+ */
+vjs.TextTrack.prototype.activeCues_;
+
+/**
+ * Get the track active cues
+ * @return {Array}
+ */
+vjs.TextTrack.prototype.activeCues = function(){
+ return this.activeCues_;
+};
+
+/**
+ * ReadyState describes if the text file has been loaded
+ * const unsigned short NONE = 0;
+ * const unsigned short LOADING = 1;
+ * const unsigned short LOADED = 2;
+ * const unsigned short ERROR = 3;
+ * readonly attribute unsigned short readyState;
+ * @private
+ */
+vjs.TextTrack.prototype.readyState_;
+
+/**
+ * Get the track readyState
+ * @return {Number}
+ */
+vjs.TextTrack.prototype.readyState = function(){
+ return this.readyState_;
+};
+
+/**
+ * Mode describes if the track is showing, hidden, or disabled
+ * const unsigned short OFF = 0;
+ * const unsigned short HIDDEN = 1; (still triggering cuechange events, but not visible)
+ * const unsigned short SHOWING = 2;
+ * attribute unsigned short mode;
+ * @private
+ */
+vjs.TextTrack.prototype.mode_;
+
+/**
+ * Get the track mode
+ * @return {Number}
+ */
+vjs.TextTrack.prototype.mode = function(){
+ return this.mode_;
+};
+
+/**
+ * Change the font size of the text track to make it larger when playing in fullscreen mode
+ * and restore it to its normal size when not in fullscreen mode.
+ */
+vjs.TextTrack.prototype.adjustFontSize = function(){
+ if (this.player_.isFullScreen) {
+ // Scale the font by the same factor as increasing the video width to the full screen window width.
+ // Additionally, multiply that factor by 1.4, which is the default font size for
+ // the caption track (from the CSS)
+ this.el_.style.fontSize = screen.width / this.player_.width() * 1.4 * 100 + '%';
+ } else {
+ // Change the font size of the text track back to its original non-fullscreen size
+ this.el_.style.fontSize = '';
+ }
+};
+
+/**
+ * Create basic div to hold cue text
+ * @return {Element}
+ */
+vjs.TextTrack.prototype.createEl = function(){
+ return vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-' + this.kind_ + ' vjs-text-track'
+ });
+};
+
+/**
+ * Show: Mode Showing (2)
+ * Indicates that the text track is active. If no attempt has yet been made to obtain the track's cues, the user agent will perform such an attempt momentarily.
+ * The user agent is maintaining a list of which cues are active, and events are being fired accordingly.
+ * In addition, for text tracks whose kind is subtitles or captions, the cues are being displayed over the video as appropriate;
+ * for text tracks whose kind is descriptions, the user agent is making the cues available to the user in a non-visual fashion;
+ * and for text tracks whose kind is chapters, the user agent is making available to the user a mechanism by which the user can navigate to any point in the media resource by selecting a cue.
+ * The showing by default state is used in conjunction with the default attribute on track elements to indicate that the text track was enabled due to that attribute.
+ * This allows the user agent to override the state if a later track is discovered that is more appropriate per the user's preferences.
+ */
+vjs.TextTrack.prototype.show = function(){
+ this.activate();
+
+ this.mode_ = 2;
+
+ // Show element.
+ vjs.Component.prototype.show.call(this);
+};
+
+/**
+ * Hide: Mode Hidden (1)
+ * Indicates that the text track is active, but that the user agent is not actively displaying the cues.
+ * If no attempt has yet been made to obtain the track's cues, the user agent will perform such an attempt momentarily.
+ * The user agent is maintaining a list of which cues are active, and events are being fired accordingly.
+ */
+vjs.TextTrack.prototype.hide = function(){
+ // When hidden, cues are still triggered. Disable to stop triggering.
+ this.activate();
+
+ this.mode_ = 1;
+
+ // Hide element.
+ vjs.Component.prototype.hide.call(this);
+};
+
+/**
+ * Disable: Mode Off/Disable (0)
+ * Indicates that the text track is not active. Other than for the purposes of exposing the track in the DOM, the user agent is ignoring the text track.
+ * No cues are active, no events are fired, and the user agent will not attempt to obtain the track's cues.
+ */
+vjs.TextTrack.prototype.disable = function(){
+ // If showing, hide.
+ if (this.mode_ == 2) { this.hide(); }
+
+ // Stop triggering cues
+ this.deactivate();
+
+ // Switch Mode to Off
+ this.mode_ = 0;
+};
+
+/**
+ * Turn on cue tracking. Tracks that are showing OR hidden are active.
+ */
+vjs.TextTrack.prototype.activate = function(){
+ // Load text file if it hasn't been yet.
+ if (this.readyState_ === 0) { this.load(); }
+
+ // Only activate if not already active.
+ if (this.mode_ === 0) {
+ // Update current cue on timeupdate
+ // Using unique ID for bind function so other tracks don't remove listener
+ this.player_.on('timeupdate', vjs.bind(this, this.update, this.id_));
+
+ // Reset cue time on media end
+ this.player_.on('ended', vjs.bind(this, this.reset, this.id_));
+
+ // Add to display
+ if (this.kind_ === 'captions' || this.kind_ === 'subtitles') {
+ this.player_.getChild('textTrackDisplay').addChild(this);
+ }
+ }
+};
+
+/**
+ * Turn off cue tracking.
+ */
+vjs.TextTrack.prototype.deactivate = function(){
+ // Using unique ID for bind function so other tracks don't remove listener
+ this.player_.off('timeupdate', vjs.bind(this, this.update, this.id_));
+ this.player_.off('ended', vjs.bind(this, this.reset, this.id_));
+ this.reset(); // Reset
+
+ // Remove from display
+ this.player_.getChild('textTrackDisplay').removeChild(this);
+};
+
+// A readiness state
+// One of the following:
+//
+// Not loaded
+// Indicates that the text track is known to exist (e.g. it has been declared with a track element), but its cues have not been obtained.
+//
+// Loading
+// Indicates that the text track is loading and there have been no fatal errors encountered so far. Further cues might still be added to the track.
+//
+// Loaded
+// Indicates that the text track has been loaded with no fatal errors. No new cues will be added to the track except if the text track corresponds to a MutableTextTrack object.
+//
+// Failed to load
+// Indicates that the text track was enabled, but when the user agent attempted to obtain it, this failed in some way (e.g. URL could not be resolved, network error, unknown text track format). Some or all of the cues are likely missing and will not be obtained.
+vjs.TextTrack.prototype.load = function(){
+
+ // Only load if not loaded yet.
+ if (this.readyState_ === 0) {
+ this.readyState_ = 1;
+ vjs.get(this.src_, vjs.bind(this, this.parseCues), vjs.bind(this, this.onError));
+ }
+
+};
+
+vjs.TextTrack.prototype.onError = function(err){
+ this.error = err;
+ this.readyState_ = 3;
+ this.trigger('error');
+};
+
+// Parse the WebVTT text format for cue times.
+// TODO: Separate parser into own class so alternative timed text formats can be used. (TTML, DFXP)
+vjs.TextTrack.prototype.parseCues = function(srcContent) {
+ var cue, time, text,
+ lines = srcContent.split('\n'),
+ line = '', id;
+
+ for (var i=1, j=lines.length; i<j; i++) {
+ // Line 0 should be 'WEBVTT', so skipping i=0
+
+ line = vjs.trim(lines[i]); // Trim whitespace and linebreaks
+
+ if (line) { // Loop until a line with content
+
+ // First line could be an optional cue ID
+ // Check if line has the time separator
+ if (line.indexOf('-->') == -1) {
+ id = line;
+ // Advance to next line for timing.
+ line = vjs.trim(lines[++i]);
+ } else {
+ id = this.cues_.length;
+ }
+
+ // First line - Number
+ cue = {
+ id: id, // Cue Number
+ index: this.cues_.length // Position in Array
+ };
+
+ // Timing line
+ time = line.split(' --> ');
+ cue.startTime = this.parseCueTime(time[0]);
+ cue.endTime = this.parseCueTime(time[1]);
+
+ // Additional lines - Cue Text
+ text = [];
+
+ // Loop until a blank line or end of lines
+ // Assumeing trim('') returns false for blank lines
+ while (lines[++i] && (line = vjs.trim(lines[i]))) {
+ text.push(line);
+ }
+
+ cue.text = text.join('<br/>');
+
+ // Add this cue
+ this.cues_.push(cue);
+ }
+ }
+
+ this.readyState_ = 2;
+ this.trigger('loaded');
+};
+
+
+vjs.TextTrack.prototype.parseCueTime = function(timeText) {
+ var parts = timeText.split(':'),
+ time = 0,
+ hours, minutes, other, seconds, ms;
+
+ // Check if optional hours place is included
+ // 00:00:00.000 vs. 00:00.000
+ if (parts.length == 3) {
+ hours = parts[0];
+ minutes = parts[1];
+ other = parts[2];
+ } else {
+ hours = 0;
+ minutes = parts[0];
+ other = parts[1];
+ }
+
+ // Break other (seconds, milliseconds, and flags) by spaces
+ // TODO: Make additional cue layout settings work with flags
+ other = other.split(/\s+/);
+ // Remove seconds. Seconds is the first part before any spaces.
+ seconds = other.splice(0,1)[0];
+ // Could use either . or , for decimal
+ seconds = seconds.split(/\.|,/);
+ // Get milliseconds
+ ms = parseFloat(seconds[1]);
+ seconds = seconds[0];
+
+ // hours => seconds
+ time += parseFloat(hours) * 3600;
+ // minutes => seconds
+ time += parseFloat(minutes) * 60;
+ // Add seconds
+ time += parseFloat(seconds);
+ // Add milliseconds
+ if (ms) { time += ms/1000; }
+
+ return time;
+};
+
+// Update active cues whenever timeupdate events are triggered on the player.
+vjs.TextTrack.prototype.update = function(){
+ if (this.cues_.length > 0) {
+
+ // Get curent player time
+ var time = this.player_.currentTime();
+
+ // Check if the new time is outside the time box created by the the last update.
+ if (this.prevChange === undefined || time < this.prevChange || this.nextChange <= time) {
+ var cues = this.cues_,
+
+ // Create a new time box for this state.
+ newNextChange = this.player_.duration(), // Start at beginning of the timeline
+ newPrevChange = 0, // Start at end
+
+ reverse = false, // Set the direction of the loop through the cues. Optimized the cue check.
+ newCues = [], // Store new active cues.
+
+ // Store where in the loop the current active cues are, to provide a smart starting point for the next loop.
+ firstActiveIndex, lastActiveIndex,
+ cue, i; // Loop vars
+
+ // Check if time is going forwards or backwards (scrubbing/rewinding)
+ // If we know the direction we can optimize the starting position and direction of the loop through the cues array.
+ if (time >= this.nextChange || this.nextChange === undefined) { // NextChange should happen
+ // Forwards, so start at the index of the first active cue and loop forward
+ i = (this.firstActiveIndex !== undefined) ? this.firstActiveIndex : 0;
+ } else {
+ // Backwards, so start at the index of the last active cue and loop backward
+ reverse = true;
+ i = (this.lastActiveIndex !== undefined) ? this.lastActiveIndex : cues.length - 1;
+ }
+
+ while (true) { // Loop until broken
+ cue = cues[i];
+
+ // Cue ended at this point
+ if (cue.endTime <= time) {
+ newPrevChange = Math.max(newPrevChange, cue.endTime);
+
+ if (cue.active) {
+ cue.active = false;
+ }
+
+ // No earlier cues should have an active start time.
+ // Nevermind. Assume first cue could have a duration the same as the video.
+ // In that case we need to loop all the way back to the beginning.
+ // if (reverse && cue.startTime) { break; }
+
+ // Cue hasn't started
+ } else if (time < cue.startTime) {
+ newNextChange = Math.min(newNextChange, cue.startTime);
+
+ if (cue.active) {
+ cue.active = false;
+ }
+
+ // No later cues should have an active start time.
+ if (!reverse) { break; }
+
+ // Cue is current
+ } else {
+
+ if (reverse) {
+ // Add cue to front of array to keep in time order
+ newCues.splice(0,0,cue);
+
+ // If in reverse, the first current cue is our lastActiveCue
+ if (lastActiveIndex === undefined) { lastActiveIndex = i; }
+ firstActiveIndex = i;
+ } else {
+ // Add cue to end of array
+ newCues.push(cue);
+
+ // If forward, the first current cue is our firstActiveIndex
+ if (firstActiveIndex === undefined) { firstActiveIndex = i; }
+ lastActiveIndex = i;
+ }
+
+ newNextChange = Math.min(newNextChange, cue.endTime);
+ newPrevChange = Math.max(newPrevChange, cue.startTime);
+
+ cue.active = true;
+ }
+
+ if (reverse) {
+ // Reverse down the array of cues, break if at first
+ if (i === 0) { break; } else { i--; }
+ } else {
+ // Walk up the array fo cues, break if at last
+ if (i === cues.length - 1) { break; } else { i++; }
+ }
+
+ }
+
+ this.activeCues_ = newCues;
+ this.nextChange = newNextChange;
+ this.prevChange = newPrevChange;
+ this.firstActiveIndex = firstActiveIndex;
+ this.lastActiveIndex = lastActiveIndex;
+
+ this.updateDisplay();
+
+ this.trigger('cuechange');
+ }
+ }
+};
+
+// Add cue HTML to display
+vjs.TextTrack.prototype.updateDisplay = function(){
+ var cues = this.activeCues_,
+ html = '',
+ i=0,j=cues.length;
+
+ for (;i<j;i++) {
+ html += '<span class="vjs-tt-cue">'+cues[i].text+'</span>';
+ }
+
+ this.el_.innerHTML = html;
+};
+
+// Set all loop helper values back
+vjs.TextTrack.prototype.reset = function(){
+ this.nextChange = 0;
+ this.prevChange = this.player_.duration();
+ this.firstActiveIndex = 0;
+ this.lastActiveIndex = 0;
+};
+
+// Create specific track types
+/**
+ * @constructor
+ */
+vjs.CaptionsTrack = vjs.TextTrack.extend();
+vjs.CaptionsTrack.prototype.kind_ = 'captions';
+// Exporting here because Track creation requires the track kind
+// to be available on global object. e.g. new window['videojs'][Kind + 'Track']
+
+/**
+ * @constructor
+ */
+vjs.SubtitlesTrack = vjs.TextTrack.extend();
+vjs.SubtitlesTrack.prototype.kind_ = 'subtitles';
+
+/**
+ * @constructor
+ */
+vjs.ChaptersTrack = vjs.TextTrack.extend();
+vjs.ChaptersTrack.prototype.kind_ = 'chapters';
+
+
+/* Text Track Display
+============================================================================= */
+// Global container for both subtitle and captions text. Simple div container.
+
+/**
+ * @constructor
+ */
+vjs.TextTrackDisplay = vjs.Component.extend({
+ /** @constructor */
+ init: function(player, options, ready){
+ vjs.Component.call(this, player, options, ready);
+
+ // This used to be called during player init, but was causing an error
+ // if a track should show by default and the display hadn't loaded yet.
+ // Should probably be moved to an external track loader when we support
+ // tracks that don't need a display.
+ if (player.options_['tracks'] && player.options_['tracks'].length > 0) {
+ this.player_.addTextTracks(player.options_['tracks']);
+ }
+ }
+});
+
+vjs.TextTrackDisplay.prototype.createEl = function(){
+ return vjs.Component.prototype.createEl.call(this, 'div', {
+ className: 'vjs-text-track-display'
+ });
+};
+
+
+/* Text Track Menu Items
+============================================================================= */
+/**
+ * @constructor
+ */
+vjs.TextTrackMenuItem = vjs.MenuItem.extend({
+ /** @constructor */
+ init: function(player, options){
+ var track = this.track = options['track'];
+
+ // Modify options for parent MenuItem class's init.
+ options['label'] = track.label();
+ options['selected'] = track.dflt();
+ vjs.MenuItem.call(this, player, options);
+
+ this.player_.on(track.kind() + 'trackchange', vjs.bind(this, this.update));
+ }
+});
+
+vjs.TextTrackMenuItem.prototype.onClick = function(){
+ vjs.MenuItem.prototype.onClick.call(this);
+ this.player_.showTextTrack(this.track.id_, this.track.kind());
+};
+
+vjs.TextTrackMenuItem.prototype.update = function(){
+ this.selected(this.track.mode() == 2);
+};
+
+/**
+ * @constructor
+ */
+vjs.OffTextTrackMenuItem = vjs.TextTrackMenuItem.extend({
+ /** @constructor */
+ init: function(player, options){
+ // Create pseudo track info
+ // Requires options['kind']
+ options['track'] = {
+ kind: function() { return options['kind']; },
+ player: player,
+ label: function(){ return options['kind'] + ' off'; },
+ dflt: function(){ return false; },
+ mode: function(){ return false; }
+ };
+ vjs.TextTrackMenuItem.call(this, player, options);
+ this.selected(true);
+ }
+});
+
+vjs.OffTextTrackMenuItem.prototype.onClick = function(){
+ vjs.TextTrackMenuItem.prototype.onClick.call(this);
+ this.player_.showTextTrack(this.track.id_, this.track.kind());
+};
+
+vjs.OffTextTrackMenuItem.prototype.update = function(){
+ var tracks = this.player_.textTracks(),
+ i=0, j=tracks.length, track,
+ off = true;
+
+ for (;i<j;i++) {
+ track = tracks[i];
+ if (track.kind() == this.track.kind() && track.mode() == 2) {
+ off = false;
+ }
+ }
+
+ this.selected(off);
+};
+
+/* Captions Button
+================================================================================ */
+/**
+ * @constructor
+ */
+vjs.TextTrackButton = vjs.MenuButton.extend({
+ /** @constructor */
+ init: function(player, options){
+ vjs.MenuButton.call(this, player, options);
+
+ if (this.items.length <= 1) {
+ this.hide();
+ }
+ }
+});
+
+// vjs.TextTrackButton.prototype.buttonPressed = false;
+
+// vjs.TextTrackButton.prototype.createMenu = function(){
+// var menu = new vjs.Menu(this.player_);
+
+// // Add a title list item to the top
+// // menu.el().appendChild(vjs.createEl('li', {
+// // className: 'vjs-menu-title',
+// // innerHTML: vjs.capitalize(this.kind_),
+// // tabindex: -1
+// // }));
+
+// this.items = this.createItems();
+
+// // Add menu items to the menu
+// for (var i = 0; i < this.items.length; i++) {
+// menu.addItem(this.items[i]);
+// }
+
+// // Add list to element
+// this.addChild(menu);
+
+// return menu;
+// };
+
+// Create a menu item for each text track
+vjs.TextTrackButton.prototype.createItems = function(){
+ var items = [], track;
+
+ // Add an OFF menu item to turn all tracks off
+ items.push(new vjs.OffTextTrackMenuItem(this.player_, { 'kind': this.kind_ }));
+
+ for (var i = 0; i < this.player_.textTracks().length; i++) {
+ track = this.player_.textTracks()[i];
+ if (track.kind() === this.kind_) {
+ items.push(new vjs.TextTrackMenuItem(this.player_, {
+ 'track': track
+ }));
+ }
+ }
+
+ return items;
+};
+
+/**
+ * @constructor
+ */
+vjs.CaptionsButton = vjs.TextTrackButton.extend({
+ /** @constructor */
+ init: function(player, options, ready){
+ vjs.TextTrackButton.call(this, player, options, ready);
+ this.el_.setAttribute('aria-label','Captions Menu');
+ }
+});
+vjs.CaptionsButton.prototype.kind_ = 'captions';
+vjs.CaptionsButton.prototype.buttonText = 'Captions';
+vjs.CaptionsButton.prototype.className = 'vjs-captions-button';
+
+/**
+ * @constructor
+ */
+vjs.SubtitlesButton = vjs.TextTrackButton.extend({
+ /** @constructor */
+ init: function(player, options, ready){
+ vjs.TextTrackButton.call(this, player, options, ready);
+ this.el_.setAttribute('aria-label','Subtitles Menu');
+ }
+});
+vjs.SubtitlesButton.prototype.kind_ = 'subtitles';
+vjs.SubtitlesButton.prototype.buttonText = 'Subtitles';
+vjs.SubtitlesButton.prototype.className = 'vjs-subtitles-button';
+
+// Chapters act much differently than other text tracks
+// Cues are navigation vs. other tracks of alternative languages
+/**
+ * @constructor
+ */
+vjs.ChaptersButton = vjs.TextTrackButton.extend({
+ /** @constructor */
+ init: function(player, options, ready){
+ vjs.TextTrackButton.call(this, player, options, ready);
+ this.el_.setAttribute('aria-label','Chapters Menu');
+ }
+});
+vjs.ChaptersButton.prototype.kind_ = 'chapters';
+vjs.ChaptersButton.prototype.buttonText = 'Chapters';
+vjs.ChaptersButton.prototype.className = 'vjs-chapters-button';
+
+// Create a menu item for each text track
+vjs.ChaptersButton.prototype.createItems = function(){
+ var items = [], track;
+
+ for (var i = 0; i < this.player_.textTracks().length; i++) {
+ track = this.player_.textTracks()[i];
+ if (track.kind() === this.kind_) {
+ items.push(new vjs.TextTrackMenuItem(this.player_, {
+ 'track': track
+ }));
+ }
+ }
+
+ return items;
+};
+
+vjs.ChaptersButton.prototype.createMenu = function(){
+ var tracks = this.player_.textTracks(),
+ i = 0,
+ j = tracks.length,
+ track, chaptersTrack,
+ items = this.items = [];
+
+ for (;i<j;i++) {
+ track = tracks[i];
+ if (track.kind() == this.kind_ && track.dflt()) {
+ if (track.readyState() < 2) {
+ this.chaptersTrack = track;
+ track.on('loaded', vjs.bind(this, this.createMenu));
+ return;
+ } else {
+ chaptersTrack = track;
+ break;
+ }
+ }
+ }
+
+ var menu = this.menu = new vjs.Menu(this.player_);
+
+ menu.el_.appendChild(vjs.createEl('li', {
+ className: 'vjs-menu-title',
+ innerHTML: vjs.capitalize(this.kind_),
+ tabindex: -1
+ }));
+
+ if (chaptersTrack) {
+ var cues = chaptersTrack.cues_, cue, mi;
+ i = 0;
+ j = cues.length;
+
+ for (;i<j;i++) {
+ cue = cues[i];
+
+ mi = new vjs.ChaptersTrackMenuItem(this.player_, {
+ 'track': chaptersTrack,
+ 'cue': cue
+ });
+
+ items.push(mi);
+
+ menu.addChild(mi);
+ }
+ }
+
+ if (this.items.length > 0) {
+ this.show();
+ }
+
+ return menu;
+};
+
+
+/**
+ * @constructor
+ */
+vjs.ChaptersTrackMenuItem = vjs.MenuItem.extend({
+ /** @constructor */
+ init: function(player, options){
+ var track = this.track = options['track'],
+ cue = this.cue = options['cue'],
+ currentTime = player.currentTime();
+
+ // Modify options for parent MenuItem class's init.
+ options['label'] = cue.text;
+ options['selected'] = (cue.startTime <= currentTime && currentTime < cue.endTime);
+ vjs.MenuItem.call(this, player, options);
+
+ track.on('cuechange', vjs.bind(this, this.update));
+ }
+});
+
+vjs.ChaptersTrackMenuItem.prototype.onClick = function(){
+ vjs.MenuItem.prototype.onClick.call(this);
+ this.player_.currentTime(this.cue.startTime);
+ this.update(this.cue.startTime);
+};
+
+vjs.ChaptersTrackMenuItem.prototype.update = function(){
+ var cue = this.cue,
+ currentTime = this.player_.currentTime();
+
+ // vjs.log(currentTime, cue.startTime);
+ this.selected(cue.startTime <= currentTime && currentTime < cue.endTime);
+};
+
+// Add Buttons to controlBar
+vjs.obj.merge(vjs.ControlBar.prototype.options_['children'], {
+ 'subtitlesButton': {},
+ 'captionsButton': {},
+ 'chaptersButton': {}
+});
+
+// vjs.Cue = vjs.Component.extend({
+// /** @constructor */
+// init: function(player, options){
+// vjs.Component.call(this, player, options);
+// }
+// });
+/**
+ * @fileoverview Add JSON support
+ * @suppress {undefinedVars}
+ * (Compiler doesn't like JSON not being declared)
+ */
+
+/**
+ * Javascript JSON implementation
+ * (Parse Method Only)
+ * https://github.com/douglascrockford/JSON-js/blob/master/json2.js
+ * Only using for parse method when parsing data-setup attribute JSON.
+ * @type {Object}
+ * @suppress {undefinedVars}
+ */
+vjs.JSON;
+
+/**
+ * @suppress {undefinedVars}
+ */
+if (typeof window.JSON !== 'undefined' && window.JSON.parse === 'function') {
+ vjs.JSON = window.JSON;
+
+} else {
+ vjs.JSON = {};
+
+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+
+ vjs.JSON.parse = function (text, reviver) {
+ var j;
+
+ function walk(holder, key) {
+ var k, v, value = holder[key];
+ if (value && typeof value === 'object') {
+ for (k in value) {
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
+ v = walk(value, k);
+ if (v !== undefined) {
+ value[k] = v;
+ } else {
+ delete value[k];
+ }
+ }
+ }
+ }
+ return reviver.call(holder, key, value);
+ }
+ text = String(text);
+ cx.lastIndex = 0;
+ if (cx.test(text)) {
+ text = text.replace(cx, function (a) {
+ return '\\u' +
+ ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ });
+ }
+
+ if (/^[\],:{}\s]*$/
+ .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+ j = eval('(' + text + ')');
+
+ return typeof reviver === 'function' ?
+ walk({'': j}, '') : j;
+ }
+
+ throw new SyntaxError('JSON.parse(): invalid or malformed JSON data');
+ };
+}
+/**
+ * @fileoverview Functions for automatically setting up a player
+ * based on the data-setup attribute of the video tag
+ */
+
+// Automatically set up any tags that have a data-setup attribute
+vjs.autoSetup = function(){
+ var options, vid, player,
+ vids = document.getElementsByTagName('video');
+
+ // Check if any media elements exist
+ if (vids && vids.length > 0) {
+
+ for (var i=0,j=vids.length; i<j; i++) {
+ vid = vids[i];
+
+ // Check if element exists, has getAttribute func.
+ // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.
+ if (vid && vid.getAttribute) {
+
+ // Make sure this player hasn't already been set up.
+ if (vid['player'] === undefined) {
+ options = vid.getAttribute('data-setup');
+
+ // Check if data-setup attr exists.
+ // We only auto-setup if they've added the data-setup attr.
+ if (options !== null) {
+
+ // Parse options JSON
+ // If empty string, make it a parsable json object.
+ options = vjs.JSON.parse(options || '{}');
+
+ // Create new video.js instance.
+ player = videojs(vid, options);
+ }
+ }
+
+ // If getAttribute isn't defined, we need to wait for the DOM.
+ } else {
+ vjs.autoSetupTimeout(1);
+ break;
+ }
+ }
+
+ // No videos were found, so keep looping unless page is finisehd loading.
+ } else if (!vjs.windowLoaded) {
+ vjs.autoSetupTimeout(1);
+ }
+};
+
+// Pause to let the DOM keep processing
+vjs.autoSetupTimeout = function(wait){
+ setTimeout(vjs.autoSetup, wait);
+};
+
+if (document.readyState === 'complete') {
+ vjs.windowLoaded = true;
+} else {
+ vjs.one(window, 'load', function(){
+ vjs.windowLoaded = true;
+ });
+}
+
+// Run Auto-load players
+// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)
+vjs.autoSetupTimeout(1);
+vjs.plugin = function(name, init){
+ vjs.Player.prototype[name] = init;
+};
diff --git a/extlib/video-js/video.js b/extlib/video-js/video.js
new file mode 100644
index 00000000..8c2621d6
--- /dev/null
+++ b/extlib/video-js/video.js
@@ -0,0 +1,127 @@
+/*! Video.js v4.2.1 Copyright 2013 Brightcove, Inc. https://github.com/videojs/video.js/blob/master/LICENSE */ (function() {var b=void 0,f=!0,j=null,l=!1;function m(){return function(){}}function p(a){return function(){return this[a]}}function q(a){return function(){return a}}var t;document.createElement("video");document.createElement("audio");document.createElement("track");function u(a,c,d){if("string"===typeof a){0===a.indexOf("#")&&(a=a.slice(1));if(u.wa[a])return u.wa[a];a=u.v(a)}if(!a||!a.nodeName)throw new TypeError("The element or ID supplied is not valid. (videojs)");return a.player||new u.w(a,c,d)}var v=u;
+window.Qd=window.Rd=u;u.Rb="4.2";u.Bc="https:"==document.location.protocol?"https://":"http://";u.options={techOrder:["html5","flash"],html5:{},flash:{},width:300,height:150,defaultVolume:0,children:{mediaLoader:{},posterImage:{},textTrackDisplay:{},loadingSpinner:{},bigPlayButton:{},controlBar:{}},notSupportedMessage:'Sorry, no compatible source and playback technology were found for this video. Try using another browser like <a href="http://bit.ly/ccMUEC">Chrome</a> or download the latest <a href="http://adobe.ly/mwfN1">Adobe Flash Player</a>.'};
+"GENERATED_CDN_VSN"!==u.Rb&&(v.options.flash.swf=u.Bc+"vjs.zencdn.net/"+u.Rb+"/video-js.swf");u.wa={};u.ka=u.CoreObject=m();u.ka.extend=function(a){var c,d;a=a||{};c=a.init||a.i||this.prototype.init||this.prototype.i||m();d=function(){c.apply(this,arguments)};d.prototype=u.k.create(this.prototype);d.prototype.constructor=d;d.extend=u.ka.extend;d.create=u.ka.create;for(var e in a)a.hasOwnProperty(e)&&(d.prototype[e]=a[e]);return d};
+u.ka.create=function(){var a=u.k.create(this.prototype);this.apply(a,arguments);return a};u.d=function(a,c,d){var e=u.getData(a);e.z||(e.z={});e.z[c]||(e.z[c]=[]);d.s||(d.s=u.s++);e.z[c].push(d);e.W||(e.disabled=l,e.W=function(c){if(!e.disabled){c=u.gc(c);var d=e.z[c.type];if(d)for(var d=d.slice(0),k=0,r=d.length;k<r&&!c.lc();k++)d[k].call(a,c)}});1==e.z[c].length&&(document.addEventListener?a.addEventListener(c,e.W,l):document.attachEvent&&a.attachEvent("on"+c,e.W))};
+u.n=function(a,c,d){if(u.kc(a)){var e=u.getData(a);if(e.z)if(c){var g=e.z[c];if(g){if(d){if(d.s)for(e=0;e<g.length;e++)g[e].s===d.s&&g.splice(e--,1)}else e.z[c]=[];u.dc(a,c)}}else for(g in e.z)c=g,e.z[c]=[],u.dc(a,c)}};u.dc=function(a,c){var d=u.getData(a);0===d.z[c].length&&(delete d.z[c],document.removeEventListener?a.removeEventListener(c,d.W,l):document.detachEvent&&a.detachEvent("on"+c,d.W));u.Ab(d.z)&&(delete d.z,delete d.W,delete d.disabled);u.Ab(d)&&u.qc(a)};
+u.gc=function(a){function c(){return f}function d(){return l}if(!a||!a.Bb){var e=a||window.event;a={};for(var g in e)"layerX"!==g&&"layerY"!==g&&(a[g]=e[g]);a.target||(a.target=a.srcElement||document);a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;a.preventDefault=function(){e.preventDefault&&e.preventDefault();a.returnValue=l;a.zb=c};a.zb=d;a.stopPropagation=function(){e.stopPropagation&&e.stopPropagation();a.cancelBubble=f;a.Bb=c};a.Bb=d;a.stopImmediatePropagation=function(){e.stopImmediatePropagation&&
+e.stopImmediatePropagation();a.lc=c;a.stopPropagation()};a.lc=d;if(a.clientX!=j){g=document.documentElement;var h=document.body;a.pageX=a.clientX+(g&&g.scrollLeft||h&&h.scrollLeft||0)-(g&&g.clientLeft||h&&h.clientLeft||0);a.pageY=a.clientY+(g&&g.scrollTop||h&&h.scrollTop||0)-(g&&g.clientTop||h&&h.clientTop||0)}a.which=a.charCode||a.keyCode;a.button!=j&&(a.button=a.button&1?0:a.button&4?1:a.button&2?2:0)}return a};
+u.j=function(a,c){var d=u.kc(a)?u.getData(a):{},e=a.parentNode||a.ownerDocument;"string"===typeof c&&(c={type:c,target:a});c=u.gc(c);d.W&&d.W.call(a,c);if(e&&!c.Bb()&&c.bubbles!==l)u.j(e,c);else if(!e&&!c.zb()&&(d=u.getData(c.target),c.target[c.type])){d.disabled=f;if("function"===typeof c.target[c.type])c.target[c.type]();d.disabled=l}return!c.zb()};u.U=function(a,c,d){function e(){u.n(a,c,e);d.apply(this,arguments)}e.s=d.s=d.s||u.s++;u.d(a,c,e)};var w=Object.prototype.hasOwnProperty;
+u.e=function(a,c){var d,e;d=document.createElement(a||"div");for(e in c)w.call(c,e)&&(-1!==e.indexOf("aria-")||"role"==e?d.setAttribute(e,c[e]):d[e]=c[e]);return d};u.$=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};u.k={};u.k.create=Object.create||function(a){function c(){}c.prototype=a;return new c};u.k.ta=function(a,c,d){for(var e in a)w.call(a,e)&&c.call(d||this,e,a[e])};u.k.B=function(a,c){if(!c)return a;for(var d in c)w.call(c,d)&&(a[d]=c[d]);return a};
+u.k.fc=function(a,c){var d,e,g;a=u.k.copy(a);for(d in c)w.call(c,d)&&(e=a[d],g=c[d],a[d]=u.k.mc(e)&&u.k.mc(g)?u.k.fc(e,g):c[d]);return a};u.k.copy=function(a){return u.k.B({},a)};u.k.mc=function(a){return!!a&&"object"===typeof a&&"[object Object]"===a.toString()&&a.constructor===Object};u.bind=function(a,c,d){function e(){return c.apply(a,arguments)}c.s||(c.s=u.s++);e.s=d?d+"_"+c.s:c.s;return e};u.qa={};u.s=1;u.expando="vdata"+(new Date).getTime();
+u.getData=function(a){var c=a[u.expando];c||(c=a[u.expando]=u.s++,u.qa[c]={});return u.qa[c]};u.kc=function(a){a=a[u.expando];return!(!a||u.Ab(u.qa[a]))};u.qc=function(a){var c=a[u.expando];if(c){delete u.qa[c];try{delete a[u.expando]}catch(d){a.removeAttribute?a.removeAttribute(u.expando):a[u.expando]=j}}};u.Ab=function(a){for(var c in a)if(a[c]!==j)return l;return f};u.m=function(a,c){-1==(" "+a.className+" ").indexOf(" "+c+" ")&&(a.className=""===a.className?c:a.className+" "+c)};
+u.t=function(a,c){var d,e;if(-1!=a.className.indexOf(c)){d=a.className.split(" ");for(e=d.length-1;0<=e;e--)d[e]===c&&d.splice(e,1);a.className=d.join(" ")}};u.ma=u.e("video");u.G=navigator.userAgent;u.Hc=/iPhone/i.test(u.G);u.Gc=/iPad/i.test(u.G);u.Ic=/iPod/i.test(u.G);u.Fc=u.Hc||u.Gc||u.Ic;var aa=u,x;var y=u.G.match(/OS (\d+)_/i);x=y&&y[1]?y[1]:b;aa.Cd=x;u.Dc=/Android/i.test(u.G);var ba=u,z;var A=u.G.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),B,C;
+A?(B=A[1]&&parseFloat(A[1]),C=A[2]&&parseFloat(A[2]),z=B&&C?parseFloat(A[1]+"."+A[2]):B?B:j):z=j;ba.Cc=z;u.Jc=u.Dc&&/webkit/i.test(u.G)&&2.3>u.Cc;u.Ec=/Firefox/i.test(u.G);u.Dd=/Chrome/i.test(u.G);u.Mc="ontouchstart"in window;u.wb=function(a){var c,d,e,g;c={};if(a&&a.attributes&&0<a.attributes.length){d=a.attributes;for(var h=d.length-1;0<=h;h--){e=d[h].name;g=d[h].value;if("boolean"===typeof a[e]||-1!==",autoplay,controls,loop,muted,default,".indexOf(","+e+","))g=g!==j?f:l;c[e]=g}}return c};
+u.Hd=function(a,c){var d="";document.defaultView&&document.defaultView.getComputedStyle?d=document.defaultView.getComputedStyle(a,"").getPropertyValue(c):a.currentStyle&&(d=a["client"+c.substr(0,1).toUpperCase()+c.substr(1)]+"px");return d};u.yb=function(a,c){c.firstChild?c.insertBefore(a,c.firstChild):c.appendChild(a)};u.Nb={};u.v=function(a){0===a.indexOf("#")&&(a=a.slice(1));return document.getElementById(a)};
+u.Ka=function(a,c){c=c||a;var d=Math.floor(a%60),e=Math.floor(a/60%60),g=Math.floor(a/3600),h=Math.floor(c/60%60),k=Math.floor(c/3600);if(isNaN(a)||Infinity===a)g=e=d="-";g=0<g||0<k?g+":":"";return g+(((g||10<=h)&&10>e?"0"+e:e)+":")+(10>d?"0"+d:d)};u.Pc=function(){document.body.focus();document.onselectstart=q(l)};u.yd=function(){document.onselectstart=q(f)};u.trim=function(a){return(a+"").replace(/^\s+|\s+$/g,"")};u.round=function(a,c){c||(c=0);return Math.round(a*Math.pow(10,c))/Math.pow(10,c)};
+u.sb=function(a,c){return{length:1,start:function(){return a},end:function(){return c}}};
+u.get=function(a,c,d){var e,g;"undefined"===typeof XMLHttpRequest&&(window.XMLHttpRequest=function(){try{return new window.ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new window.ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new window.ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw Error("This browser does not support XMLHttpRequest.");});g=new XMLHttpRequest;try{g.open("GET",a)}catch(h){d(h)}e=0===a.indexOf("file:")||0===window.location.href.indexOf("file:")&&-1===a.indexOf("http");
+g.onreadystatechange=function(){4===g.readyState&&(200===g.status||e&&0===g.status?c(g.responseText):d&&d())};try{g.send()}catch(k){d&&d(k)}};u.qd=function(a){try{var c=window.localStorage||l;c&&(c.volume=a)}catch(d){22==d.code||1014==d.code?u.log("LocalStorage Full (VideoJS)",d):18==d.code?u.log("LocalStorage not allowed (VideoJS)",d):u.log("LocalStorage Error (VideoJS)",d)}};u.ic=function(a){a.match(/^https?:\/\//)||(a=u.e("div",{innerHTML:'<a href="'+a+'">x</a>'}).firstChild.href);return a};
+u.log=function(){u.log.history=u.log.history||[];u.log.history.push(arguments);window.console&&window.console.log(Array.prototype.slice.call(arguments))};u.Xc=function(a){var c,d;a.getBoundingClientRect&&a.parentNode&&(c=a.getBoundingClientRect());if(!c)return{left:0,top:0};a=document.documentElement;d=document.body;return{left:c.left+(window.pageXOffset||d.scrollLeft)-(a.clientLeft||d.clientLeft||0),top:c.top+(window.pageYOffset||d.scrollTop)-(a.clientTop||d.clientTop||0)}};
+u.c=u.ka.extend({i:function(a,c,d){this.b=a;this.g=u.k.copy(this.g);c=this.options(c);this.Q=c.id||(c.el&&c.el.id?c.el.id:a.id()+"_component_"+u.s++);this.cd=c.name||j;this.a=c.el||this.e();this.H=[];this.pb={};this.V={};if((a=this.g)&&a.children){var e=this;u.k.ta(a.children,function(a,c){c!==l&&!c.loadEvent&&(e[a]=e.Z(a,c))})}this.M(d)}});t=u.c.prototype;
+t.D=function(){this.j("dispose");if(this.H)for(var a=this.H.length-1;0<=a;a--)this.H[a].D&&this.H[a].D();this.V=this.pb=this.H=j;this.n();this.a.parentNode&&this.a.parentNode.removeChild(this.a);u.qc(this.a);this.a=j};t.L=p("b");t.options=function(a){return a===b?this.g:this.g=u.k.fc(this.g,a)};t.e=function(a,c){return u.e(a,c)};t.v=p("a");t.id=p("Q");t.name=p("cd");t.children=p("H");
+t.Z=function(a,c){var d,e;"string"===typeof a?(e=a,c=c||{},d=c.componentClass||u.$(e),c.name=e,d=new window.videojs[d](this.b||this,c)):d=a;this.H.push(d);"function"===typeof d.id&&(this.pb[d.id()]=d);(e=e||d.name&&d.name())&&(this.V[e]=d);"function"===typeof d.el&&d.el()&&(this.ra||this.a).appendChild(d.el());return d};
+t.removeChild=function(a){"string"===typeof a&&(a=this.V[a]);if(a&&this.H){for(var c=l,d=this.H.length-1;0<=d;d--)if(this.H[d]===a){c=f;this.H.splice(d,1);break}c&&(this.pb[a.id]=j,this.V[a.name]=j,(c=a.v())&&c.parentNode===(this.ra||this.a)&&(this.ra||this.a).removeChild(a.v()))}};t.T=q("");t.d=function(a,c){u.d(this.a,a,u.bind(this,c));return this};t.n=function(a,c){u.n(this.a,a,c);return this};t.U=function(a,c){u.U(this.a,a,u.bind(this,c));return this};t.j=function(a,c){u.j(this.a,a,c);return this};
+t.M=function(a){a&&(this.aa?a.call(this):(this.Ra===b&&(this.Ra=[]),this.Ra.push(a)));return this};t.Ta=function(){this.aa=f;var a=this.Ra;if(a&&0<a.length){for(var c=0,d=a.length;c<d;c++)a[c].call(this);this.Ra=[];this.j("ready")}};t.m=function(a){u.m(this.a,a);return this};t.t=function(a){u.t(this.a,a);return this};t.show=function(){this.a.style.display="block";return this};t.C=function(){this.a.style.display="none";return this};function D(a){a.t("vjs-lock-showing")}
+t.disable=function(){this.C();this.show=m()};t.width=function(a,c){return E(this,"width",a,c)};t.height=function(a,c){return E(this,"height",a,c)};t.Tc=function(a,c){return this.width(a,f).height(c)};function E(a,c,d,e){if(d!==b)return a.a.style[c]=-1!==(""+d).indexOf("%")||-1!==(""+d).indexOf("px")?d:"auto"===d?"":d+"px",e||a.j("resize"),a;if(!a.a)return 0;d=a.a.style[c];e=d.indexOf("px");return-1!==e?parseInt(d.slice(0,e),10):parseInt(a.a["offset"+u.$(c)],10)}
+u.q=u.c.extend({i:function(a,c){u.c.call(this,a,c);var d=l;this.d("touchstart",function(a){a.preventDefault();d=f});this.d("touchmove",function(){d=l});var e=this;this.d("touchend",function(a){d&&e.p(a);a.preventDefault()});this.d("click",this.p);this.d("focus",this.Na);this.d("blur",this.Ma)}});t=u.q.prototype;
+t.e=function(a,c){c=u.k.B({className:this.T(),innerHTML:'<div class="vjs-control-content"><span class="vjs-control-text">'+(this.pa||"Need Text")+"</span></div>",nd:"button","aria-live":"polite",tabIndex:0},c);return u.c.prototype.e.call(this,a,c)};t.T=function(){return"vjs-control "+u.c.prototype.T.call(this)};t.p=m();t.Na=function(){u.d(document,"keyup",u.bind(this,this.ba))};t.ba=function(a){if(32==a.which||13==a.which)a.preventDefault(),this.p()};
+t.Ma=function(){u.n(document,"keyup",u.bind(this,this.ba))};u.O=u.c.extend({i:function(a,c){u.c.call(this,a,c);this.Oc=this.V[this.g.barName];this.handle=this.V[this.g.handleName];a.d(this.oc,u.bind(this,this.update));this.d("mousedown",this.Oa);this.d("touchstart",this.Oa);this.d("focus",this.Na);this.d("blur",this.Ma);this.d("click",this.p);this.b.d("controlsvisible",u.bind(this,this.update));a.M(u.bind(this,this.update));this.P={}}});t=u.O.prototype;
+t.e=function(a,c){c=c||{};c.className+=" vjs-slider";c=u.k.B({nd:"slider","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,tabIndex:0},c);return u.c.prototype.e.call(this,a,c)};t.Oa=function(a){a.preventDefault();u.Pc();this.P.move=u.bind(this,this.Gb);this.P.end=u.bind(this,this.Hb);u.d(document,"mousemove",this.P.move);u.d(document,"mouseup",this.P.end);u.d(document,"touchmove",this.P.move);u.d(document,"touchend",this.P.end);this.Gb(a)};
+t.Hb=function(){u.yd();u.n(document,"mousemove",this.P.move,l);u.n(document,"mouseup",this.P.end,l);u.n(document,"touchmove",this.P.move,l);u.n(document,"touchend",this.P.end,l);this.update()};t.update=function(){if(this.a){var a,c=this.xb(),d=this.handle,e=this.Oc;isNaN(c)&&(c=0);a=c;if(d){a=this.a.offsetWidth;var g=d.v().offsetWidth;a=g?g/a:0;c*=1-a;a=c+a/2;d.v().style.left=u.round(100*c,2)+"%"}e.v().style.width=u.round(100*a,2)+"%"}};
+function F(a,c){var d,e,g,h;d=a.a;e=u.Xc(d);h=g=d.offsetWidth;d=a.handle;if(a.g.zd)return h=e.top,e=c.changedTouches?c.changedTouches[0].pageY:c.pageY,d&&(d=d.v().offsetHeight,h+=d/2,g-=d),Math.max(0,Math.min(1,(h-e+g)/g));g=e.left;e=c.changedTouches?c.changedTouches[0].pageX:c.pageX;d&&(d=d.v().offsetWidth,g+=d/2,h-=d);return Math.max(0,Math.min(1,(e-g)/h))}t.Na=function(){u.d(document,"keyup",u.bind(this,this.ba))};
+t.ba=function(a){37==a.which?(a.preventDefault(),this.uc()):39==a.which&&(a.preventDefault(),this.vc())};t.Ma=function(){u.n(document,"keyup",u.bind(this,this.ba))};t.p=function(a){a.stopImmediatePropagation();a.preventDefault()};u.ea=u.c.extend();u.ea.prototype.defaultValue=0;u.ea.prototype.e=function(a,c){c=c||{};c.className+=" vjs-slider-handle";c=u.k.B({innerHTML:'<span class="vjs-control-text">'+this.defaultValue+"</span>"},c);return u.c.prototype.e.call(this,"div",c)};u.la=u.c.extend();
+function ca(a,c){a.Z(c);c.d("click",u.bind(a,function(){D(this)}))}u.la.prototype.e=function(){var a=this.options().Rc||"ul";this.ra=u.e(a,{className:"vjs-menu-content"});a=u.c.prototype.e.call(this,"div",{append:this.ra,className:"vjs-menu"});a.appendChild(this.ra);u.d(a,"click",function(a){a.preventDefault();a.stopImmediatePropagation()});return a};u.N=u.q.extend({i:function(a,c){u.q.call(this,a,c);this.selected(c.selected)}});
+u.N.prototype.e=function(a,c){return u.q.prototype.e.call(this,"li",u.k.B({className:"vjs-menu-item",innerHTML:this.g.label},c))};u.N.prototype.p=function(){this.selected(f)};u.N.prototype.selected=function(a){a?(this.m("vjs-selected"),this.a.setAttribute("aria-selected",f)):(this.t("vjs-selected"),this.a.setAttribute("aria-selected",l))};
+u.R=u.q.extend({i:function(a,c){u.q.call(this,a,c);this.va=this.Ja();this.Z(this.va);this.J&&0===this.J.length&&this.C();this.d("keyup",this.ba);this.a.setAttribute("aria-haspopup",f);this.a.setAttribute("role","button")}});t=u.R.prototype;t.oa=l;t.Ja=function(){var a=new u.la(this.b);this.options().title&&a.v().appendChild(u.e("li",{className:"vjs-menu-title",innerHTML:u.$(this.A),wd:-1}));if(this.J=this.createItems())for(var c=0;c<this.J.length;c++)ca(a,this.J[c]);return a};t.sa=m();
+t.T=function(){return this.className+" vjs-menu-button "+u.q.prototype.T.call(this)};t.Na=m();t.Ma=m();t.p=function(){this.U("mouseout",u.bind(this,function(){D(this.va);this.a.blur()}));this.oa?G(this):H(this)};t.ba=function(a){a.preventDefault();32==a.which||13==a.which?this.oa?G(this):H(this):27==a.which&&this.oa&&G(this)};function H(a){a.oa=f;a.va.m("vjs-lock-showing");a.a.setAttribute("aria-pressed",f);a.J&&0<a.J.length&&a.J[0].v().focus()}
+function G(a){a.oa=l;D(a.va);a.a.setAttribute("aria-pressed",l)}
+u.w=u.c.extend({i:function(a,c,d){this.F=a;c=u.k.B(da(a),c);this.u={};this.pc=c.poster;this.rb=c.controls;a.controls=l;u.c.call(this,this,c,d);this.controls()?this.m("vjs-controls-enabled"):this.m("vjs-controls-disabled");this.U("play",function(a){u.j(this.a,{type:"firstplay",target:this.a})||(a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation())});this.d("ended",this.ed);this.d("play",this.Jb);this.d("firstplay",this.fd);this.d("pause",this.Ib);this.d("progress",this.hd);this.d("durationchange",
+this.dd);this.d("error",this.Fb);this.d("fullscreenchange",this.gd);u.wa[this.Q]=this;c.plugins&&u.k.ta(c.plugins,function(a,c){this[a](c)},this);var e,g,h,k;e=this.rc;a=function(){e();clearInterval(g);g=setInterval(u.bind(this,e),250)};c=function(){e();clearInterval(g)};this.d("mousedown",a);this.d("mousemove",e);this.d("mouseup",c);this.d("keydown",e);this.d("keyup",e);this.d("touchstart",a);this.d("touchmove",e);this.d("touchend",c);this.d("touchcancel",c);h=setInterval(u.bind(this,function(){this.ja&&
+(this.ja=l,I(this,f),clearTimeout(k),k=setTimeout(u.bind(this,function(){this.ja||I(this,l)}),2E3))}),250);this.d("dispose",function(){clearInterval(h);clearTimeout(k)})}});t=u.w.prototype;t.g=u.options;t.D=function(){this.j("dispose");this.n("dispose");u.wa[this.Q]=j;this.F&&this.F.player&&(this.F.player=j);this.a&&this.a.player&&(this.a.player=j);clearInterval(this.Qa);this.ya();this.h&&this.h.D();u.c.prototype.D.call(this)};
+function da(a){var c={sources:[],tracks:[]};u.k.B(c,u.wb(a));if(a.hasChildNodes()){var d,e,g,h;a=a.childNodes;g=0;for(h=a.length;g<h;g++)d=a[g],e=d.nodeName.toLowerCase(),"source"===e?c.sources.push(u.wb(d)):"track"===e&&c.tracks.push(u.wb(d))}return c}
+t.e=function(){var a=this.a=u.c.prototype.e.call(this,"div"),c=this.F;c.removeAttribute("width");c.removeAttribute("height");if(c.hasChildNodes()){var d,e,g,h,k;d=c.childNodes;e=d.length;for(k=[];e--;)g=d[e],h=g.nodeName.toLowerCase(),("source"===h||"track"===h)&&k.push(g);for(d=0;d<k.length;d++)c.removeChild(k[d])}c.id=c.id||"vjs_video_"+u.s++;a.id=c.id;a.className=c.className;c.id+="_html5_api";c.className="vjs-tech";c.player=a.player=this;this.m("vjs-paused");this.width(this.g.width,f);this.height(this.g.height,
+f);c.parentNode&&c.parentNode.insertBefore(a,c);u.yb(c,a);return a};
+function J(a,c,d){a.h?(a.aa=l,a.h.D(),a.Db&&(a.Db=l,clearInterval(a.Qa)),a.Eb&&K(a),a.h=l):"Html5"!==c&&a.F&&(a.a.removeChild(a.F),a.F.player=j,a.F=j);a.ia=c;a.aa=l;var e=u.k.B({source:d,parentEl:a.a},a.g[c.toLowerCase()]);d&&(d.src==a.u.src&&0<a.u.currentTime&&(e.startTime=a.u.currentTime),a.u.src=d.src);a.h=new window.videojs[c](a,e);a.h.M(function(){this.b.Ta();if(!this.l.progressEvents){var a=this.b;a.Db=f;a.Qa=setInterval(u.bind(a,function(){this.u.kb<this.buffered().end(0)?this.j("progress"):
+1==this.Ia()&&(clearInterval(this.Qa),this.j("progress"))}),500);a.h.U("progress",function(){this.l.progressEvents=f;var a=this.b;a.Db=l;clearInterval(a.Qa)})}this.l.timeupdateEvents||(a=this.b,a.Eb=f,a.d("play",a.yc),a.d("pause",a.ya),a.h.U("timeupdate",function(){this.l.timeupdateEvents=f;K(this.b)}))})}function K(a){a.Eb=l;a.ya();a.n("play",a.yc);a.n("pause",a.ya)}t.yc=function(){this.ec&&this.ya();this.ec=setInterval(u.bind(this,function(){this.j("timeupdate")}),250)};t.ya=function(){clearInterval(this.ec)};
+t.ed=function(){this.g.loop&&(this.currentTime(0),this.play())};t.Jb=function(){u.t(this.a,"vjs-paused");u.m(this.a,"vjs-playing")};t.fd=function(){this.g.starttime&&this.currentTime(this.g.starttime);this.m("vjs-has-started")};t.Ib=function(){u.t(this.a,"vjs-playing");u.m(this.a,"vjs-paused")};t.hd=function(){1==this.Ia()&&this.j("loadedalldata")};t.dd=function(){this.duration(L(this,"duration"))};t.Fb=function(a){u.log("Video Error",a)};t.gd=function(){this.I?this.m("vjs-fullscreen"):this.t("vjs-fullscreen")};
+function M(a,c,d){if(a.h&&!a.h.aa)a.h.M(function(){this[c](d)});else try{a.h[c](d)}catch(e){throw u.log(e),e;}}function L(a,c){if(a.h&&a.h.aa)try{return a.h[c]()}catch(d){throw a.h[c]===b?u.log("Video.js: "+c+" method not defined for "+a.ia+" playback technology.",d):"TypeError"==d.name?(u.log("Video.js: "+c+" unavailable on "+a.ia+" playback technology element.",d),a.h.aa=l):u.log(d),d;}}t.play=function(){M(this,"play");return this};t.pause=function(){M(this,"pause");return this};
+t.paused=function(){return L(this,"paused")===l?l:f};t.currentTime=function(a){return a!==b?(this.u.nc=a,M(this,"setCurrentTime",a),this.Eb&&this.j("timeupdate"),this):this.u.currentTime=L(this,"currentTime")||0};t.duration=function(a){return a!==b?(this.u.duration=parseFloat(a),this):this.u.duration};t.buffered=function(){var a=L(this,"buffered"),c=a.length-1,d=this.u.kb=this.u.kb||0;a&&(0<=c&&a.end(c)!==d)&&(d=a.end(c),this.u.kb=d);return u.sb(0,d)};
+t.Ia=function(){return this.duration()?this.buffered().end(0)/this.duration():0};t.volume=function(a){if(a!==b)return a=Math.max(0,Math.min(1,parseFloat(a))),this.u.volume=a,M(this,"setVolume",a),u.qd(a),this;a=parseFloat(L(this,"volume"));return isNaN(a)?1:a};t.muted=function(a){return a!==b?(M(this,"setMuted",a),this):L(this,"muted")||l};t.Sa=function(){return L(this,"supportsFullScreen")||l};
+t.xa=function(){var a=u.Nb.xa;this.I=f;a?(u.d(document,a.ub,u.bind(this,function(c){this.I=document[a.I];this.I===l&&u.n(document,a.ub,arguments.callee);this.j("fullscreenchange")})),this.a[a.sc]()):this.h.Sa()?M(this,"enterFullScreen"):(this.Zc=f,this.Uc=document.documentElement.style.overflow,u.d(document,"keydown",u.bind(this,this.hc)),document.documentElement.style.overflow="hidden",u.m(document.body,"vjs-full-window"),this.j("enterFullWindow"),this.j("fullscreenchange"));return this};
+t.nb=function(){var a=u.Nb.xa;this.I=l;if(a)document[a.mb]();else this.h.Sa()?M(this,"exitFullScreen"):(N(this),this.j("fullscreenchange"));return this};t.hc=function(a){27===a.keyCode&&(this.I===f?this.nb():N(this))};function N(a){a.Zc=l;u.n(document,"keydown",a.hc);document.documentElement.style.overflow=a.Uc;u.t(document.body,"vjs-full-window");a.j("exitFullWindow")}
+t.src=function(a){if(a instanceof Array){var c;a:{c=a;for(var d=0,e=this.g.techOrder;d<e.length;d++){var g=u.$(e[d]),h=window.videojs[g];if(h.isSupported())for(var k=0,r=c;k<r.length;k++){var n=r[k];if(h.canPlaySource(n)){c={source:n,h:g};break a}}}c=l}c?(a=c.source,c=c.h,c==this.ia?this.src(a):J(this,c,a)):this.a.appendChild(u.e("p",{innerHTML:this.options().notSupportedMessage}))}else a instanceof Object?window.videojs[this.ia].canPlaySource(a)?this.src(a.src):this.src([a]):(this.u.src=a,this.aa?
+(M(this,"src",a),"auto"==this.g.preload&&this.load(),this.g.autoplay&&this.play()):this.M(function(){this.src(a)}));return this};t.load=function(){M(this,"load");return this};t.currentSrc=function(){return L(this,"currentSrc")||this.u.src||""};t.Pa=function(a){return a!==b?(M(this,"setPreload",a),this.g.preload=a,this):L(this,"preload")};t.autoplay=function(a){return a!==b?(M(this,"setAutoplay",a),this.g.autoplay=a,this):L(this,"autoplay")};
+t.loop=function(a){return a!==b?(M(this,"setLoop",a),this.g.loop=a,this):L(this,"loop")};t.poster=function(a){a!==b&&(this.pc=a);return this.pc};t.controls=function(a){return a!==b?(a=!!a,this.rb!==a&&((this.rb=a)?(this.t("vjs-controls-disabled"),this.m("vjs-controls-enabled"),this.j("controlsenabled")):(this.t("vjs-controls-enabled"),this.m("vjs-controls-disabled"),this.j("controlsdisabled"))),this):this.rb};u.w.prototype.Qb;t=u.w.prototype;
+t.Pb=function(a){return a!==b?(a=!!a,this.Qb!==a&&((this.Qb=a)?(this.m("vjs-using-native-controls"),this.j("usingnativecontrols")):(this.t("vjs-using-native-controls"),this.j("usingcustomcontrols"))),this):this.Qb};t.error=function(){return L(this,"error")};t.seeking=function(){return L(this,"seeking")};t.ja=f;t.rc=function(){this.ja=f};t.Ob=f;
+function I(a,c){return c!==b?(c=!!c,c!==a.Ob&&((a.Ob=c)?(a.ja=f,a.t("vjs-user-inactive"),a.m("vjs-user-active"),a.j("useractive")):(a.ja=l,a.h.U("mousemove",function(a){a.stopPropagation();a.preventDefault()}),a.t("vjs-user-active"),a.m("vjs-user-inactive"),a.j("userinactive"))),a):a.Ob}var O,P,Q;Q=document.createElement("div");P={};
+Q.Ed!==b?(P.sc="requestFullscreen",P.mb="exitFullscreen",P.ub="fullscreenchange",P.I="fullScreen"):(document.mozCancelFullScreen?(O="moz",P.I=O+"FullScreen"):(O="webkit",P.I=O+"IsFullScreen"),Q[O+"RequestFullScreen"]&&(P.sc=O+"RequestFullScreen",P.mb=O+"CancelFullScreen"),P.ub=O+"fullscreenchange");document[P.mb]&&(u.Nb.xa=P);u.Ea=u.c.extend();
+u.Ea.prototype.g={Jd:"play",children:{playToggle:{},currentTimeDisplay:{},timeDivider:{},durationDisplay:{},remainingTimeDisplay:{},progressControl:{},fullscreenToggle:{},volumeControl:{},muteToggle:{}}};u.Ea.prototype.e=function(){return u.e("div",{className:"vjs-control-bar"})};u.Wb=u.q.extend({i:function(a,c){u.q.call(this,a,c);a.d("play",u.bind(this,this.Jb));a.d("pause",u.bind(this,this.Ib))}});t=u.Wb.prototype;t.pa="Play";t.T=function(){return"vjs-play-control "+u.q.prototype.T.call(this)};
+t.p=function(){this.b.paused()?this.b.play():this.b.pause()};t.Jb=function(){u.t(this.a,"vjs-paused");u.m(this.a,"vjs-playing");this.a.children[0].children[0].innerHTML="Pause"};t.Ib=function(){u.t(this.a,"vjs-playing");u.m(this.a,"vjs-paused");this.a.children[0].children[0].innerHTML="Play"};u.Xa=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ba))}});
+u.Xa.prototype.e=function(){var a=u.c.prototype.e.call(this,"div",{className:"vjs-current-time vjs-time-controls vjs-control"});this.content=u.e("div",{className:"vjs-current-time-display",innerHTML:'<span class="vjs-control-text">Current Time </span>0:00',"aria-live":"off"});a.appendChild(u.e("div").appendChild(this.content));return a};
+u.Xa.prototype.Ba=function(){var a=this.b.Lb?this.b.u.currentTime:this.b.currentTime();this.content.innerHTML='<span class="vjs-control-text">Current Time </span>'+u.Ka(a,this.b.duration())};u.Ya=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ba))}});
+u.Ya.prototype.e=function(){var a=u.c.prototype.e.call(this,"div",{className:"vjs-duration vjs-time-controls vjs-control"});this.content=u.e("div",{className:"vjs-duration-display",innerHTML:'<span class="vjs-control-text">Duration Time </span>0:00',"aria-live":"off"});a.appendChild(u.e("div").appendChild(this.content));return a};u.Ya.prototype.Ba=function(){var a=this.b.duration();a&&(this.content.innerHTML='<span class="vjs-control-text">Duration Time </span>'+u.Ka(a))};
+u.$b=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.$b.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-time-divider",innerHTML:"<div><span>/</span></div>"})};u.eb=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ba))}});
+u.eb.prototype.e=function(){var a=u.c.prototype.e.call(this,"div",{className:"vjs-remaining-time vjs-time-controls vjs-control"});this.content=u.e("div",{className:"vjs-remaining-time-display",innerHTML:'<span class="vjs-control-text">Remaining Time </span>-0:00',"aria-live":"off"});a.appendChild(u.e("div").appendChild(this.content));return a};u.eb.prototype.Ba=function(){this.b.duration()&&(this.content.innerHTML='<span class="vjs-control-text">Remaining Time </span>-'+u.Ka(this.b.duration()-this.b.currentTime()))};
+u.Fa=u.q.extend({i:function(a,c){u.q.call(this,a,c)}});u.Fa.prototype.pa="Fullscreen";u.Fa.prototype.T=function(){return"vjs-fullscreen-control "+u.q.prototype.T.call(this)};u.Fa.prototype.p=function(){this.b.I?(this.b.nb(),this.a.children[0].children[0].innerHTML="Fullscreen"):(this.b.xa(),this.a.children[0].children[0].innerHTML="Non-Fullscreen")};u.cb=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.cb.prototype.g={children:{seekBar:{}}};
+u.cb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-progress-control vjs-control"})};u.Xb=u.O.extend({i:function(a,c){u.O.call(this,a,c);a.d("timeupdate",u.bind(this,this.Aa));a.M(u.bind(this,this.Aa))}});t=u.Xb.prototype;t.g={children:{loadProgressBar:{},playProgressBar:{},seekHandle:{}},barName:"playProgressBar",handleName:"seekHandle"};t.oc="timeupdate";t.e=function(){return u.O.prototype.e.call(this,"div",{className:"vjs-progress-holder","aria-label":"video progress bar"})};
+t.Aa=function(){var a=this.b.Lb?this.b.u.currentTime:this.b.currentTime();this.a.setAttribute("aria-valuenow",u.round(100*this.xb(),2));this.a.setAttribute("aria-valuetext",u.Ka(a,this.b.duration()))};t.xb=function(){var a;"Flash"===this.b.ia&&this.b.seeking()?(a=this.b.u,a=a.nc?a.nc:this.b.currentTime()):a=this.b.currentTime();return a/this.b.duration()};t.Oa=function(a){u.O.prototype.Oa.call(this,a);this.b.Lb=f;this.Ad=!this.b.paused();this.b.pause()};
+t.Gb=function(a){a=F(this,a)*this.b.duration();a==this.b.duration()&&(a-=0.1);this.b.currentTime(a)};t.Hb=function(a){u.O.prototype.Hb.call(this,a);this.b.Lb=l;this.Ad&&this.b.play()};t.vc=function(){this.b.currentTime(this.b.currentTime()+5)};t.uc=function(){this.b.currentTime(this.b.currentTime()-5)};u.$a=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("progress",u.bind(this,this.update))}});u.$a.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-load-progress",innerHTML:'<span class="vjs-control-text">Loaded: 0%</span>'})};
+u.$a.prototype.update=function(){this.a.style&&(this.a.style.width=u.round(100*this.b.Ia(),2)+"%")};u.Vb=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.Vb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-play-progress",innerHTML:'<span class="vjs-control-text">Progress: 0%</span>'})};u.fb=u.ea.extend();u.fb.prototype.defaultValue="00:00";u.fb.prototype.e=function(){return u.ea.prototype.e.call(this,"div",{className:"vjs-seek-handle"})};
+u.hb=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.h&&(a.h.l&&a.h.l.volumeControl===l)&&this.m("vjs-hidden");a.d("loadstart",u.bind(this,function(){a.h.l&&a.h.l.volumeControl===l?this.m("vjs-hidden"):this.t("vjs-hidden")}))}});u.hb.prototype.g={children:{volumeBar:{}}};u.hb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-volume-control vjs-control"})};
+u.gb=u.O.extend({i:function(a,c){u.O.call(this,a,c);a.d("volumechange",u.bind(this,this.Aa));a.M(u.bind(this,this.Aa));setTimeout(u.bind(this,this.update),0)}});t=u.gb.prototype;t.Aa=function(){this.a.setAttribute("aria-valuenow",u.round(100*this.b.volume(),2));this.a.setAttribute("aria-valuetext",u.round(100*this.b.volume(),2)+"%")};t.g={children:{volumeLevel:{},volumeHandle:{}},barName:"volumeLevel",handleName:"volumeHandle"};t.oc="volumechange";
+t.e=function(){return u.O.prototype.e.call(this,"div",{className:"vjs-volume-bar","aria-label":"volume level"})};t.Gb=function(a){this.b.volume(F(this,a))};t.xb=function(){return this.b.muted()?0:this.b.volume()};t.vc=function(){this.b.volume(this.b.volume()+0.1)};t.uc=function(){this.b.volume(this.b.volume()-0.1)};u.ac=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.ac.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-volume-level",innerHTML:'<span class="vjs-control-text"></span>'})};
+u.ib=u.ea.extend();u.ib.prototype.defaultValue="00:00";u.ib.prototype.e=function(){return u.ea.prototype.e.call(this,"div",{className:"vjs-volume-handle"})};u.da=u.q.extend({i:function(a,c){u.q.call(this,a,c);a.d("volumechange",u.bind(this,this.update));a.h&&(a.h.l&&a.h.l.volumeControl===l)&&this.m("vjs-hidden");a.d("loadstart",u.bind(this,function(){a.h.l&&a.h.l.volumeControl===l?this.m("vjs-hidden"):this.t("vjs-hidden")}))}});
+u.da.prototype.e=function(){return u.q.prototype.e.call(this,"div",{className:"vjs-mute-control vjs-control",innerHTML:'<div><span class="vjs-control-text">Mute</span></div>'})};u.da.prototype.p=function(){this.b.muted(this.b.muted()?l:f)};
+u.da.prototype.update=function(){var a=this.b.volume(),c=3;0===a||this.b.muted()?c=0:0.33>a?c=1:0.67>a&&(c=2);this.b.muted()?"Unmute"!=this.a.children[0].children[0].innerHTML&&(this.a.children[0].children[0].innerHTML="Unmute"):"Mute"!=this.a.children[0].children[0].innerHTML&&(this.a.children[0].children[0].innerHTML="Mute");for(a=0;4>a;a++)u.t(this.a,"vjs-vol-"+a);u.m(this.a,"vjs-vol-"+c)};
+u.na=u.R.extend({i:function(a,c){u.R.call(this,a,c);a.d("volumechange",u.bind(this,this.update));a.h&&(a.h.l&&a.h.l.zc===l)&&this.m("vjs-hidden");a.d("loadstart",u.bind(this,function(){a.h.l&&a.h.l.zc===l?this.m("vjs-hidden"):this.t("vjs-hidden")}));this.m("vjs-menu-button")}});u.na.prototype.Ja=function(){var a=new u.la(this.b,{Rc:"div"}),c=new u.gb(this.b,u.k.B({zd:f},this.g.Sd));a.Z(c);return a};u.na.prototype.p=function(){u.da.prototype.p.call(this);u.R.prototype.p.call(this)};
+u.na.prototype.e=function(){return u.q.prototype.e.call(this,"div",{className:"vjs-volume-menu-button vjs-menu-button vjs-control",innerHTML:'<div><span class="vjs-control-text">Mute</span></div>'})};u.na.prototype.update=u.da.prototype.update;u.bb=u.q.extend({i:function(a,c){u.q.call(this,a,c);(!a.poster()||!a.controls())&&this.C();a.d("play",u.bind(this,this.C))}});
+u.bb.prototype.e=function(){var a=u.e("div",{className:"vjs-poster",tabIndex:-1}),c=this.b.poster();c&&("backgroundSize"in a.style?a.style.backgroundImage='url("'+c+'")':a.appendChild(u.e("img",{src:c})));return a};u.bb.prototype.p=function(){this.L().controls()&&this.b.play()};
+u.Ub=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("canplay",u.bind(this,this.C));a.d("canplaythrough",u.bind(this,this.C));a.d("playing",u.bind(this,this.C));a.d("seeked",u.bind(this,this.C));a.d("seeking",u.bind(this,this.show));a.d("seeked",u.bind(this,this.C));a.d("error",u.bind(this,this.show));a.d("waiting",u.bind(this,this.show))}});u.Ub.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-loading-spinner"})};u.Va=u.q.extend();
+u.Va.prototype.e=function(){return u.q.prototype.e.call(this,"div",{className:"vjs-big-play-button",innerHTML:"<span></span>","aria-label":"play video"})};u.Va.prototype.p=function(){this.b.play()};
+u.r=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);var e,g;g=this;e=this.L();a=function(){if(e.controls()&&!e.Pb()){var a,c;g.d("mousedown",g.p);g.d("touchstart",function(a){a.preventDefault();a.stopPropagation();c=I(this.b)});a=function(a){a.stopPropagation();c&&this.b.rc()};g.d("touchmove",a);g.d("touchleave",a);g.d("touchcancel",a);g.d("touchend",a);var d,n,s;d=0;g.d("touchstart",function(){d=(new Date).getTime();s=f});a=function(){s=l};g.d("touchmove",a);g.d("touchleave",a);g.d("touchcancel",
+a);g.d("touchend",function(){s===f&&(n=(new Date).getTime()-d,250>n&&this.j("tap"))});g.d("tap",g.jd)}};c=u.bind(g,g.md);this.M(a);e.d("controlsenabled",a);e.d("controlsdisabled",c)}});u.r.prototype.md=function(){this.n("tap");this.n("touchstart");this.n("touchmove");this.n("touchleave");this.n("touchcancel");this.n("touchend");this.n("click");this.n("mousedown")};u.r.prototype.p=function(a){0===a.button&&this.L().controls()&&(this.L().paused()?this.L().play():this.L().pause())};
+u.r.prototype.jd=function(){I(this.L(),!I(this.L()))};u.r.prototype.l={volumeControl:f,fullscreenResize:l,progressEvents:l,timeupdateEvents:l};u.media={};u.media.Ua="play pause paused currentTime setCurrentTime duration buffered volume setVolume muted setMuted width height supportsFullScreen enterFullScreen src load currentSrc preload setPreload autoplay setAutoplay loop setLoop error networkState readyState seeking initialTime startOffsetTime played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks defaultPlaybackRate playbackRate mediaGroup controller controls defaultMuted".split(" ");
+function ea(){var a=u.media.Ua[i];return function(){throw Error('The "'+a+"\" method is not available on the playback technology's API");}}for(var i=u.media.Ua.length-1;0<=i;i--)u.r.prototype[u.media.Ua[i]]=ea();
+u.o=u.r.extend({i:function(a,c,d){this.l.volumeControl=u.o.Qc();this.l.movingMediaElementInDOM=!u.Fc;this.l.fullscreenResize=f;u.r.call(this,a,c,d);(c=c.source)&&this.a.currentSrc==c.src?a.j("loadstart"):c&&(this.a.src=c.src);if(u.Mc&&a.options().nativeControlsForTouch!==l){var e,g,h,k;e=this;g=this.L();c=g.controls();e.a.controls=!!c;h=function(){e.a.controls=f};k=function(){e.a.controls=l};g.d("controlsenabled",h);g.d("controlsdisabled",k);c=function(){g.n("controlsenabled",h);g.n("controlsdisabled",
+k)};e.d("dispose",c);g.d("usingcustomcontrols",c);g.Pb(f)}a.M(function(){this.F&&(this.g.autoplay&&this.paused())&&(delete this.F.poster,this.play())});for(a=u.o.Za.length-1;0<=a;a--)u.d(this.a,u.o.Za[a],u.bind(this.b,this.Wc));this.Ta()}});t=u.o.prototype;t.D=function(){u.r.prototype.D.call(this)};
+t.e=function(){var a=this.b,c=a.F;if(!c||this.l.movingMediaElementInDOM===l)c?(c.player=j,a.F=j,a.v().removeChild(c),c=c.cloneNode(l)):c=u.e("video",{id:a.id()+"_html5_api",className:"vjs-tech"}),c.player=a,u.yb(c,a.v());for(var d=["autoplay","preload","loop","muted"],e=d.length-1;0<=e;e--){var g=d[e];a.g[g]!==j&&(c[g]=a.g[g])}return c};t.Wc=function(a){this.j(a);a.stopPropagation()};t.play=function(){this.a.play()};t.pause=function(){this.a.pause()};t.paused=function(){return this.a.paused};
+t.currentTime=function(){return this.a.currentTime};t.pd=function(a){try{this.a.currentTime=a}catch(c){u.log(c,"Video is not ready. (Video.js)")}};t.duration=function(){return this.a.duration||0};t.buffered=function(){return this.a.buffered};t.volume=function(){return this.a.volume};t.ud=function(a){this.a.volume=a};t.muted=function(){return this.a.muted};t.sd=function(a){this.a.muted=a};t.width=function(){return this.a.offsetWidth};t.height=function(){return this.a.offsetHeight};
+t.Sa=function(){return"function"==typeof this.a.webkitEnterFullScreen&&(/Android/.test(u.G)||!/Chrome|Mac OS X 10.5/.test(u.G))?f:l};t.src=function(a){this.a.src=a};t.load=function(){this.a.load()};t.currentSrc=function(){return this.a.currentSrc};t.Pa=function(){return this.a.Pa};t.td=function(a){this.a.Pa=a};t.autoplay=function(){return this.a.autoplay};t.od=function(a){this.a.autoplay=a};t.controls=function(){return this.a.controls};t.loop=function(){return this.a.loop};
+t.rd=function(a){this.a.loop=a};t.error=function(){return this.a.error};t.seeking=function(){return this.a.seeking};u.o.isSupported=function(){return!!u.ma.canPlayType};u.o.lb=function(a){try{return!!u.ma.canPlayType(a.type)}catch(c){return""}};u.o.Qc=function(){var a=u.ma.volume;u.ma.volume=a/2+0.1;return a!==u.ma.volume};u.o.Za="loadstart suspend abort error emptied stalled loadedmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate progress play pause ratechange volumechange".split(" ");
+u.Jc&&(document.createElement("video").constructor.prototype.canPlayType=function(a){return a&&-1!=a.toLowerCase().indexOf("video/mp4")?"maybe":""});
+u.f=u.r.extend({i:function(a,c,d){u.r.call(this,a,c,d);var e=c.source;d=c.parentEl;var g=this.a=u.e("div",{id:a.id()+"_temp_flash"}),h=a.id()+"_flash_api";a=a.g;var k=u.k.B({readyFunction:"videojs.Flash.onReady",eventProxyFunction:"videojs.Flash.onEvent",errorEventProxyFunction:"videojs.Flash.onError",autoplay:a.autoplay,preload:a.Pa,loop:a.loop,muted:a.muted},c.flashVars),r=u.k.B({wmode:"opaque",bgcolor:"#000000"},c.params),n=u.k.B({id:h,name:h,"class":"vjs-tech"},c.attributes);e&&(e.type&&u.f.ad(e.type)?
+(a=u.f.wc(e.src),k.rtmpConnection=encodeURIComponent(a.qb),k.rtmpStream=encodeURIComponent(a.Mb)):k.src=encodeURIComponent(u.ic(e.src)));u.yb(g,d);c.startTime&&this.M(function(){this.load();this.play();this.currentTime(c.startTime)});if(c.iFrameMode===f&&!u.Ec){var s=u.e("iframe",{id:h+"_iframe",name:h+"_iframe",className:"vjs-tech",scrolling:"no",marginWidth:0,marginHeight:0,frameBorder:0});k.readyFunction="ready";k.eventProxyFunction="events";k.errorEventProxyFunction="errors";u.d(s,"load",u.bind(this,
+function(){var a,d=s.contentWindow;a=s.contentDocument?s.contentDocument:s.contentWindow.document;a.write(u.f.jc(c.swf,k,r,n));d.player=this.b;d.ready=u.bind(this.b,function(c){var d=this.h;d.a=a.getElementById(c);u.f.ob(d)});d.events=u.bind(this.b,function(a,c){this&&"flash"===this.ia&&this.j(c)});d.errors=u.bind(this.b,function(a,c){u.log("Flash Error",c)})}));g.parentNode.replaceChild(s,g)}else u.f.Vc(c.swf,g,k,r,n)}});t=u.f.prototype;t.D=function(){u.r.prototype.D.call(this)};t.play=function(){this.a.vjs_play()};
+t.pause=function(){this.a.vjs_pause()};t.src=function(a){u.f.$c(a)?(a=u.f.wc(a),this.Nd(a.qb),this.Od(a.Mb)):(a=u.ic(a),this.a.vjs_src(a));if(this.b.autoplay()){var c=this;setTimeout(function(){c.play()},0)}};t.currentSrc=function(){var a=this.a.vjs_getProperty("currentSrc");if(a==j){var c=this.Ld(),d=this.Md();c&&d&&(a=u.f.vd(c,d))}return a};t.load=function(){this.a.vjs_load()};t.poster=function(){this.a.vjs_getProperty("poster")};t.buffered=function(){return u.sb(0,this.a.vjs_getProperty("buffered"))};
+t.Sa=q(l);var R=u.f.prototype,S="rtmpConnection rtmpStream preload currentTime defaultPlaybackRate playbackRate autoplay loop mediaGroup controller controls volume muted defaultMuted".split(" "),T="error currentSrc networkState readyState seeking initialTime duration startOffsetTime paused played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks".split(" ");
+function fa(){var a=S[U],c=a.charAt(0).toUpperCase()+a.slice(1);R["set"+c]=function(c){return this.a.vjs_setProperty(a,c)}}function V(a){R[a]=function(){return this.a.vjs_getProperty(a)}}var U;for(U=0;U<S.length;U++)V(S[U]),fa();for(U=0;U<T.length;U++)V(T[U]);u.f.isSupported=function(){return 10<=u.f.version()[0]};u.f.lb=function(a){if(a.type in u.f.Yc||a.type in u.f.xc)return"maybe"};u.f.Yc={"video/flv":"FLV","video/x-flv":"FLV","video/mp4":"MP4","video/m4v":"MP4"};u.f.xc={"rtmp/mp4":"MP4","rtmp/flv":"FLV"};
+u.f.onReady=function(a){a=u.v(a);var c=a.player||a.parentNode.player,d=c.h;a.player=c;d.a=a;u.f.ob(d)};u.f.ob=function(a){a.v().vjs_getProperty?a.Ta():setTimeout(function(){u.f.ob(a)},50)};u.f.onEvent=function(a,c){u.v(a).player.j(c)};u.f.onError=function(a,c){u.v(a).player.j("error");u.log("Flash Error",c,a)};
+u.f.version=function(){var a="0,0,0";try{a=(new window.ActiveXObject("ShockwaveFlash.ShockwaveFlash")).GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(c){try{navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin&&(a=(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1])}catch(d){}}return a.split(",")};
+u.f.Vc=function(a,c,d,e,g){a=u.f.jc(a,d,e,g);a=u.e("div",{innerHTML:a}).childNodes[0];d=c.parentNode;c.parentNode.replaceChild(a,c);var h=d.childNodes[0];setTimeout(function(){h.style.display="block"},1E3)};
+u.f.jc=function(a,c,d,e){var g="",h="",k="";c&&u.k.ta(c,function(a,c){g+=a+"="+c+"&amp;"});d=u.k.B({movie:a,flashvars:g,allowScriptAccess:"always",allowNetworking:"all"},d);u.k.ta(d,function(a,c){h+='<param name="'+a+'" value="'+c+'" />'});e=u.k.B({data:a,width:"100%",height:"100%"},e);u.k.ta(e,function(a,c){k+=a+'="'+c+'" '});return'<object type="application/x-shockwave-flash"'+k+">"+h+"</object>"};u.f.vd=function(a,c){return a+"&"+c};
+u.f.wc=function(a){var c={qb:"",Mb:""};if(!a)return c;var d=a.indexOf("&"),e;-1!==d?e=d+1:(d=e=a.lastIndexOf("/")+1,0===d&&(d=e=a.length));c.qb=a.substring(0,d);c.Mb=a.substring(e,a.length);return c};u.f.ad=function(a){return a in u.f.xc};u.f.Lc=/^rtmp[set]?:\/\//i;u.f.$c=function(a){return u.f.Lc.test(a)};
+u.Kc=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);if(!a.g.sources||0===a.g.sources.length){c=0;for(d=a.g.techOrder;c<d.length;c++){var e=u.$(d[c]),g=window.videojs[e];if(g&&g.isSupported()){J(a,e);break}}}else a.src(a.g.sources)}});function W(a){a.za=a.za||[];return a.za}function X(a,c,d){for(var e=a.za,g=0,h=e.length,k,r;g<h;g++)k=e[g],k.id()===c?(k.show(),r=k):d&&(k.K()==d&&0<k.mode())&&k.disable();(c=r?r.K():d?d:l)&&a.j(c+"trackchange")}
+u.X=u.c.extend({i:function(a,c){u.c.call(this,a,c);this.Q=c.id||"vjs_"+c.kind+"_"+c.language+"_"+u.s++;this.tc=c.src;this.Sc=c["default"]||c.dflt;this.xd=c.title;this.Id=c.srclang;this.bd=c.label;this.fa=[];this.bc=[];this.ga=this.ha=0;this.b.d("fullscreenchange",u.bind(this,this.Nc))}});t=u.X.prototype;t.K=p("A");t.src=p("tc");t.tb=p("Sc");t.title=p("xd");t.label=p("bd");t.readyState=p("ha");t.mode=p("ga");t.Nc=function(){this.a.style.fontSize=this.b.I?140*(screen.width/this.b.width())+"%":""};
+t.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-"+this.A+" vjs-text-track"})};t.show=function(){Y(this);this.ga=2;u.c.prototype.show.call(this)};t.C=function(){Y(this);this.ga=1;u.c.prototype.C.call(this)};t.disable=function(){2==this.ga&&this.C();this.b.n("timeupdate",u.bind(this,this.update,this.Q));this.b.n("ended",u.bind(this,this.reset,this.Q));this.reset();this.b.V.textTrackDisplay.removeChild(this);this.ga=0};
+function Y(a){0===a.ha&&a.load();0===a.ga&&(a.b.d("timeupdate",u.bind(a,a.update,a.Q)),a.b.d("ended",u.bind(a,a.reset,a.Q)),("captions"===a.A||"subtitles"===a.A)&&a.b.V.textTrackDisplay.Z(a))}t.load=function(){0===this.ha&&(this.ha=1,u.get(this.tc,u.bind(this,this.kd),u.bind(this,this.Fb)))};t.Fb=function(a){this.error=a;this.ha=3;this.j("error")};
+t.kd=function(a){var c,d;a=a.split("\n");for(var e="",g=1,h=a.length;g<h;g++)if(e=u.trim(a[g])){-1==e.indexOf("--\x3e")?(c=e,e=u.trim(a[++g])):c=this.fa.length;c={id:c,index:this.fa.length};d=e.split(" --\x3e ");c.startTime=ga(d[0]);c.ua=ga(d[1]);for(d=[];a[++g]&&(e=u.trim(a[g]));)d.push(e);c.text=d.join("<br/>");this.fa.push(c)}this.ha=2;this.j("loaded")};
+function ga(a){var c=a.split(":");a=0;var d,e,g;3==c.length?(d=c[0],e=c[1],c=c[2]):(d=0,e=c[0],c=c[1]);c=c.split(/\s+/);c=c.splice(0,1)[0];c=c.split(/\.|,/);g=parseFloat(c[1]);c=c[0];a+=3600*parseFloat(d);a+=60*parseFloat(e);a+=parseFloat(c);g&&(a+=g/1E3);return a}
+t.update=function(){if(0<this.fa.length){var a=this.b.currentTime();if(this.Kb===b||a<this.Kb||this.La<=a){var c=this.fa,d=this.b.duration(),e=0,g=l,h=[],k,r,n,s;a>=this.La||this.La===b?s=this.vb!==b?this.vb:0:(g=f,s=this.Cb!==b?this.Cb:c.length-1);for(;;){n=c[s];if(n.ua<=a)e=Math.max(e,n.ua),n.Ha&&(n.Ha=l);else if(a<n.startTime){if(d=Math.min(d,n.startTime),n.Ha&&(n.Ha=l),!g)break}else g?(h.splice(0,0,n),r===b&&(r=s),k=s):(h.push(n),k===b&&(k=s),r=s),d=Math.min(d,n.ua),e=Math.max(e,n.startTime),
+n.Ha=f;if(g)if(0===s)break;else s--;else if(s===c.length-1)break;else s++}this.bc=h;this.La=d;this.Kb=e;this.vb=k;this.Cb=r;a=this.bc;c="";d=0;for(e=a.length;d<e;d++)c+='<span class="vjs-tt-cue">'+a[d].text+"</span>";this.a.innerHTML=c;this.j("cuechange")}}};t.reset=function(){this.La=0;this.Kb=this.b.duration();this.Cb=this.vb=0};u.Sb=u.X.extend();u.Sb.prototype.A="captions";u.Yb=u.X.extend();u.Yb.prototype.A="subtitles";u.Tb=u.X.extend();u.Tb.prototype.A="chapters";
+u.Zb=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);if(a.g.tracks&&0<a.g.tracks.length){c=this.b;a=a.g.tracks;var e;for(d=0;d<a.length;d++){e=a[d];var g=c,h=e.kind,k=e.label,r=e.language,n=e;e=g.za=g.za||[];n=n||{};n.kind=h;n.label=k;n.language=r;h=u.$(h||"subtitles");g=new window.videojs[h+"Track"](g,n);e.push(g)}}}});u.Zb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-text-track-display"})};
+u.Y=u.N.extend({i:function(a,c){var d=this.ca=c.track;c.label=d.label();c.selected=d.tb();u.N.call(this,a,c);this.b.d(d.K()+"trackchange",u.bind(this,this.update))}});u.Y.prototype.p=function(){u.N.prototype.p.call(this);X(this.b,this.ca.Q,this.ca.K())};u.Y.prototype.update=function(){this.selected(2==this.ca.mode())};u.ab=u.Y.extend({i:function(a,c){c.track={K:function(){return c.kind},L:a,label:function(){return c.kind+" off"},tb:q(l),mode:q(l)};u.Y.call(this,a,c);this.selected(f)}});
+u.ab.prototype.p=function(){u.Y.prototype.p.call(this);X(this.b,this.ca.Q,this.ca.K())};u.ab.prototype.update=function(){for(var a=W(this.b),c=0,d=a.length,e,g=f;c<d;c++)e=a[c],e.K()==this.ca.K()&&2==e.mode()&&(g=l);this.selected(g)};u.S=u.R.extend({i:function(a,c){u.R.call(this,a,c);1>=this.J.length&&this.C()}});u.S.prototype.sa=function(){var a=[],c;a.push(new u.ab(this.b,{kind:this.A}));for(var d=0;d<W(this.b).length;d++)c=W(this.b)[d],c.K()===this.A&&a.push(new u.Y(this.b,{track:c}));return a};
+u.Ca=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute("aria-label","Captions Menu")}});u.Ca.prototype.A="captions";u.Ca.prototype.pa="Captions";u.Ca.prototype.className="vjs-captions-button";u.Ga=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute("aria-label","Subtitles Menu")}});u.Ga.prototype.A="subtitles";u.Ga.prototype.pa="Subtitles";u.Ga.prototype.className="vjs-subtitles-button";
+u.Da=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute("aria-label","Chapters Menu")}});t=u.Da.prototype;t.A="chapters";t.pa="Chapters";t.className="vjs-chapters-button";t.sa=function(){for(var a=[],c,d=0;d<W(this.b).length;d++)c=W(this.b)[d],c.K()===this.A&&a.push(new u.Y(this.b,{track:c}));return a};
+t.Ja=function(){for(var a=W(this.b),c=0,d=a.length,e,g,h=this.J=[];c<d;c++)if(e=a[c],e.K()==this.A&&e.tb()){if(2>e.readyState()){this.Fd=e;e.d("loaded",u.bind(this,this.Ja));return}g=e;break}a=this.va=new u.la(this.b);a.a.appendChild(u.e("li",{className:"vjs-menu-title",innerHTML:u.$(this.A),wd:-1}));if(g){e=g.fa;for(var k,c=0,d=e.length;c<d;c++)k=e[c],k=new u.Wa(this.b,{track:g,cue:k}),h.push(k),a.Z(k)}0<this.J.length&&this.show();return a};
+u.Wa=u.N.extend({i:function(a,c){var d=this.ca=c.track,e=this.cue=c.cue,g=a.currentTime();c.label=e.text;c.selected=e.startTime<=g&&g<e.ua;u.N.call(this,a,c);d.d("cuechange",u.bind(this,this.update))}});u.Wa.prototype.p=function(){u.N.prototype.p.call(this);this.b.currentTime(this.cue.startTime);this.update(this.cue.startTime)};u.Wa.prototype.update=function(){var a=this.cue,c=this.b.currentTime();this.selected(a.startTime<=c&&c<a.ua)};
+u.k.B(u.Ea.prototype.g.children,{subtitlesButton:{},captionsButton:{},chaptersButton:{}});
+if("undefined"!==typeof window.JSON&&"function"===window.JSON.parse)u.JSON=window.JSON;else{u.JSON={};var Z=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;u.JSON.parse=function(a,c){function d(a,e){var k,r,n=a[e];if(n&&"object"===typeof n)for(k in n)Object.prototype.hasOwnProperty.call(n,k)&&(r=d(n,k),r!==b?n[k]=r:delete n[k]);return c.call(a,e,n)}var e;a=String(a);Z.lastIndex=0;Z.test(a)&&(a=a.replace(Z,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));
+if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return e=eval("("+a+")"),"function"===typeof c?d({"":e},""):e;throw new SyntaxError("JSON.parse(): invalid or malformed JSON data");}}
+u.cc=function(){var a,c,d=document.getElementsByTagName("video");if(d&&0<d.length)for(var e=0,g=d.length;e<g;e++)if((c=d[e])&&c.getAttribute)c.player===b&&(a=c.getAttribute("data-setup"),a!==j&&(a=u.JSON.parse(a||"{}"),v(c,a)));else{u.jb();break}else u.Ac||u.jb()};u.jb=function(){setTimeout(u.cc,1)};"complete"===document.readyState?u.Ac=f:u.U(window,"load",function(){u.Ac=f});u.jb();u.ld=function(a,c){u.w.prototype[a]=c};var ha=this;ha.Bd=f;function $(a,c){var d=a.split("."),e=ha;!(d[0]in e)&&e.execScript&&e.execScript("var "+d[0]);for(var g;d.length&&(g=d.shift());)!d.length&&c!==b?e[g]=c:e=e[g]?e[g]:e[g]={}};$("videojs",u);$("_V_",u);$("videojs.options",u.options);$("videojs.players",u.wa);$("videojs.cache",u.qa);$("videojs.Component",u.c);u.c.prototype.player=u.c.prototype.L;u.c.prototype.dispose=u.c.prototype.D;u.c.prototype.createEl=u.c.prototype.e;u.c.prototype.el=u.c.prototype.v;u.c.prototype.addChild=u.c.prototype.Z;u.c.prototype.children=u.c.prototype.children;u.c.prototype.on=u.c.prototype.d;u.c.prototype.off=u.c.prototype.n;u.c.prototype.one=u.c.prototype.U;u.c.prototype.trigger=u.c.prototype.j;
+u.c.prototype.triggerReady=u.c.prototype.Ta;u.c.prototype.show=u.c.prototype.show;u.c.prototype.hide=u.c.prototype.C;u.c.prototype.width=u.c.prototype.width;u.c.prototype.height=u.c.prototype.height;u.c.prototype.dimensions=u.c.prototype.Tc;u.c.prototype.ready=u.c.prototype.M;u.c.prototype.addClass=u.c.prototype.m;u.c.prototype.removeClass=u.c.prototype.t;$("videojs.Player",u.w);u.w.prototype.dispose=u.w.prototype.D;u.w.prototype.requestFullScreen=u.w.prototype.xa;u.w.prototype.cancelFullScreen=u.w.prototype.nb;
+u.w.prototype.bufferedPercent=u.w.prototype.Ia;u.w.prototype.usingNativeControls=u.w.prototype.Pb;$("videojs.MediaLoader",u.Kc);$("videojs.TextTrackDisplay",u.Zb);$("videojs.ControlBar",u.Ea);$("videojs.Button",u.q);$("videojs.PlayToggle",u.Wb);$("videojs.FullscreenToggle",u.Fa);$("videojs.BigPlayButton",u.Va);$("videojs.LoadingSpinner",u.Ub);$("videojs.CurrentTimeDisplay",u.Xa);$("videojs.DurationDisplay",u.Ya);$("videojs.TimeDivider",u.$b);$("videojs.RemainingTimeDisplay",u.eb);
+$("videojs.Slider",u.O);$("videojs.ProgressControl",u.cb);$("videojs.SeekBar",u.Xb);$("videojs.LoadProgressBar",u.$a);$("videojs.PlayProgressBar",u.Vb);$("videojs.SeekHandle",u.fb);$("videojs.VolumeControl",u.hb);$("videojs.VolumeBar",u.gb);$("videojs.VolumeLevel",u.ac);$("videojs.VolumeMenuButton",u.na);$("videojs.VolumeHandle",u.ib);$("videojs.MuteToggle",u.da);$("videojs.PosterImage",u.bb);$("videojs.Menu",u.la);$("videojs.MenuItem",u.N);$("videojs.MenuButton",u.R);u.R.prototype.createItems=u.R.prototype.sa;
+u.S.prototype.createItems=u.S.prototype.sa;u.Da.prototype.createItems=u.Da.prototype.sa;$("videojs.SubtitlesButton",u.Ga);$("videojs.CaptionsButton",u.Ca);$("videojs.ChaptersButton",u.Da);$("videojs.MediaTechController",u.r);u.r.prototype.features=u.r.prototype.l;u.r.prototype.l.volumeControl=u.r.prototype.l.zc;u.r.prototype.l.fullscreenResize=u.r.prototype.l.Gd;u.r.prototype.l.progressEvents=u.r.prototype.l.Kd;u.r.prototype.l.timeupdateEvents=u.r.prototype.l.Pd;$("videojs.Html5",u.o);
+u.o.Events=u.o.Za;u.o.isSupported=u.o.isSupported;u.o.canPlaySource=u.o.lb;u.o.prototype.setCurrentTime=u.o.prototype.pd;u.o.prototype.setVolume=u.o.prototype.ud;u.o.prototype.setMuted=u.o.prototype.sd;u.o.prototype.setPreload=u.o.prototype.td;u.o.prototype.setAutoplay=u.o.prototype.od;u.o.prototype.setLoop=u.o.prototype.rd;$("videojs.Flash",u.f);u.f.isSupported=u.f.isSupported;u.f.canPlaySource=u.f.lb;u.f.onReady=u.f.onReady;$("videojs.TextTrack",u.X);u.X.prototype.label=u.X.prototype.label;
+$("videojs.CaptionsTrack",u.Sb);$("videojs.SubtitlesTrack",u.Yb);$("videojs.ChaptersTrack",u.Tb);$("videojs.autoSetup",u.cc);$("videojs.plugin",u.ld);$("videojs.createTimeRange",u.sb);})();
diff --git a/extlib/video-js/video.min.js b/extlib/video-js/video.min.js
deleted file mode 100644
index 1c33af55..00000000
--- a/extlib/video-js/video.min.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*!
-Video.js - HTML5 Video Player
-Version GENERATED_AT_BUILD
-
-LGPL v3 LICENSE INFO
-This file is part of Video.js. Copyright 2011 Zencoder, Inc.
-
-Video.js is free software: you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Video.js 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 Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with Video.js. If not, see <http://www.gnu.org/licenses/>.
-*/
-(function(window,undefined){var document=window.document;document.createElement("video");document.createElement("audio");var VideoJS=function(id,addOptions,ready){var tag;if(typeof id=="string"){if(id.indexOf("#")===0){id=id.slice(1)}if(_V_.players[id]){return _V_.players[id]}else{tag=_V_.el(id)}}else{tag=id}if(!tag||!tag.nodeName){throw new TypeError("The element or ID supplied is not valid. (VideoJS)")}return tag.player||new _V_.Player(tag,addOptions,ready)},_V_=VideoJS,CDN_VERSION="GENERATED_CDN_VSN";VideoJS.players={};VideoJS.options={techOrder:["html5","flash"],html5:{},flash:{swf:"http://vjs.zencdn.net/c/video-js.swf"},width:300,height:150,defaultVolume:0,components:{posterImage:{},textTrackDisplay:{},loadingSpinner:{},bigPlayButton:{},controlBar:{}}};if(CDN_VERSION!="GENERATED_CDN_VSN"){_V_.options.flash.swf="http://vjs.zencdn.net/"+CDN_VERSION+"/video-js.swf"}_V_.merge=function(obj1,obj2,safe){if(!obj2){obj2={}}for(var attrname in obj2){if(obj2.hasOwnProperty(attrname)&&(!safe||!obj1.hasOwnProperty(attrname))){obj1[attrname]=obj2[attrname]}}return obj1};_V_.extend=function(obj){this.merge(this,obj,true)};_V_.extend({tech:{},controlSets:{},isIE:function(){return !+"\v1"},isFF:function(){return !!_V_.ua.match("Firefox")},isIPad:function(){return navigator.userAgent.match(/iPad/i)!==null},isIPhone:function(){return navigator.userAgent.match(/iPhone/i)!==null},isIOS:function(){return VideoJS.isIPhone()||VideoJS.isIPad()},iOSVersion:function(){var match=navigator.userAgent.match(/OS (\d+)_/i);if(match&&match[1]){return match[1]}},isAndroid:function(){return navigator.userAgent.match(/Android.*AppleWebKit/i)!==null},androidVersion:function(){var match=navigator.userAgent.match(/Android (\d+)\./i);if(match&&match[1]){return match[1]}},testVid:document.createElement("video"),ua:navigator.userAgent,support:{},each:function(arr,fn){if(!arr||arr.length===0){return}for(var i=0,j=arr.length;i<j;i++){fn.call(this,arr[i],i)}},eachProp:function(obj,fn){if(!obj){return}for(var name in obj){if(obj.hasOwnProperty(name)){fn.call(this,name,obj[name])}}},el:function(id){return document.getElementById(id)},createElement:function(tagName,attributes){var el=document.createElement(tagName),attrname;for(attrname in attributes){if(attributes.hasOwnProperty(attrname)){if(attrname.indexOf("-")!==-1){el.setAttribute(attrname,attributes[attrname])}else{el[attrname]=attributes[attrname]}}}return el},insertFirst:function(node,parent){if(parent.firstChild){parent.insertBefore(node,parent.firstChild)}else{parent.appendChild(node)}},addClass:function(element,classToAdd){if((" "+element.className+" ").indexOf(" "+classToAdd+" ")==-1){element.className=element.className===""?classToAdd:element.className+" "+classToAdd}},removeClass:function(element,classToRemove){if(element.className.indexOf(classToRemove)==-1){return}var classNames=element.className.split(" ");classNames.splice(classNames.indexOf(classToRemove),1);element.className=classNames.join(" ")},remove:function(item,array){if(!array){return}var i=array.indexOf(item);if(i!=-1){return array.splice(i,1)}},blockTextSelection:function(){document.body.focus();document.onselectstart=function(){return false}},unblockTextSelection:function(){document.onselectstart=function(){return true}},formatTime:function(seconds,guide){guide=guide||seconds;var s=Math.floor(seconds%60),m=Math.floor(seconds/60%60),h=Math.floor(seconds/3600),gm=Math.floor(guide/60%60),gh=Math.floor(guide/3600);h=(h>0||gh>0)?h+":":"";m=(((h||gm>=10)&&m<10)?"0"+m:m)+":";s=(s<10)?"0"+s:s;return h+m+s},uc:function(string){return string.charAt(0).toUpperCase()+string.slice(1)},getRelativePosition:function(x,relativeElement){return Math.max(0,Math.min(1,(x-_V_.findPosX(relativeElement))/relativeElement.offsetWidth))},getComputedStyleValue:function(element,style){return window.getComputedStyle(element,null).getPropertyValue(style)},trim:function(string){return string.toString().replace(/^\s+/,"").replace(/\s+$/,"")},round:function(num,dec){if(!dec){dec=0}return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec)},isEmpty:function(object){for(var prop in object){return false}return true},createTimeRange:function(start,end){return{length:1,start:function(){return start},end:function(){return end}}},cache:{},guid:1,expando:"vdata"+(new Date).getTime(),getData:function(elem){var id=elem[_V_.expando];if(!id){id=elem[_V_.expando]=_V_.guid++;_V_.cache[id]={}}return _V_.cache[id]},removeData:function(elem){var id=elem[_V_.expando];if(!id){return}delete _V_.cache[id];try{delete elem[_V_.expando]}catch(e){if(elem.removeAttribute){elem.removeAttribute(_V_.expando)}else{elem[_V_.expando]=null}}},proxy:function(context,fn,uid){if(!fn.guid){fn.guid=_V_.guid++}var ret=function(){return fn.apply(context,arguments)};ret.guid=(uid)?uid+"_"+fn.guid:fn.guid;return ret},get:function(url,onSuccess,onError){var local=(url.indexOf("file:")==0||(window.location.href.indexOf("file:")==0&&url.indexOf("http:")==-1));if(typeof XMLHttpRequest=="undefined"){XMLHttpRequest=function(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(e){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(f){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(g){}throw new Error("This browser does not support XMLHttpRequest.")}}var request=new XMLHttpRequest();try{request.open("GET",url)}catch(e){_V_.log("VideoJS XMLHttpRequest (open)",e);return false}request.onreadystatechange=_V_.proxy(this,function(){if(request.readyState==4){if(request.status==200||local&&request.status==0){onSuccess(request.responseText)}else{if(onError){onError()}}}});try{request.send()}catch(e){_V_.log("VideoJS XMLHttpRequest (send)",e);if(onError){onError(e)}}},setLocalStorage:function(key,value){var localStorage=window.localStorage||false;if(!localStorage){return}try{localStorage[key]=value}catch(e){if(e.code==22||e.code==1014){_V_.log("LocalStorage Full (VideoJS)",e)}else{_V_.log("LocalStorage Error (VideoJS)",e)}}},getAbsoluteURL:function(url){if(!url.match(/^https?:\/\//)){url=_V_.createElement("div",{innerHTML:'<a href="'+url+'">x</a>'}).firstChild.href}return url}});_V_.log=function(){_V_.log.history=_V_.log.history||[];_V_.log.history.push(arguments);if(window.console){arguments.callee=arguments.callee.caller;var newarr=[].slice.call(arguments);(typeof console.log==="object"?_V_.log.apply.call(console.log,console,newarr):console.log.apply(console,newarr))}};(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}})((function(){try{console.log();return window.console}catch(err){return window.console={}}})());if("getBoundingClientRect" in document.documentElement){_V_.findPosX=function(el){var box;try{box=el.getBoundingClientRect()}catch(e){}if(!box){return 0}var docEl=document.documentElement,body=document.body,clientLeft=docEl.clientLeft||body.clientLeft||0,scrollLeft=window.pageXOffset||body.scrollLeft,left=box.left+scrollLeft-clientLeft;return left}}else{_V_.findPosX=function(el){var curleft=el.offsetLeft;while(el=obj.offsetParent){if(el.className.indexOf("video-js")==-1){}else{}curleft+=el.offsetLeft}return curleft}}if(!Array.prototype.indexOf){Array.prototype.indexOf=function(searchElement){if(this===void 0||this===null){throw new TypeError()}var t=Object(this);var len=t.length>>>0;if(len===0){return -1}var n=0;if(arguments.length>0){n=Number(arguments[1]);if(n!==n){n=0}else{if(n!==0&&n!==(1/0)&&n!==-(1/0)){n=(n>0||-1)*Math.floor(Math.abs(n))}}}if(n>=len){return -1}var k=n>=0?n:Math.max(len-Math.abs(n),0);for(;k<len;k++){if(k in t&&t[k]===searchElement){return k}}return -1}}var JSON;if(!JSON){JSON={}}(function(){var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}}());_V_.extend({addEvent:function(elem,type,fn){var data=_V_.getData(elem),handlers;if(data&&!data.handler){data.handler=function(event){event=_V_.fixEvent(event);var handlers=_V_.getData(elem).events[event.type];if(handlers){var handlersCopy=[];_V_.each(handlers,function(handler,i){handlersCopy[i]=handler});for(var i=0,l=handlersCopy.length;i<l;i++){handlersCopy[i].call(elem,event)}}}}if(!data.events){data.events={}}handlers=data.events[type];if(!handlers){handlers=data.events[type]=[];if(document.addEventListener){elem.addEventListener(type,data.handler,false)}else{if(document.attachEvent){elem.attachEvent("on"+type,data.handler)}}}if(!fn.guid){fn.guid=_V_.guid++}handlers.push(fn)},removeEvent:function(elem,type,fn){var data=_V_.getData(elem),handlers;if(!data.events){return}if(!type){for(type in data.events){_V_.cleanUpEvents(elem,type)}return}handlers=data.events[type];if(!handlers){return}if(fn&&fn.guid){for(var i=0;i<handlers.length;i++){if(handlers[i].guid===fn.guid){handlers.splice(i--,1)}}}_V_.cleanUpEvents(elem,type)},cleanUpEvents:function(elem,type){var data=_V_.getData(elem);if(data.events[type].length===0){delete data.events[type];if(document.removeEventListener){elem.removeEventListener(type,data.handler,false)}else{if(document.detachEvent){elem.detachEvent("on"+type,data.handler)}}}if(_V_.isEmpty(data.events)){delete data.events;delete data.handler}if(_V_.isEmpty(data)){_V_.removeData(elem)}},fixEvent:function(event){if(event[_V_.expando]){return event}var originalEvent=event;event=new _V_.Event(originalEvent);for(var i=_V_.Event.props.length,prop;i;){prop=_V_.Event.props[--i];event[prop]=originalEvent[prop]}if(!event.target){event.target=event.srcElement||document}if(event.target.nodeType===3){event.target=event.target.parentNode}if(!event.relatedTarget&&event.fromElement){event.relatedTarget=event.fromElement===event.target?event.toElement:event.fromElement}if(event.pageX==null&&event.clientX!=null){var eventDocument=event.target.ownerDocument||document,doc=eventDocument.documentElement,body=eventDocument.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc&&doc.clientLeft||body&&body.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc&&doc.clientTop||body&&body.clientTop||0)}if(event.which==null&&(event.charCode!=null||event.keyCode!=null)){event.which=event.charCode!=null?event.charCode:event.keyCode}if(!event.metaKey&&event.ctrlKey){event.metaKey=event.ctrlKey}if(!event.which&&event.button!==undefined){event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)))}return event},triggerEvent:function(elem,event){var data=_V_.getData(elem),parent=elem.parentNode||elem.ownerDocument,type=event.type||event,handler;if(data){handler=data.handler}event=typeof event==="object"?event[_V_.expando]?event:new _V_.Event(type,event):new _V_.Event(type);event.type=type;if(handler){handler.call(elem,event)}event.result=undefined;event.target=elem},one:function(elem,type,fn){_V_.addEvent(elem,type,function(){_V_.removeEvent(elem,type,arguments.callee);fn.apply(this,arguments)})}});_V_.Event=function(src,props){if(src&&src.type){this.originalEvent=src;this.type=src.type;this.isDefaultPrevented=(src.defaultPrevented||src.returnValue===false||src.getPreventDefault&&src.getPreventDefault())?returnTrue:returnFalse}else{this.type=src}if(props){_V_.merge(this,props)}this.timeStamp=(new Date).getTime();this[_V_.expando]=true};_V_.Event.prototype={preventDefault:function(){this.isDefaultPrevented=returnTrue;var e=this.originalEvent;if(!e){return}if(e.preventDefault){e.preventDefault()}else{e.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=returnTrue;var e=this.originalEvent;if(!e){return}if(e.stopPropagation){e.stopPropagation()}e.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=returnTrue;this.stopPropagation()},isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse};_V_.Event.props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" ");function returnTrue(){return true}function returnFalse(){return false}(function(){var initializing=false,fnTest=/xyz/.test(function(){xyz})?/\b_super\b/:/.*/;_V_.Class=function(){};_V_.Class.extend=function(prop){var _super=this.prototype;initializing=true;var prototype=new this();initializing=false;for(var name in prop){prototype[name]=typeof prop[name]=="function"&&typeof _super[name]=="function"&&fnTest.test(prop[name])?(function(name,fn){return function(){var tmp=this._super;this._super=_super[name];var ret=fn.apply(this,arguments);this._super=tmp;return ret}})(name,prop[name]):prop[name]}function Class(){if(!initializing&&this.init){return this.init.apply(this,arguments)}else{if(!initializing){return arguments.callee.prototype.init()}}}Class.prototype=prototype;Class.constructor=Class;Class.extend=arguments.callee;return Class}})();_V_.Component=_V_.Class.extend({init:function(player,options){this.player=player;options=this.options=_V_.merge(this.options||{},options);if(options.el){this.el=options.el}else{this.el=this.createElement()}this.initComponents()},destroy:function(){},createElement:function(type,attrs){return _V_.createElement(type||"div",attrs)},buildCSSClass:function(){return""},initComponents:function(){var options=this.options;if(options&&options.components){this.eachProp(options.components,function(name,opts){var tempAdd=this.proxy(function(){this[name]=this.addComponent(name,opts)});if(opts.loadEvent){this.one(opts.loadEvent,tempAdd)}else{tempAdd()}})}},addComponent:function(name,options){var component,componentClass;if(typeof name=="string"){options=options||{};componentClass=options.componentClass||_V_.uc(name);component=new _V_[componentClass](this.player||this,options)}else{component=name}this.el.appendChild(component.el);return component},removeComponent:function(component){this.el.removeChild(component.el)},show:function(){this.el.style.display="block"},hide:function(){this.el.style.display="none"},fadeIn:function(){this.removeClass("vjs-fade-out");this.addClass("vjs-fade-in")},fadeOut:function(){this.removeClass("vjs-fade-in");this.addClass("vjs-fade-out")},lockShowing:function(){var style=this.el.style;style.display="block";style.opacity=1;style.visiblity="visible"},unlockShowing:function(){var style=this.el.style;style.display="";style.opacity="";style.visiblity=""},addClass:function(classToAdd){_V_.addClass(this.el,classToAdd)},removeClass:function(classToRemove){_V_.removeClass(this.el,classToRemove)},addEvent:function(type,fn,uid){return _V_.addEvent(this.el,type,_V_.proxy(this,fn))},removeEvent:function(type,fn){return _V_.removeEvent(this.el,type,fn)},triggerEvent:function(type,e){return _V_.triggerEvent(this.el,type,e)},one:function(type,fn){_V_.one(this.el,type,_V_.proxy(this,fn))},ready:function(fn){if(!fn){return this}if(this.isReady){fn.call(this)}else{if(this.readyQueue===undefined){this.readyQueue=[]}this.readyQueue.push(fn)}return this},triggerReady:function(){this.isReady=true;if(this.readyQueue&&this.readyQueue.length>0){this.each(this.readyQueue,function(fn){fn.call(this)});this.readyQueue=[];this.triggerEvent("ready")}},each:function(arr,fn){_V_.each.call(this,arr,fn)},eachProp:function(obj,fn){_V_.eachProp.call(this,obj,fn)},extend:function(obj){_V_.merge(this,obj)},proxy:function(fn,uid){return _V_.proxy(this,fn,uid)}});_V_.Player=_V_.Component.extend({init:function(tag,addOptions,ready){this.tag=tag;var el=this.el=_V_.createElement("div"),options=this.options={};_V_.merge(options,_V_.options);_V_.merge(options,this.getVideoTagSettings());_V_.merge(options,addOptions);this.ready(ready);tag.removeAttribute("controls");tag.removeAttribute("poster");tag.player=el.player=this;tag.parentNode.insertBefore(el,tag);el.appendChild(tag);this.id=el.id=tag.id;el.className=tag.className;tag.id+="_html5_api";tag.className="vjs-tech";_V_.players[el.id]=this;el.setAttribute("width",options.width);el.setAttribute("height",options.height);el.style.width=options.width+"px";el.style.height=options.height+"px";tag.removeAttribute("width");tag.removeAttribute("height");if(tag.hasChildNodes()){for(var i=0,j=tag.childNodes;i<j.length;i++){if(j[i].nodeName=="SOURCE"||j[i].nodeName=="TRACK"){tag.removeChild(j[i])}}}this.values={};this.addClass("vjs-paused");this.addEvent("ended",this.onEnded);this.addEvent("play",this.onPlay);this.addEvent("pause",this.onPause);this.addEvent("progress",this.onProgress);this.addEvent("error",this.onError);if(options.controls){this.ready(function(){this.initComponents()})}this.textTracks=[];if(options.tracks&&options.tracks.length>0){this.addTextTracks(options.tracks)}if(!options.sources||options.sources.length==0){for(var i=0,j=options.techOrder;i<j.length;i++){var techName=j[i],tech=_V_[techName];if(tech.isSupported()){this.loadTech(techName);break}}}else{this.src(options.sources)}},values:{},destroy:function(){this.stopTrackingProgress();this.stopTrackingCurrentTime();_V_.players[this.id]=null;delete _V_.players[this.id];this.tech.destroy();this.el.parentNode.removeChild(this.el)},createElement:function(type,options){},getVideoTagSettings:function(){var options={sources:[],tracks:[]},tag=this.tag,getAttribute="getAttribute";options.src=tag[getAttribute]("src");options.controls=tag[getAttribute]("controls")!==null;options.poster=tag[getAttribute]("poster");options.preload=tag[getAttribute]("preload");options.autoplay=tag[getAttribute]("autoplay")!==null;options.loop=tag[getAttribute]("loop")!==null;options.muted=tag[getAttribute]("muted")!==null;if(this.tag.hasChildNodes()){for(var c,i=0,j=this.tag.childNodes;i<j.length;i++){c=j[i];if(c.nodeName=="SOURCE"){options.sources.push({src:c[getAttribute]("src"),type:c[getAttribute]("type"),media:c[getAttribute]("media"),title:c[getAttribute]("title")})}if(c.nodeName=="TRACK"){options.tracks.push({src:c[getAttribute]("src"),kind:c[getAttribute]("kind"),srclang:c[getAttribute]("srclang"),label:c[getAttribute]("label"),"default":c[getAttribute]("default")!==null,title:c[getAttribute]("title")})}}}return options},loadTech:function(techName,source){if(this.tech){this.unloadTech()}else{if(techName!="html5"&&this.tag){this.el.removeChild(this.tag);this.tag=false}}this.techName=techName;this.isReady=false;var techReady=function(){this.player.triggerReady();if(!this.support.progressEvent){this.player.manualProgressOn()}if(!this.support.timeupdateEvent){this.player.manualTimeUpdatesOn()}};var techOptions=_V_.merge({source:source,parentEl:this.el},this.options[techName]);if(source){if(source.src==this.values.src&&this.values.currentTime>0){techOptions.startTime=this.values.currentTime}this.values.src=source.src}this.tech=new _V_[techName](this,techOptions);this.tech.ready(techReady)},unloadTech:function(){this.tech.destroy();if(this.manualProgress){this.manualProgressOff()}if(this.manualTimeUpdates){this.manualTimeUpdatesOff()}this.tech=false},manualProgressOn:function(){this.manualProgress=true;this.trackProgress();this.tech.addEvent("progress",function(){this.removeEvent("progress",arguments.callee);this.support.progressEvent=true;this.player.manualProgressOff()})},manualProgressOff:function(){this.manualProgress=false;this.stopTrackingProgress()},trackProgress:function(){this.progressInterval=setInterval(_V_.proxy(this,function(){if(this.values.bufferEnd<this.buffered().end(0)){this.triggerEvent("progress")}else{if(this.bufferedPercent()==1){this.stopTrackingProgress();this.triggerEvent("progress")}}}),500)},stopTrackingProgress:function(){clearInterval(this.progressInterval)},manualTimeUpdatesOn:function(){this.manualTimeUpdates=true;this.addEvent("play",this.trackCurrentTime);this.addEvent("pause",this.stopTrackingCurrentTime);this.tech.addEvent("timeupdate",function(){this.removeEvent("timeupdate",arguments.callee);this.support.timeupdateEvent=true;this.player.manualTimeUpdatesOff()})},manualTimeUpdatesOff:function(){this.manualTimeUpdates=false;this.stopTrackingCurrentTime();this.removeEvent("play",this.trackCurrentTime);this.removeEvent("pause",this.stopTrackingCurrentTime)},trackCurrentTime:function(){if(this.currentTimeInterval){this.stopTrackingCurrentTime()}this.currentTimeInterval=setInterval(_V_.proxy(this,function(){this.triggerEvent("timeupdate")}),250)},stopTrackingCurrentTime:function(){clearInterval(this.currentTimeInterval)},onEnded:function(){if(this.options.loop){this.currentTime(0);this.play()}else{this.pause();this.currentTime(0);this.pause()}},onPlay:function(){_V_.removeClass(this.el,"vjs-paused");_V_.addClass(this.el,"vjs-playing")},onPause:function(){_V_.removeClass(this.el,"vjs-playing");_V_.addClass(this.el,"vjs-paused")},onProgress:function(){if(this.bufferedPercent()==1){this.triggerEvent("loadedalldata")}},onError:function(e){_V_.log("Video Error",e)},techCall:function(method,arg){if(!this.tech.isReady){this.tech.ready(function(){this[method](arg)})}else{try{this.tech[method](arg)}catch(e){_V_.log(e)}}},techGet:function(method){if(this.tech.isReady){try{return this.tech[method]()}catch(e){if(this.tech[method]===undefined){_V_.log("Video.js: "+method+" method not defined for "+this.techName+" playback technology.",e)}else{if(e.name=="TypeError"){_V_.log("Video.js: "+method+" unavailable on "+this.techName+" playback technology element.",e);this.tech.isReady=false}else{_V_.log(e)}}}}return},play:function(){this.techCall("play");return this},pause:function(){this.techCall("pause");return this},paused:function(){return(this.techGet("paused")===false)?false:true},currentTime:function(seconds){if(seconds!==undefined){this.values.lastSetCurrentTime=seconds;this.techCall("setCurrentTime",seconds);if(this.manualTimeUpdates){this.triggerEvent("timeupdate")}return this}return this.values.currentTime=(this.techGet("currentTime")||0)},duration:function(){return parseFloat(this.techGet("duration"))},remainingTime:function(){return this.duration()-this.currentTime()},buffered:function(){var buffered=this.techGet("buffered"),start=0,end=this.values.bufferEnd=this.values.bufferEnd||0,timeRange;if(buffered&&buffered.length>0&&buffered.end(0)!==end){end=buffered.end(0);this.values.bufferEnd=end}return _V_.createTimeRange(start,end)},bufferedPercent:function(){return(this.duration())?this.buffered().end(0)/this.duration():0},volume:function(percentAsDecimal){var vol;if(percentAsDecimal!==undefined){vol=Math.max(0,Math.min(1,parseFloat(percentAsDecimal)));this.values.volume=vol;this.techCall("setVolume",vol);_V_.setLocalStorage("volume",vol);return this}vol=parseFloat(this.techGet("volume"));return(isNaN(vol))?1:vol},muted:function(muted){if(muted!==undefined){this.techCall("setMuted",muted);return this}return this.techGet("muted")||false},width:function(width,skipListeners){if(width!==undefined){this.el.width=width;this.el.style.width=width+"px";if(!skipListeners){this.triggerEvent("resize")}return this}return parseInt(this.el.getAttribute("width"))},height:function(height){if(height!==undefined){this.el.height=height;this.el.style.height=height+"px";this.triggerEvent("resize");return this}return parseInt(this.el.getAttribute("height"))},size:function(width,height){return this.width(width,true).height(height)},supportsFullScreen:function(){return this.techGet("supportsFullScreen")||false},requestFullScreen:function(){var requestFullScreen=_V_.support.requestFullScreen;this.isFullScreen=true;if(requestFullScreen){_V_.addEvent(document,requestFullScreen.eventName,this.proxy(function(){this.isFullScreen=document[requestFullScreen.isFullScreen];if(this.isFullScreen==false){_V_.removeEvent(document,requestFullScreen.eventName,arguments.callee)}this.triggerEvent("fullscreenchange")}));if(this.tech.support.fullscreenResize===false&&this.options.flash.iFrameMode!=true){this.pause();this.unloadTech();_V_.addEvent(document,requestFullScreen.eventName,this.proxy(function(){_V_.removeEvent(document,requestFullScreen.eventName,arguments.callee);this.loadTech(this.techName,{src:this.values.src})}));this.el[requestFullScreen.requestFn]()}else{this.el[requestFullScreen.requestFn]()}}else{if(this.tech.supportsFullScreen()){this.triggerEvent("fullscreenchange");this.techCall("enterFullScreen")}else{this.triggerEvent("fullscreenchange");this.enterFullWindow()}}return this},cancelFullScreen:function(){var requestFullScreen=_V_.support.requestFullScreen;this.isFullScreen=false;if(requestFullScreen){if(this.tech.support.fullscreenResize===false&&this.options.flash.iFrameMode!=true){this.pause();this.unloadTech();_V_.addEvent(document,requestFullScreen.eventName,this.proxy(function(){_V_.removeEvent(document,requestFullScreen.eventName,arguments.callee);this.loadTech(this.techName,{src:this.values.src})}));document[requestFullScreen.cancelFn]()}else{document[requestFullScreen.cancelFn]()}}else{if(this.tech.supportsFullScreen()){this.techCall("exitFullScreen");this.triggerEvent("fullscreenchange")}else{this.exitFullWindow();this.triggerEvent("fullscreenchange")}}return this},enterFullWindow:function(){this.isFullWindow=true;this.docOrigOverflow=document.documentElement.style.overflow;_V_.addEvent(document,"keydown",_V_.proxy(this,this.fullWindowOnEscKey));document.documentElement.style.overflow="hidden";_V_.addClass(document.body,"vjs-full-window");_V_.addClass(this.el,"vjs-fullscreen");this.triggerEvent("enterFullWindow")},fullWindowOnEscKey:function(event){if(event.keyCode==27){if(this.isFullScreen==true){this.cancelFullScreen()}else{this.exitFullWindow()}}},exitFullWindow:function(){this.isFullWindow=false;_V_.removeEvent(document,"keydown",this.fullWindowOnEscKey);document.documentElement.style.overflow=this.docOrigOverflow;_V_.removeClass(document.body,"vjs-full-window");_V_.removeClass(this.el,"vjs-fullscreen");this.triggerEvent("exitFullWindow")},selectSource:function(sources){for(var i=0,j=this.options.techOrder;i<j.length;i++){var techName=j[i],tech=_V_[techName];if(tech.isSupported()){for(var a=0,b=sources;a<b.length;a++){var source=b[a];if(tech.canPlaySource.call(this,source)){return{source:source,tech:techName}}}}}return false},src:function(source){if(source instanceof Array){var sourceTech=this.selectSource(source),source,techName;if(sourceTech){source=sourceTech.source;techName=sourceTech.tech;if(techName==this.techName){this.src(source)}else{this.loadTech(techName,source)}}else{_V_.log("No compatible source and playback technology were found.")}}else{if(source instanceof Object){if(_V_[this.techName].canPlaySource(source)){this.src(source.src)}else{this.src([source])}}else{this.values.src=source;if(!this.isReady){this.ready(function(){this.src(source)})}else{this.techCall("src",source);if(this.options.preload=="auto"){this.load()}if(this.options.autoplay){this.play()}}}}return this},load:function(){this.techCall("load");return this},currentSrc:function(){return this.techGet("currentSrc")||this.values.src||""},preload:function(value){if(value!==undefined){this.techCall("setPreload",value);this.options.preload=value;return this}return this.techGet("preload")},autoplay:function(value){if(value!==undefined){this.techCall("setAutoplay",value);this.options.autoplay=value;return this}return this.techGet("autoplay",value)},loop:function(value){if(value!==undefined){this.techCall("setLoop",value);this.options.loop=value;return this}return this.techGet("loop")},controls:function(){return this.options.controls},poster:function(){return this.techGet("poster")},error:function(){return this.techGet("error")},ended:function(){return this.techGet("ended")}});(function(){var requestFn,cancelFn,eventName,isFullScreen,playerProto=_V_.Player.prototype;if(document.cancelFullscreen!==undefined){requestFn="requestFullscreen";cancelFn="exitFullscreen";eventName="fullscreenchange";isFullScreen="fullScreen"}else{_V_.each(["moz","webkit"],function(prefix){if((prefix!="moz"||document.mozFullScreenEnabled)&&document[prefix+"CancelFullScreen"]!==undefined){requestFn=prefix+"RequestFullScreen";cancelFn=prefix+"CancelFullScreen";eventName=prefix+"fullscreenchange";if(prefix=="webkit"){isFullScreen=prefix+"IsFullScreen"}else{isFullScreen=prefix+"FullScreen"}}})}if(requestFn){_V_.support.requestFullScreen={requestFn:requestFn,cancelFn:cancelFn,eventName:eventName,isFullScreen:isFullScreen}}})();_V_.PlaybackTech=_V_.Component.extend({init:function(player,options){},onClick:function(){if(this.player.options.controls){_V_.PlayToggle.prototype.onClick.call(this)}}});_V_.apiMethods="play,pause,paused,currentTime,setCurrentTime,duration,buffered,volume,setVolume,muted,setMuted,width,height,supportsFullScreen,enterFullScreen,src,load,currentSrc,preload,setPreload,autoplay,setAutoplay,loop,setLoop,error,networkState,readyState,seeking,initialTime,startOffsetTime,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks,defaultPlaybackRate,playbackRate,mediaGroup,controller,controls,defaultMuted".split(",");_V_.each(_V_.apiMethods,function(methodName){_V_.PlaybackTech.prototype[methodName]=function(){throw new Error("The '"+methodName+"' method is not available on the playback technology's API")}});_V_.html5=_V_.PlaybackTech.extend({init:function(player,options,ready){this.player=player;this.el=this.createElement();this.ready(ready);this.addEvent("click",this.proxy(this.onClick));var source=options.source;if(source&&this.el.currentSrc==source.src){player.triggerEvent("loadstart")}else{if(source){this.el.src=source.src}}player.ready(function(){if(this.options.autoplay&&this.paused()){this.tag.poster=null;this.play()}});this.setupTriggers();this.triggerReady()},destroy:function(){this.player.tag=false;this.removeTriggers();this.el.parentNode.removeChild(this.el)},createElement:function(){var html5=_V_.html5,player=this.player,el=player.tag,newEl;if(!el||this.support.movingElementInDOM===false){if(el){player.el.removeChild(el)}newEl=_V_.createElement("video",{id:el.id||player.el.id+"_html5_api",className:el.className||"vjs-tech"});el=newEl;_V_.insertFirst(el,player.el)}_V_.each(["autoplay","preload","loop","muted"],function(attr){if(player.options[attr]!==null){el[attr]=player.options[attr]}},this);return el},setupTriggers:function(){_V_.each.call(this,_V_.html5.events,function(type){_V_.addEvent(this.el,type,_V_.proxy(this.player,this.eventHandler))})},removeTriggers:function(){_V_.each.call(this,_V_.html5.events,function(type){_V_.removeEvent(this.el,type,_V_.proxy(this.player,this.eventHandler))})},eventHandler:function(e){e.stopPropagation();this.triggerEvent(e)},play:function(){this.el.play()},pause:function(){this.el.pause()},paused:function(){return this.el.paused},currentTime:function(){return this.el.currentTime},setCurrentTime:function(seconds){try{this.el.currentTime=seconds}catch(e){_V_.log(e,"Video isn't ready. (VideoJS)")}},duration:function(){return this.el.duration||0},buffered:function(){return this.el.buffered},volume:function(){return this.el.volume},setVolume:function(percentAsDecimal){this.el.volume=percentAsDecimal},muted:function(){return this.el.muted},setMuted:function(muted){this.el.muted=muted},width:function(){return this.el.offsetWidth},height:function(){return this.el.offsetHeight},supportsFullScreen:function(){if(typeof this.el.webkitEnterFullScreen=="function"){if(!navigator.userAgent.match("Chrome")&&!navigator.userAgent.match("Mac OS X 10.5")){return true}}return false},enterFullScreen:function(){try{this.el.webkitEnterFullScreen()}catch(e){if(e.code==11){_V_.log("VideoJS: Video not ready.")}}},src:function(src){this.el.src=src},load:function(){this.el.load()},currentSrc:function(){return this.el.currentSrc},preload:function(){return this.el.preload},setPreload:function(val){this.el.preload=val},autoplay:function(){return this.el.autoplay},setAutoplay:function(val){this.el.autoplay=val},loop:function(){return this.el.loop},setLoop:function(val){this.el.loop=val},error:function(){return this.el.error},seeking:function(){return this.el.seeking},ended:function(){return this.el.ended},controls:function(){return this.player.options.controls},defaultMuted:function(){return this.el.defaultMuted}});_V_.html5.isSupported=function(){return !!document.createElement("video").canPlayType};_V_.html5.canPlaySource=function(srcObj){return !!document.createElement("video").canPlayType(srcObj.type)};_V_.html5.events="loadstart,suspend,abort,error,emptied,stalled,loadedmetadata,loadeddata,canplay,canplaythrough,playing,waiting,seeking,seeked,ended,durationchange,timeupdate,progress,play,pause,ratechange,volumechange".split(",");_V_.html5.prototype.support={fullscreen:(typeof _V_.testVid.webkitEnterFullScreen!==undefined)?(!_V_.ua.match("Chrome")&&!_V_.ua.match("Mac OS X 10.5")?true:false):false,movingElementInDOM:!_V_.isIOS()};if(_V_.isAndroid()){if(_V_.androidVersion()<3){document.createElement("video").constructor.prototype.canPlayType=function(type){return(type&&type.toLowerCase().indexOf("video/mp4")!=-1)?"maybe":""}}}_V_.flash=_V_.PlaybackTech.extend({init:function(player,options){this.player=player;var source=options.source,parentEl=options.parentEl,placeHolder=this.el=_V_.createElement("div",{id:parentEl.id+"_temp_flash"}),objId=player.el.id+"_flash_api",playerOptions=player.options,flashVars=_V_.merge({readyFunction:"_V_.flash.onReady",eventProxyFunction:"_V_.flash.onEvent",errorEventProxyFunction:"_V_.flash.onError",autoplay:playerOptions.autoplay,preload:playerOptions.preload,loop:playerOptions.loop,muted:playerOptions.muted},options.flashVars),params=_V_.merge({wmode:"opaque",bgcolor:"#000000"},options.params),attributes=_V_.merge({id:objId,name:objId,"class":"vjs-tech"},options.attributes);if(source){flashVars.src=encodeURIComponent(_V_.getAbsoluteURL(source.src))}_V_.insertFirst(placeHolder,parentEl);if(options.startTime){this.ready(function(){this.load();this.play();this.currentTime(options.startTime)})}if(options.iFrameMode==true&&!_V_.isFF){var iFrm=_V_.createElement("iframe",{id:objId+"_iframe",name:objId+"_iframe",className:"vjs-tech",scrolling:"no",marginWidth:0,marginHeight:0,frameBorder:0});flashVars.readyFunction="ready";flashVars.eventProxyFunction="events";flashVars.errorEventProxyFunction="errors";_V_.addEvent(iFrm,"load",_V_.proxy(this,function(){var iDoc,objTag,swfLoc,iWin=iFrm.contentWindow,varString="";iDoc=iFrm.contentDocument?iFrm.contentDocument:iFrm.contentWindow.document;iDoc.write(_V_.flash.getEmbedCode(options.swf,flashVars,params,attributes));iWin.player=this.player;iWin.ready=_V_.proxy(this.player,function(currSwf){var el=iDoc.getElementById(currSwf),player=this,tech=player.tech;tech.el=el;_V_.addEvent(el,"click",tech.proxy(tech.onClick));_V_.flash.checkReady(tech)});iWin.events=_V_.proxy(this.player,function(swfID,eventName,other){var player=this;if(player&&player.techName=="flash"){player.triggerEvent(eventName)}});iWin.errors=_V_.proxy(this.player,function(swfID,eventName){_V_.log("Flash Error",eventName)})}));placeHolder.parentNode.replaceChild(iFrm,placeHolder)}else{_V_.flash.embed(options.swf,placeHolder,flashVars,params,attributes)}},destroy:function(){this.el.parentNode.removeChild(this.el)},play:function(){this.el.vjs_play()},pause:function(){this.el.vjs_pause()},src:function(src){src=_V_.getAbsoluteURL(src);this.el.vjs_src(src);if(this.player.autoplay()){var tech=this;setTimeout(function(){tech.play()},0)}},load:function(){this.el.vjs_load()},poster:function(){this.el.vjs_getProperty("poster")},buffered:function(){return _V_.createTimeRange(0,this.el.vjs_getProperty("buffered"))},supportsFullScreen:function(){return false},enterFullScreen:function(){return false}});(function(){var api=_V_.flash.prototype,readWrite="preload,currentTime,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted".split(","),readOnly="error,currentSrc,networkState,readyState,seeking,initialTime,duration,startOffsetTime,paused,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks".split(","),callOnly="load,play,pause".split(",");createSetter=function(attr){var attrUpper=attr.charAt(0).toUpperCase()+attr.slice(1);api["set"+attrUpper]=function(val){return this.el.vjs_setProperty(attr,val)}},createGetter=function(attr){api[attr]=function(){return this.el.vjs_getProperty(attr)}};_V_.each(readWrite,function(attr){createGetter(attr);createSetter(attr)});_V_.each(readOnly,function(attr){createGetter(attr)})})();_V_.flash.isSupported=function(){return _V_.flash.version()[0]>=10};_V_.flash.canPlaySource=function(srcObj){if(srcObj.type in _V_.flash.prototype.support.formats){return"maybe"}};_V_.flash.prototype.support={formats:{"video/flv":"FLV","video/x-flv":"FLV","video/mp4":"MP4","video/m4v":"MP4"},progressEvent:false,timeupdateEvent:false,fullscreenResize:false,parentResize:!(_V_.ua.match("Firefox"))};_V_.flash.onReady=function(currSwf){var el=_V_.el(currSwf);var player=el.player||el.parentNode.player,tech=player.tech;el.player=player;tech.el=el;tech.addEvent("click",tech.onClick);_V_.flash.checkReady(tech)};_V_.flash.checkReady=function(tech){if(tech.el.vjs_getProperty){tech.triggerReady()}else{setTimeout(function(){_V_.flash.checkReady(tech)},50)}};_V_.flash.onEvent=function(swfID,eventName){var player=_V_.el(swfID).player;player.triggerEvent(eventName)};_V_.flash.onError=function(swfID,err){var player=_V_.el(swfID).player;player.triggerEvent("error");_V_.log("Flash Error",err,swfID)};_V_.flash.version=function(){var version="0,0,0";try{version=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(e){try{if(navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){version=(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}}catch(e){}}return version.split(",")};_V_.flash.embed=function(swf,placeHolder,flashVars,params,attributes){var code=_V_.flash.getEmbedCode(swf,flashVars,params,attributes),obj=_V_.createElement("div",{innerHTML:code}).childNodes[0],par=placeHolder.parentNode;placeHolder.parentNode.replaceChild(obj,placeHolder);if(_V_.isIE()){var newObj=par.childNodes[0];setTimeout(function(){newObj.style.display="block"},1000)}return obj};_V_.flash.getEmbedCode=function(swf,flashVars,params,attributes){var objTag='<object type="application/x-shockwave-flash"',flashVarsString="",paramsString="";attrsString="";if(flashVars){_V_.eachProp(flashVars,function(key,val){flashVarsString+=(key+"="+val+"&amp;")})}params=_V_.merge({movie:swf,flashvars:flashVarsString,allowScriptAccess:"always",allowNetworking:"all"},params);_V_.eachProp(params,function(key,val){paramsString+='<param name="'+key+'" value="'+val+'" />'});attributes=_V_.merge({data:swf,width:"100%",height:"100%"},attributes);_V_.eachProp(attributes,function(key,val){attrsString+=(key+'="'+val+'" ')});return objTag+attrsString+">"+paramsString+"</object>"};_V_.Control=_V_.Component.extend({buildCSSClass:function(){return"vjs-control "+this._super()}});_V_.ControlBar=_V_.Component.extend({options:{loadEvent:"play",components:{playToggle:{},fullscreenToggle:{},currentTimeDisplay:{},timeDivider:{},durationDisplay:{},remainingTimeDisplay:{},progressControl:{},volumeControl:{},muteToggle:{}}},init:function(player,options){this._super(player,options);player.one("play",this.proxy(function(){this.fadeIn();this.player.addEvent("mouseover",this.proxy(this.fadeIn));this.player.addEvent("mouseout",this.proxy(this.fadeOut))}))},createElement:function(){return _V_.createElement("div",{className:"vjs-controls"})},fadeIn:function(){this._super();this.player.triggerEvent("controlsvisible")},fadeOut:function(){this._super();this.player.triggerEvent("controlshidden")},lockShowing:function(){this.el.style.opacity="1"}});_V_.Button=_V_.Control.extend({init:function(player,options){this._super(player,options);this.addEvent("click",this.onClick);this.addEvent("focus",this.onFocus);this.addEvent("blur",this.onBlur)},createElement:function(type,attrs){attrs=_V_.merge({className:this.buildCSSClass(),innerHTML:'<div><span class="vjs-control-text">'+(this.buttonText||"Need Text")+"</span></div>",role:"button",tabIndex:0},attrs);return this._super(type,attrs)},onClick:function(){},onFocus:function(){_V_.addEvent(document,"keyup",_V_.proxy(this,this.onKeyPress))},onKeyPress:function(event){if(event.which==32||event.which==13){event.preventDefault();this.onClick()}},onBlur:function(){_V_.removeEvent(document,"keyup",_V_.proxy(this,this.onKeyPress))}});_V_.PlayButton=_V_.Button.extend({buttonText:"Play",buildCSSClass:function(){return"vjs-play-button "+this._super()},onClick:function(){this.player.play()}});_V_.PauseButton=_V_.Button.extend({buttonText:"Pause",buildCSSClass:function(){return"vjs-pause-button "+this._super()},onClick:function(){this.player.pause()}});_V_.PlayToggle=_V_.Button.extend({buttonText:"Play",init:function(player,options){this._super(player,options);player.addEvent("play",_V_.proxy(this,this.onPlay));player.addEvent("pause",_V_.proxy(this,this.onPause))},buildCSSClass:function(){return"vjs-play-control "+this._super()},onClick:function(){if(this.player.paused()){this.player.play()}else{this.player.pause()}},onPlay:function(){_V_.removeClass(this.el,"vjs-paused");_V_.addClass(this.el,"vjs-playing")},onPause:function(){_V_.removeClass(this.el,"vjs-playing");_V_.addClass(this.el,"vjs-paused")}});_V_.FullscreenToggle=_V_.Button.extend({buttonText:"Fullscreen",buildCSSClass:function(){return"vjs-fullscreen-control "+this._super()},onClick:function(){if(!this.player.isFullScreen){this.player.requestFullScreen()}else{this.player.cancelFullScreen()}}});_V_.BigPlayButton=_V_.Button.extend({init:function(player,options){this._super(player,options);player.addEvent("play",_V_.proxy(this,this.hide));player.addEvent("ended",_V_.proxy(this,this.show))},createElement:function(){return this._super("div",{className:"vjs-big-play-button",innerHTML:"<span></span>"})},onClick:function(){if(this.player.currentTime()){this.player.currentTime(0)}this.player.play()}});_V_.LoadingSpinner=_V_.Component.extend({init:function(player,options){this._super(player,options);player.addEvent("canplay",_V_.proxy(this,this.hide));player.addEvent("canplaythrough",_V_.proxy(this,this.hide));player.addEvent("playing",_V_.proxy(this,this.hide));player.addEvent("seeking",_V_.proxy(this,this.show));player.addEvent("seeked",_V_.proxy(this,this.hide));player.addEvent("error",_V_.proxy(this,this.show));player.addEvent("waiting",_V_.proxy(this,this.show))},createElement:function(){var classNameSpinner,innerHtmlSpinner;if(typeof this.player.el.style.WebkitBorderRadius=="string"||typeof this.player.el.style.MozBorderRadius=="string"||typeof this.player.el.style.KhtmlBorderRadius=="string"||typeof this.player.el.style.borderRadius=="string"){classNameSpinner="vjs-loading-spinner";innerHtmlSpinner="<div class='ball1'></div><div class='ball2'></div><div class='ball3'></div><div class='ball4'></div><div class='ball5'></div><div class='ball6'></div><div class='ball7'></div><div class='ball8'></div>"}else{classNameSpinner="vjs-loading-spinner-fallback";innerHtmlSpinner=""}return this._super("div",{className:classNameSpinner,innerHTML:innerHtmlSpinner})}});_V_.CurrentTimeDisplay=_V_.Component.extend({init:function(player,options){this._super(player,options);player.addEvent("timeupdate",_V_.proxy(this,this.updateContent))},createElement:function(){var el=this._super("div",{className:"vjs-current-time vjs-time-controls vjs-control"});this.content=_V_.createElement("div",{className:"vjs-current-time-display",innerHTML:"0:00"});el.appendChild(_V_.createElement("div").appendChild(this.content));return el},updateContent:function(){var time=(this.player.scrubbing)?this.player.values.currentTime:this.player.currentTime();this.content.innerHTML=_V_.formatTime(time,this.player.duration())}});_V_.DurationDisplay=_V_.Component.extend({init:function(player,options){this._super(player,options);player.addEvent("timeupdate",_V_.proxy(this,this.updateContent))},createElement:function(){var el=this._super("div",{className:"vjs-duration vjs-time-controls vjs-control"});this.content=_V_.createElement("div",{className:"vjs-duration-display",innerHTML:"0:00"});el.appendChild(_V_.createElement("div").appendChild(this.content));return el},updateContent:function(){if(this.player.duration()){this.content.innerHTML=_V_.formatTime(this.player.duration())}}});_V_.TimeDivider=_V_.Component.extend({createElement:function(){return this._super("div",{className:"vjs-time-divider",innerHTML:"<div><span>/</span></div>"})}});_V_.RemainingTimeDisplay=_V_.Component.extend({init:function(player,options){this._super(player,options);player.addEvent("timeupdate",_V_.proxy(this,this.updateContent))},createElement:function(){var el=this._super("div",{className:"vjs-remaining-time vjs-time-controls vjs-control"});this.content=_V_.createElement("div",{className:"vjs-remaining-time-display",innerHTML:"-0:00"});el.appendChild(_V_.createElement("div").appendChild(this.content));return el},updateContent:function(){if(this.player.duration()){this.content.innerHTML="-"+_V_.formatTime(this.player.remainingTime())}}});_V_.Slider=_V_.Component.extend({init:function(player,options){this._super(player,options);player.addEvent(this.playerEvent,_V_.proxy(this,this.update));this.addEvent("mousedown",this.onMouseDown);this.addEvent("focus",this.onFocus);this.addEvent("blur",this.onBlur);this.player.addEvent("controlsvisible",this.proxy(this.update));this.update()},createElement:function(type,attrs){attrs=_V_.merge({role:"slider","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,tabIndex:0},attrs);return this._super(type,attrs)},onMouseDown:function(event){event.preventDefault();_V_.blockTextSelection();_V_.addEvent(document,"mousemove",_V_.proxy(this,this.onMouseMove));_V_.addEvent(document,"mouseup",_V_.proxy(this,this.onMouseUp));this.onMouseMove(event)},onMouseUp:function(event){_V_.unblockTextSelection();_V_.removeEvent(document,"mousemove",this.onMouseMove,false);_V_.removeEvent(document,"mouseup",this.onMouseUp,false);this.update()},update:function(){var barProgress,progress=this.getPercent();handle=this.handle,bar=this.bar;if(isNaN(progress)){progress=0}barProgress=progress;if(handle){var box=this.el,boxWidth=box.offsetWidth,handleWidth=handle.el.offsetWidth,handlePercent=(handleWidth)?handleWidth/boxWidth:0,boxAdjustedPercent=1-handlePercent;adjustedProgress=progress*boxAdjustedPercent,barProgress=adjustedProgress+(handlePercent/2);handle.el.style.left=_V_.round(adjustedProgress*100,2)+"%"}bar.el.style.width=_V_.round(barProgress*100,2)+"%"},calculateDistance:function(event){var box=this.el,boxX=_V_.findPosX(box),boxW=box.offsetWidth,handle=this.handle;if(handle){var handleW=handle.el.offsetWidth;boxX=boxX+(handleW/2);boxW=boxW-handleW}return Math.max(0,Math.min(1,(event.pageX-boxX)/boxW))},onFocus:function(event){_V_.addEvent(document,"keyup",_V_.proxy(this,this.onKeyPress))},onKeyPress:function(event){if(event.which==37){event.preventDefault();this.stepBack()}else{if(event.which==39){event.preventDefault();this.stepForward()}}},onBlur:function(event){_V_.removeEvent(document,"keyup",_V_.proxy(this,this.onKeyPress))}});_V_.ProgressControl=_V_.Component.extend({options:{components:{seekBar:{}}},createElement:function(){return this._super("div",{className:"vjs-progress-control vjs-control"})}});_V_.SeekBar=_V_.Slider.extend({options:{components:{loadProgressBar:{},bar:{componentClass:"PlayProgressBar"},handle:{componentClass:"SeekHandle"}}},playerEvent:"timeupdate",init:function(player,options){this._super(player,options)},createElement:function(){return this._super("div",{className:"vjs-progress-holder"})},getPercent:function(){return this.player.currentTime()/this.player.duration()},onMouseDown:function(event){this._super(event);this.player.scrubbing=true;this.videoWasPlaying=!this.player.paused();this.player.pause()},onMouseMove:function(event){var newTime=this.calculateDistance(event)*this.player.duration();if(newTime==this.player.duration()){newTime=newTime-0.1}this.player.currentTime(newTime)},onMouseUp:function(event){this._super(event);this.player.scrubbing=false;if(this.videoWasPlaying){this.player.play()}},stepForward:function(){this.player.currentTime(this.player.currentTime()+1)},stepBack:function(){this.player.currentTime(this.player.currentTime()-1)}});_V_.LoadProgressBar=_V_.Component.extend({init:function(player,options){this._super(player,options);player.addEvent("progress",_V_.proxy(this,this.update))},createElement:function(){return this._super("div",{className:"vjs-load-progress",innerHTML:'<span class="vjs-control-text">Loaded: 0%</span>'})},update:function(){if(this.el.style){this.el.style.width=_V_.round(this.player.bufferedPercent()*100,2)+"%"}}});_V_.PlayProgressBar=_V_.Component.extend({createElement:function(){return this._super("div",{className:"vjs-play-progress",innerHTML:'<span class="vjs-control-text">Progress: 0%</span>'})}});_V_.SeekHandle=_V_.Component.extend({createElement:function(){return this._super("div",{className:"vjs-seek-handle",innerHTML:'<span class="vjs-control-text">00:00</span>'})}});_V_.VolumeControl=_V_.Component.extend({options:{components:{volumeBar:{}}},createElement:function(){return this._super("div",{className:"vjs-volume-control vjs-control"})}});_V_.VolumeBar=_V_.Slider.extend({options:{components:{bar:{componentClass:"VolumeLevel"},handle:{componentClass:"VolumeHandle"}}},playerEvent:"volumechange",createElement:function(){return this._super("div",{className:"vjs-volume-bar"})},onMouseMove:function(event){this.player.volume(this.calculateDistance(event))},getPercent:function(){return this.player.volume()},stepForward:function(){this.player.volume(this.player.volume()+0.1)},stepBack:function(){this.player.volume(this.player.volume()-0.1)}});_V_.VolumeLevel=_V_.Component.extend({createElement:function(){return this._super("div",{className:"vjs-volume-level",innerHTML:'<span class="vjs-control-text"></span>'})}});_V_.VolumeHandle=_V_.Component.extend({createElement:function(){return this._super("div",{className:"vjs-volume-handle",innerHTML:'<span class="vjs-control-text"></span>'})}});_V_.MuteToggle=_V_.Button.extend({init:function(player,options){this._super(player,options);player.addEvent("volumechange",_V_.proxy(this,this.update))},createElement:function(){return this._super("div",{className:"vjs-mute-control vjs-control",innerHTML:'<div><span class="vjs-control-text">Mute</span></div>'})},onClick:function(event){this.player.muted(this.player.muted()?false:true)},update:function(event){var vol=this.player.volume(),level=3;if(vol==0||this.player.muted()){level=0}else{if(vol<0.33){level=1}else{if(vol<0.67){level=2}}}_V_.each.call(this,[0,1,2,3],function(i){_V_.removeClass(this.el,"vjs-vol-"+i)});_V_.addClass(this.el,"vjs-vol-"+level)}});_V_.PosterImage=_V_.Button.extend({init:function(player,options){this._super(player,options);if(!this.player.options.poster){this.hide()}player.addEvent("play",_V_.proxy(this,this.hide))},createElement:function(){return _V_.createElement("img",{className:"vjs-poster",src:this.player.options.poster,tabIndex:-1})},onClick:function(){this.player.play()}});_V_.Menu=_V_.Component.extend({init:function(player,options){this._super(player,options)},addItem:function(component){this.addComponent(component);component.addEvent("click",this.proxy(function(){this.unlockShowing()}))},createElement:function(){return this._super("ul",{className:"vjs-menu"})}});_V_.MenuItem=_V_.Button.extend({init:function(player,options){this._super(player,options);if(options.selected){this.addClass("vjs-selected")}},createElement:function(type,attrs){return this._super("li",_V_.merge({className:"vjs-menu-item",innerHTML:this.options.label},attrs))},onClick:function(){this.selected(true)},selected:function(selected){if(selected){this.addClass("vjs-selected")}else{this.removeClass("vjs-selected")}}});_V_.merge(_V_.Player.prototype,{addTextTracks:function(trackObjects){var tracks=this.textTracks=(this.textTracks)?this.textTracks:[],i=0,j=trackObjects.length,track,Kind;for(;i<j;i++){Kind=_V_.uc(trackObjects[i].kind||"subtitles");track=new _V_[Kind+"Track"](this,trackObjects[i]);tracks.push(track);if(track["default"]){this.ready(_V_.proxy(track,track.show))}}return this},showTextTrack:function(id,disableSameKind){var tracks=this.textTracks,i=0,j=tracks.length,track,showTrack,kind;for(;i<j;i++){track=tracks[i];if(track.id===id){track.show();showTrack=track}else{if(disableSameKind&&track.kind==disableSameKind&&track.mode>0){track.disable()}}}kind=(showTrack)?showTrack.kind:((disableSameKind)?disableSameKind:false);if(kind){this.triggerEvent(kind+"trackchange")}return this}});_V_.Track=_V_.Component.extend({init:function(player,options){this._super(player,options);_V_.merge(this,{id:options.id||("vjs_"+options.kind+"_"+options.language+"_"+_V_.guid++),src:options.src,"default":options["default"],title:options.title,language:options.srclang,label:options.label,cues:[],activeCues:[],readyState:0,mode:0})},createElement:function(){return this._super("div",{className:"vjs-"+this.kind+" vjs-text-track"})},show:function(){this.activate();this.mode=2;this._super()},hide:function(){this.activate();this.mode=1;this._super()},disable:function(){if(this.mode==2){this.hide()}this.deactivate();this.mode=0},activate:function(){if(this.readyState==0){this.load()}if(this.mode==0){this.player.addEvent("timeupdate",this.proxy(this.update,this.id));this.player.addEvent("ended",this.proxy(this.reset,this.id));if(this.kind=="captions"||this.kind=="subtitles"){this.player.textTrackDisplay.addComponent(this)}}},deactivate:function(){this.player.removeEvent("timeupdate",this.proxy(this.update,this.id));this.player.removeEvent("ended",this.proxy(this.reset,this.id));this.reset();this.player.textTrackDisplay.removeComponent(this)},load:function(){if(this.readyState==0){this.readyState=1;_V_.get(this.src,this.proxy(this.parseCues),this.proxy(this.onError))}},onError:function(err){this.error=err;this.readyState=3;this.triggerEvent("error")},parseCues:function(srcContent){var cue,time,text,lines=srcContent.split("\n"),line="",id;for(var i=1,j=lines.length;i<j;i++){line=_V_.trim(lines[i]);if(line){if(line.indexOf("-->")==-1){id=line;line=_V_.trim(lines[++i])}else{id=this.cues.length}cue={id:id,index:this.cues.length};time=line.split(" --> ");cue.startTime=this.parseCueTime(time[0]);cue.endTime=this.parseCueTime(time[1]);text=[];while(lines[++i]&&(line=_V_.trim(lines[i]))){text.push(line)}cue.text=text.join("<br/>");this.cues.push(cue)}}this.readyState=2;this.triggerEvent("loaded")},parseCueTime:function(timeText){var parts=timeText.split(":"),time=0,hours,minutes,other,seconds,ms,flags;if(parts.length==3){hours=parts[0];minutes=parts[1];other=parts[2]}else{hours=0;minutes=parts[0];other=parts[1]}other=other.split(/\s+/);seconds=other.splice(0,1)[0];seconds=seconds.split(/\.|,/);ms=parseFloat(seconds[1]);seconds=seconds[0];time+=parseFloat(hours)*3600;time+=parseFloat(minutes)*60;time+=parseFloat(seconds);if(ms){time+=ms/1000}return time},update:function(){if(this.cues.length>0){var time=this.player.currentTime();if(this.prevChange===undefined||time<this.prevChange||this.nextChange<=time){var cues=this.cues,newNextChange=this.player.duration(),newPrevChange=0,reverse=false,newCues=[],firstActiveIndex,lastActiveIndex,html="",cue,i,j;if(time>=this.nextChange||this.nextChange===undefined){i=(this.firstActiveIndex!==undefined)?this.firstActiveIndex:0}else{reverse=true;i=(this.lastActiveIndex!==undefined)?this.lastActiveIndex:cues.length-1}while(true){cue=cues[i];if(cue.endTime<=time){newPrevChange=Math.max(newPrevChange,cue.endTime);if(cue.active){cue.active=false}}else{if(time<cue.startTime){newNextChange=Math.min(newNextChange,cue.startTime);if(cue.active){cue.active=false}if(!reverse){break}}else{if(reverse){newCues.splice(0,0,cue);if(lastActiveIndex===undefined){lastActiveIndex=i}firstActiveIndex=i}else{newCues.push(cue);if(firstActiveIndex===undefined){firstActiveIndex=i}lastActiveIndex=i}newNextChange=Math.min(newNextChange,cue.endTime);newPrevChange=Math.max(newPrevChange,cue.startTime);cue.active=true}}if(reverse){if(i===0){break}else{i--}}else{if(i===cues.length-1){break}else{i++}}}this.activeCues=newCues;this.nextChange=newNextChange;this.prevChange=newPrevChange;this.firstActiveIndex=firstActiveIndex;this.lastActiveIndex=lastActiveIndex;this.updateDisplay();this.triggerEvent("cuechange")}}},updateDisplay:function(){var cues=this.activeCues,html="",i=0,j=cues.length;for(;i<j;i++){html+="<span class='vjs-tt-cue'>"+cues[i].text+"</span>"}this.el.innerHTML=html},reset:function(){this.nextChange=0;this.prevChange=this.player.duration();this.firstActiveIndex=0;this.lastActiveIndex=0}});_V_.CaptionsTrack=_V_.Track.extend({kind:"captions"});_V_.SubtitlesTrack=_V_.Track.extend({kind:"subtitles"});_V_.ChaptersTrack=_V_.Track.extend({kind:"chapters"});_V_.TextTrackDisplay=_V_.Component.extend({createElement:function(){return this._super("div",{className:"vjs-text-track-display"})}});_V_.TextTrackMenuItem=_V_.MenuItem.extend({init:function(player,options){var track=this.track=options.track;options.label=track.label;options.selected=track["default"];this._super(player,options);this.player.addEvent(track.kind+"trackchange",_V_.proxy(this,this.update))},onClick:function(){this._super();this.player.showTextTrack(this.track.id,this.track.kind)},update:function(){if(this.track.mode==2){this.selected(true)}else{this.selected(false)}}});_V_.OffTextTrackMenuItem=_V_.TextTrackMenuItem.extend({init:function(player,options){options.track={kind:options.kind,player:player,label:"Off"};this._super(player,options)},onClick:function(){this._super();this.player.showTextTrack(this.track.id,this.track.kind)},update:function(){var tracks=this.player.textTracks,i=0,j=tracks.length,track,off=true;for(;i<j;i++){track=tracks[i];if(track.kind==this.track.kind&&track.mode==2){off=false}}if(off){this.selected(true)}else{this.selected(false)}}});_V_.TextTrackButton=_V_.Button.extend({init:function(player,options){this._super(player,options);this.menu=this.createMenu();if(this.items.length===0){this.hide()}},createMenu:function(){var menu=new _V_.Menu(this.player);menu.el.appendChild(_V_.createElement("li",{className:"vjs-menu-title",innerHTML:_V_.uc(this.kind)}));menu.addItem(new _V_.OffTextTrackMenuItem(this.player,{kind:this.kind}));this.items=this.createItems();this.each(this.items,function(item){menu.addItem(item)});this.addComponent(menu);return menu},createItems:function(){var items=[];this.each(this.player.textTracks,function(track){if(track.kind===this.kind){items.push(new _V_.TextTrackMenuItem(this.player,{track:track}))}});return items},buildCSSClass:function(){return this.className+" vjs-menu-button "+this._super()},onFocus:function(){this.menu.lockShowing();_V_.one(this.menu.el.childNodes[this.menu.el.childNodes.length-1],"blur",this.proxy(function(){this.menu.unlockShowing()}))},onBlur:function(){},onClick:function(){this.one("mouseout",this.proxy(function(){this.menu.unlockShowing();this.el.blur()}))}});_V_.CaptionsButton=_V_.TextTrackButton.extend({kind:"captions",buttonText:"Captions",className:"vjs-captions-button"});_V_.SubtitlesButton=_V_.TextTrackButton.extend({kind:"subtitles",buttonText:"Subtitles",className:"vjs-subtitles-button"});_V_.ChaptersButton=_V_.TextTrackButton.extend({kind:"chapters",buttonText:"Chapters",className:"vjs-chapters-button",createItems:function(chaptersTrack){var items=[];this.each(this.player.textTracks,function(track){if(track.kind===this.kind){items.push(new _V_.TextTrackMenuItem(this.player,{track:track}))}});return items},createMenu:function(){var tracks=this.player.textTracks,i=0,j=tracks.length,track,chaptersTrack,items=this.items=[];for(;i<j;i++){track=tracks[i];if(track.kind==this.kind&&track["default"]){if(track.readyState<2){this.chaptersTrack=track;track.addEvent("loaded",this.proxy(this.createMenu));return}else{chaptersTrack=track;break}}}var menu=this.menu=new _V_.Menu(this.player);menu.el.appendChild(_V_.createElement("li",{className:"vjs-menu-title",innerHTML:_V_.uc(this.kind)}));if(chaptersTrack){var cues=chaptersTrack.cues,i=0,j=cues.length,cue,mi;for(;i<j;i++){cue=cues[i];mi=new _V_.ChaptersTrackMenuItem(this.player,{track:chaptersTrack,cue:cue});items.push(mi);menu.addComponent(mi)}}this.addComponent(menu);if(this.items.length>0){this.show()}return menu}});_V_.ChaptersTrackMenuItem=_V_.MenuItem.extend({init:function(player,options){var track=this.track=options.track,cue=this.cue=options.cue,currentTime=player.currentTime();options.label=cue.text;options.selected=(cue.startTime<=currentTime&&currentTime<cue.endTime);this._super(player,options);track.addEvent("cuechange",_V_.proxy(this,this.update))},onClick:function(){this._super();this.player.currentTime(this.cue.startTime);this.update(this.cue.startTime)},update:function(time){var cue=this.cue,currentTime=this.player.currentTime();if(cue.startTime<=currentTime&&currentTime<cue.endTime){this.selected(true)}else{this.selected(false)}}});_V_.merge(_V_.ControlBar.prototype.options.components,{subtitlesButton:{},captionsButton:{},chaptersButton:{}});_V_.autoSetup=function(){var options,vid,player,vids=document.getElementsByTagName("video");if(vids&&vids.length>0){for(var i=0,j=vids.length;i<j;i++){vid=vids[i];if(vid&&vid.getAttribute){if(vid.player===undefined){options=vid.getAttribute("data-setup");if(options!==null){options=JSON.parse(options||"{}");player=_V_(vid,options)}}}else{_V_.autoSetupTimeout(1);break}}}else{if(!_V_.windowLoaded){_V_.autoSetupTimeout(1)}}};_V_.autoSetupTimeout=function(wait){setTimeout(_V_.autoSetup,wait)};_V_.addEvent(window,"load",function(){_V_.windowLoaded=true});_V_.autoSetup();window.VideoJS=window._V_=VideoJS})(window); \ No newline at end of file
diff --git a/mediagoblin/_version.py b/mediagoblin/_version.py
index 94629775..3594c909 100644
--- a/mediagoblin/_version.py
+++ b/mediagoblin/_version.py
@@ -23,4 +23,4 @@
# see http://www.python.org/dev/peps/pep-0386/
-__version__ = "0.5.0.dev"
+__version__ = "0.6.0.dev"
diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py
index 285bddf6..8563195f 100644
--- a/mediagoblin/auth/views.py
+++ b/mediagoblin/auth/views.py
@@ -201,3 +201,161 @@ def resend_activation(request):
return redirect(
request, 'mediagoblin.user_pages.user_home',
user=request.user.username)
+
+
+def forgot_password(request):
+ """
+ Forgot password view
+
+ Sends an email with an url to renew forgotten password.
+ Use GET querystring parameter 'username' to pre-populate the input field
+ """
+ if not 'pass_auth' in request.template_env.globals:
+ return redirect(request, 'index')
+
+ fp_form = auth_forms.ForgotPassForm(request.form,
+ username=request.args.get('username'))
+
+ if not (request.method == 'POST' and fp_form.validate()):
+ # Either GET request, or invalid form submitted. Display the template
+ return render_to_response(request,
+ 'mediagoblin/auth/forgot_password.html', {'fp_form': fp_form,})
+
+ # If we are here: method == POST and form is valid. username casing
+ # has been sanitized. Store if a user was found by email. We should
+ # not reveal if the operation was successful then as we don't want to
+ # leak if an email address exists in the system.
+ found_by_email = '@' in fp_form.username.data
+
+ if found_by_email:
+ user = User.query.filter_by(
+ email = fp_form.username.data).first()
+ # Don't reveal success in case the lookup happened by email address.
+ success_message=_("If that email address (case sensitive!) is "
+ "registered an email has been sent with instructions "
+ "on how to change your password.")
+
+ else: # found by username
+ user = User.query.filter_by(
+ username = fp_form.username.data).first()
+
+ if user is None:
+ messages.add_message(request,
+ messages.WARNING,
+ _("Couldn't find someone with that username."))
+ return redirect(request, 'mediagoblin.auth.forgot_password')
+
+ success_message=_("An email has been sent with instructions "
+ "on how to change your password.")
+
+ if user and not(user.email_verified and user.status == 'active'):
+ # Don't send reminder because user is inactive or has no verified email
+ messages.add_message(request,
+ messages.WARNING,
+ _("Could not send password recovery email as your username is in"
+ "active or your account's email address has not been verified."))
+
+ return redirect(request, 'mediagoblin.user_pages.user_home',
+ user=user.username)
+
+ # SUCCESS. Send reminder and return to login page
+ if user:
+ email_debug_message(request)
+ send_fp_verification_email(user, request)
+
+ messages.add_message(request, messages.INFO, success_message)
+ return redirect(request, 'mediagoblin.auth.login')
+
+
+def verify_forgot_password(request):
+ """
+ Check the forgot-password verification and possibly let the user
+ change their password because of it.
+ """
+ # get form data variables, and specifically check for presence of token
+ formdata = _process_for_token(request)
+ if not formdata['has_token']:
+ return render_404(request)
+
+ formdata_vars = formdata['vars']
+
+ # Catch error if token is faked or expired
+ try:
+ token = get_timed_signer_url("mail_verification_token") \
+ .loads(formdata_vars['token'], max_age=10*24*3600)
+ except BadSignature:
+ messages.add_message(
+ request,
+ messages.ERROR,
+ _('The verification key or user id is incorrect.'))
+
+ return redirect(
+ request,
+ 'index')
+
+ # check if it's a valid user id
+ user = User.query.filter_by(id=int(token)).first()
+
+ # no user in db
+ if not user:
+ messages.add_message(
+ request, messages.ERROR,
+ _('The user id is incorrect.'))
+ return redirect(
+ request, 'index')
+
+ # check if user active and has email verified
+ if user.email_verified and user.status == 'active':
+
+ cp_form = auth_forms.ChangePassForm(formdata_vars)
+
+ if request.method == 'POST' and cp_form.validate():
+ user.pw_hash = auth.gen_password_hash(
+ cp_form.password.data)
+ user.save()
+
+ 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,
+ 'mediagoblin/auth/change_fp.html',
+ {'cp_form': cp_form,})
+
+ if not user.email_verified:
+ messages.add_message(
+ request, messages.ERROR,
+ _('You need to verify your email before you can reset your'
+ ' password.'))
+
+ if not user.status == 'active':
+ messages.add_message(
+ request, messages.ERROR,
+ _('You are no longer an active user. Please contact the system'
+ ' admin to reactivate your account.'))
+
+ return redirect(
+ request, 'index')
+
+
+def _process_for_token(request):
+ """
+ Checks for tokens in formdata without prior knowledge of request method
+
+ For now, returns whether the userid and token formdata variables exist, and
+ the formdata variables in a hash. Perhaps an object is warranted?
+ """
+ # retrieve the formdata variables
+ if request.method == 'GET':
+ formdata_vars = request.GET
+ else:
+ formdata_vars = request.form
+
+ formdata = {
+ 'vars': formdata_vars,
+ 'has_token': 'token' in formdata_vars}
+
+ return formdata
diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini
index 81dadd25..6f318d64 100644
--- a/mediagoblin/config_spec.ini
+++ b/mediagoblin/config_spec.ini
@@ -75,6 +75,12 @@ theme = string()
plugin_web_path = string(default="/plugin_static/")
plugin_linked_assets_dir = string(default="%(here)s/user_dev/plugin_static/")
+# Default user upload limit (in Mb)
+upload_limit = integer(default=None)
+
+# Max file size (in Mb)
+max_file_size = integer(default=None)
+
[jinja2]
# Jinja2 supports more directives than the minimum required by mediagoblin.
# This setting allows users creating custom templates to specify a list of
@@ -104,47 +110,6 @@ max_height = integer(default=640)
max_width = integer(default=180)
max_height = integer(default=180)
-[media_type:mediagoblin.media_types.image]
-# One of BICUBIC, BILINEAR, NEAREST, ANTIALIAS
-resize_filter = string(default="ANTIALIAS")
-#level of compression used when resizing images
-quality = integer(default=90)
-
-[media_type:mediagoblin.media_types.video]
-# Should we keep the original file?
-keep_original = boolean(default=False)
-
-# 0 means autodetect, autodetect means number_of_CPUs - 1
-vp8_threads = integer(default=0)
-# Range: 0..10
-vp8_quality = integer(default=8)
-# Range: -0.1..1
-vorbis_quality = float(default=0.3)
-
-# Autoplay the video when page is loaded?
-auto_play = boolean(default=False)
-
-[[skip_transcode]]
-mime_types = string_list(default=list("video/webm"))
-container_formats = string_list(default=list("Matroska"))
-video_codecs = string_list(default=list("VP8 video"))
-audio_codecs = string_list(default=list("Vorbis"))
-dimensions_match = boolean(default=True)
-
-[media_type:mediagoblin.media_types.audio]
-keep_original = boolean(default=True)
-# vorbisenc quality
-quality = float(default=0.3)
-create_spectrogram = boolean(default=True)
-spectrogram_fft_size = integer(default=4096)
-
-[media_type:mediagoblin.media_types.ascii]
-thumbnail_font = string(default=None)
-
-[media_type:mediagoblin.media_types.pdf]
-pdf_js = boolean(default=True)
-
-
[celery]
# default result stuff
CELERY_RESULT_BACKEND = string(default="database")
@@ -152,7 +117,7 @@ CELERY_RESULT_DBURI = string(default="sqlite:///%(here)s/celery.db")
# default kombu stuff
BROKER_TRANSPORT = string(default="sqlalchemy")
-BROKER_HOST = string(default="sqlite:///%(here)s/kombu.db")
+BROKER_URL = string(default="sqlite:///%(here)s/kombu.db")
# known booleans
CELERY_RESULT_PERSISTENT = boolean()
diff --git a/mediagoblin/db/extratypes.py b/mediagoblin/db/extratypes.py
index f2304af0..8e04d58d 100644
--- a/mediagoblin/db/extratypes.py
+++ b/mediagoblin/db/extratypes.py
@@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+from sqlalchemy.ext.mutable import Mutable
from sqlalchemy.types import TypeDecorator, Unicode, TEXT
import json
@@ -38,7 +39,7 @@ class PathTupleWithSlashes(TypeDecorator):
return value
-# The following class and only this one class is in very
+# The following two classes and only these two classes is in very
# large parts based on example code from sqlalchemy.
#
# The original copyright notice and license follows:
@@ -61,3 +62,30 @@ class JSONEncoded(TypeDecorator):
if value is not None:
value = json.loads(value)
return value
+
+
+class MutationDict(Mutable, dict):
+ @classmethod
+ def coerce(cls, key, value):
+ "Convert plain dictionaries to MutationDict."
+
+ if not isinstance(value, MutationDict):
+ if isinstance(value, dict):
+ return MutationDict(value)
+
+ # this call will raise ValueError
+ return Mutable.coerce(key, value)
+ else:
+ return value
+
+ def __setitem__(self, key, value):
+ "Detect dictionary set events and emit change events."
+
+ dict.__setitem__(self, key, value)
+ self.changed()
+
+ def __delitem__(self, key):
+ "Detect dictionary del events and emit change events."
+
+ dict.__delitem__(self, key)
+ self.changed()
diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py
index 374ab4c8..423508f6 100644
--- a/mediagoblin/db/migrations.py
+++ b/mediagoblin/db/migrations.py
@@ -26,7 +26,7 @@ from sqlalchemy.sql import and_
from migrate.changeset.constraint import UniqueConstraint
-from mediagoblin.db.extratypes import JSONEncoded
+from mediagoblin.db.extratypes import JSONEncoded, MutationDict
from mediagoblin.db.migration_tools import RegisterMigration, inspect_table
from mediagoblin.db.models import MediaEntry, Collection, User, MediaComment
@@ -365,6 +365,8 @@ def add_new_notification_tables(db):
CommentNotification_v0.__table__.create(db.bind)
ProcessingNotification_v0.__table__.create(db.bind)
+ db.commit()
+
@RegisterMigration(13, MIGRATIONS)
def pw_hash_nullable(db):
@@ -425,7 +427,7 @@ class RequestToken_v0(declarative_base()):
callback = Column(Unicode, nullable=False, default=u"oob")
created = Column(DateTime, nullable=False, default=datetime.datetime.now)
updated = Column(DateTime, nullable=False, default=datetime.datetime.now)
-
+
class AccessToken_v0(declarative_base()):
"""
Model for representing the access tokens
@@ -438,7 +440,7 @@ class AccessToken_v0(declarative_base()):
request_token = Column(Unicode, ForeignKey(RequestToken_v0.token))
created = Column(DateTime, nullable=False, default=datetime.datetime.now)
updated = Column(DateTime, nullable=False, default=datetime.datetime.now)
-
+
class NonceTimestamp_v0(declarative_base()):
"""
@@ -460,3 +462,47 @@ def create_oauth1_tables(db):
NonceTimestamp_v0.__table__.create(db.bind)
db.commit()
+
+
+@RegisterMigration(15, MIGRATIONS)
+def wants_notifications(db):
+ """Add a wants_notifications field to User model"""
+ metadata = MetaData(bind=db.bind)
+ user_table = inspect_table(metadata, "core__users")
+
+ col = Column('wants_notifications', Boolean, default=True)
+ col.create(user_table)
+
+ db.commit()
+
+
+@RegisterMigration(16, MIGRATIONS)
+def upload_limits(db):
+ """Add user upload limit columns"""
+ metadata = MetaData(bind=db.bind)
+
+ user_table = inspect_table(metadata, 'core__users')
+ media_entry_table = inspect_table(metadata, 'core__media_entries')
+
+ col = Column('uploaded', Integer, default=0)
+ col.create(user_table)
+
+ col = Column('upload_limit', Integer)
+ col.create(user_table)
+
+ col = Column('file_size', Integer, default=0)
+ col.create(media_entry_table)
+
+ db.commit()
+
+
+@RegisterMigration(17, MIGRATIONS)
+def add_file_metadata(db):
+ """Add file_metadata to MediaFile"""
+ metadata = MetaData(bind=db.bind)
+ media_file_table = inspect_table(metadata, "core__mediafiles")
+
+ col = Column('file_metadata', MutationDict.as_mutable(JSONEncoded))
+ col.create(media_file_table)
+
+ db.commit()
diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py
index f0cbce2a..68a2faa0 100644
--- a/mediagoblin/db/models.py
+++ b/mediagoblin/db/models.py
@@ -30,8 +30,8 @@ from sqlalchemy.sql.expression import desc
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.util import memoized_property
-
-from mediagoblin.db.extratypes import PathTupleWithSlashes, JSONEncoded
+from mediagoblin.db.extratypes import (PathTupleWithSlashes, JSONEncoded,
+ MutationDict)
from mediagoblin.db.base import Base, DictReadAttrProxy
from mediagoblin.db.mixin import UserMixin, MediaEntryMixin, \
MediaCommentMixin, CollectionMixin, CollectionItemMixin
@@ -48,6 +48,7 @@ from migrate import changeset
_log = logging.getLogger(__name__)
+
class User(Base, UserMixin):
"""
TODO: We should consider moving some rarely used fields
@@ -69,10 +70,13 @@ class User(Base, UserMixin):
# Intented to be nullable=False, but migrations would not work for it
# set to nullable=True implicitly.
wants_comment_notification = Column(Boolean, default=True)
+ wants_notifications = Column(Boolean, default=True)
license_preference = Column(Unicode)
is_admin = Column(Boolean, default=False, nullable=False)
url = Column(Unicode)
bio = Column(UnicodeText) # ??
+ uploaded = Column(Integer, default=0)
+ upload_limit = Column(Integer)
## TODO
# plugin data would be in a separate model
@@ -146,7 +150,7 @@ class RequestToken(Base):
callback = Column(Unicode, nullable=False, default=u"oob")
created = Column(DateTime, nullable=False, default=datetime.datetime.now)
updated = Column(DateTime, nullable=False, default=datetime.datetime.now)
-
+
class AccessToken(Base):
"""
Model for representing the access tokens
@@ -159,7 +163,7 @@ class AccessToken(Base):
request_token = Column(Unicode, ForeignKey(RequestToken.token))
created = Column(DateTime, nullable=False, default=datetime.datetime.now)
updated = Column(DateTime, nullable=False, default=datetime.datetime.now)
-
+
class NonceTimestamp(Base):
"""
@@ -189,6 +193,7 @@ class MediaEntry(Base, MediaEntryMixin):
# or use sqlalchemy.types.Enum?
license = Column(Unicode)
collected = Column(Integer, default=0)
+ file_size = Column(Integer, default=0)
fail_error = Column(Unicode)
fail_metadata = Column(JSONEncoded)
@@ -263,6 +268,35 @@ class MediaEntry(Base, MediaEntryMixin):
if media is not None:
return media.url_for_self(urlgen)
+ def get_file_metadata(self, file_key, metadata_key=None):
+ """
+ Return the file_metadata dict of a MediaFile. If metadata_key is given,
+ return the value of the key.
+ """
+ media_file = MediaFile.query.filter_by(media_entry=self.id,
+ name=unicode(file_key)).first()
+
+ if media_file:
+ if metadata_key:
+ return media_file.file_metadata.get(metadata_key, None)
+
+ return media_file.file_metadata
+
+ def set_file_metadata(self, file_key, **kwargs):
+ """
+ Update the file_metadata of a MediaFile.
+ """
+ media_file = MediaFile.query.filter_by(media_entry=self.id,
+ name=unicode(file_key)).first()
+
+ file_metadata = media_file.file_metadata or {}
+
+ for key, value in kwargs.iteritems():
+ file_metadata[key] = value
+
+ media_file.file_metadata = file_metadata
+ media_file.save()
+
@property
def media_data(self):
return getattr(self, self.media_data_ref)
@@ -359,6 +393,7 @@ class MediaFile(Base):
nullable=False)
name_id = Column(SmallInteger, ForeignKey(FileKeynames.id), nullable=False)
file_path = Column(PathTupleWithSlashes)
+ file_metadata = Column(MutationDict.as_mutable(JSONEncoded))
__table_args__ = (
PrimaryKeyConstraint('media_entry', 'name_id'),
@@ -646,13 +681,13 @@ with_polymorphic(
[ProcessingNotification, CommentNotification])
MODELS = [
- User, Client, RequestToken, AccessToken, NonceTimestamp, MediaEntry, Tag,
- MediaTag, MediaComment, Collection, CollectionItem, MediaFile, FileKeynames,
+ User, Client, RequestToken, AccessToken, NonceTimestamp, MediaEntry, Tag,
+ MediaTag, MediaComment, Collection, CollectionItem, MediaFile, FileKeynames,
MediaAttachmentFile, ProcessingMetaData, Notification, CommentNotification,
ProcessingNotification, CommentSubscription]
"""
- Foundations are the default rows that are created immediately after the tables
+ Foundations are the default rows that are created immediately after the tables
are initialized. Each entry to this dictionary should be in the format of:
ModelConstructorObject:List of Dictionaries
(Each Dictionary represents a row on the Table to be created, containing each
diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py
index 30dce151..0832f0db 100644
--- a/mediagoblin/edit/forms.py
+++ b/mediagoblin/edit/forms.py
@@ -61,12 +61,10 @@ class EditProfileForm(wtforms.Form):
class EditAccountForm(wtforms.Form):
- new_email = wtforms.TextField(
- _('New email address'),
- [wtforms.validators.Optional(),
- normalize_user_or_email_field(allow_user=False)])
wants_comment_notification = wtforms.BooleanField(
description=_("Email me when others comment on my media"))
+ wants_notifications = wtforms.BooleanField(
+ description=_("Enable insite notifications about events."))
license_preference = wtforms.SelectField(
_('License preference'),
[
@@ -83,6 +81,7 @@ class EditAttachmentsForm(wtforms.Form):
attachment_file = wtforms.FileField(
'File')
+
class EditCollectionForm(wtforms.Form):
title = wtforms.TextField(
_('Title'),
@@ -98,3 +97,28 @@ class EditCollectionForm(wtforms.Form):
description=_(
"The title part of this collection's address. "
"You usually don't need to change this."))
+
+
+class ChangePassForm(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 ChangeEmailForm(wtforms.Form):
+ new_email = wtforms.TextField(
+ _('New email address'),
+ [wtforms.validators.Required(),
+ normalize_user_or_email_field(allow_user=False)])
+ password = wtforms.PasswordField(
+ _('Password'),
+ [wtforms.validators.Required()],
+ description=_(
+ "Enter your password to prove you own this account."))
diff --git a/mediagoblin/edit/routing.py b/mediagoblin/edit/routing.py
index e6264fb6..a2d03d26 100644
--- a/mediagoblin/edit/routing.py
+++ b/mediagoblin/edit/routing.py
@@ -26,3 +26,5 @@ add_route('mediagoblin.edit.delete_account', '/edit/account/delete/',
'mediagoblin.edit.views:delete_account')
add_route('mediagoblin.edit.verify_email', '/edit/verify_email/',
'mediagoblin.edit.views:verify_email')
+add_route('mediagoblin.edit.email', '/edit/email/',
+ 'mediagoblin.edit.views:change_email')
diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py
index 0bd04498..da186758 100644
--- a/mediagoblin/edit/views.py
+++ b/mediagoblin/edit/views.py
@@ -227,24 +227,22 @@ def edit_account(request):
user = request.user
form = forms.EditAccountForm(request.form,
wants_comment_notification=user.wants_comment_notification,
- license_preference=user.license_preference)
+ license_preference=user.license_preference,
+ wants_notifications=user.wants_notifications)
if request.method == 'POST' and form.validate():
user.wants_comment_notification = form.wants_comment_notification.data
+ user.wants_notifications = form.wants_notifications.data
user.license_preference = form.license_preference.data
- if form.new_email.data:
- _update_email(request, form, user)
-
- if not form.errors:
- user.save()
- messages.add_message(request,
- messages.SUCCESS,
- _("Account settings saved"))
- return redirect(request,
- 'mediagoblin.user_pages.user_home',
- user=user.username)
+ 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,
@@ -384,30 +382,52 @@ def verify_email(request):
user=user.username)
-def _update_email(request, form, user):
- new_email = form.new_email.data
- users_with_email = User.query.filter_by(
- email=new_email).count()
-
- if users_with_email:
- form.new_email.errors.append(
- _('Sorry, a user with that email address'
- ' already exists.'))
-
- elif not users_with_email:
- verification_key = get_timed_signer_url(
- 'mail_verification_token').dumps({
- 'user': user.id,
- 'email': new_email})
-
- rendered_email = render_template(
- request, 'mediagoblin/edit/verification.txt',
- {'username': user.username,
- 'verification_url': EMAIL_VERIFICATION_TEMPLATE.format(
- uri=request.urlgen('mediagoblin.edit.verify_email',
- qualified=True),
- verification_key=verification_key)})
-
- email_debug_message(request)
- auth_tools.send_verification_email(user, request, new_email,
- rendered_email)
+def change_email(request):
+ """ View to change the user's email """
+ form = forms.ChangeEmailForm(request.form)
+ user = request.user
+
+ # If no password authentication, no need to enter a password
+ if 'pass_auth' not in request.template_env.globals or not user.pw_hash:
+ form.__delitem__('password')
+
+ if request.method == 'POST' and form.validate():
+ new_email = form.new_email.data
+ users_with_email = User.query.filter_by(
+ email=new_email).count()
+
+ if users_with_email:
+ form.new_email.errors.append(
+ _('Sorry, a user with that email address'
+ ' already exists.'))
+
+ if form.password and user.pw_hash and not auth.check_password(
+ form.password.data, user.pw_hash):
+ form.password.errors.append(
+ _('Wrong password'))
+
+ if not form.errors:
+ verification_key = get_timed_signer_url(
+ 'mail_verification_token').dumps({
+ 'user': user.id,
+ 'email': new_email})
+
+ rendered_email = render_template(
+ request, 'mediagoblin/edit/verification.txt',
+ {'username': user.username,
+ 'verification_url': EMAIL_VERIFICATION_TEMPLATE.format(
+ uri=request.urlgen('mediagoblin.edit.verify_email',
+ qualified=True),
+ verification_key=verification_key)})
+
+ email_debug_message(request)
+ auth_tools.send_verification_email(user, request, new_email,
+ rendered_email)
+
+ return redirect(request, 'mediagoblin.edit.account')
+
+ return render_to_response(
+ request,
+ 'mediagoblin/edit/change_email.html',
+ {'form': form,
+ 'user': user})
diff --git a/mediagoblin/gmg_commands/__init__.py b/mediagoblin/gmg_commands/__init__.py
index d8156126..165a76fd 100644
--- a/mediagoblin/gmg_commands/__init__.py
+++ b/mediagoblin/gmg_commands/__init__.py
@@ -45,6 +45,10 @@ SUBCOMMAND_MAP = {
'setup': 'mediagoblin.gmg_commands.assetlink:assetlink_parser_setup',
'func': 'mediagoblin.gmg_commands.assetlink:assetlink',
'help': 'Link assets for themes and plugins for static serving'},
+ 'reprocess': {
+ 'setup': 'mediagoblin.gmg_commands.reprocess:reprocess_parser_setup',
+ 'func': 'mediagoblin.gmg_commands.reprocess:reprocess',
+ 'help': 'Reprocess media entries'},
# 'theme': {
# 'setup': 'mediagoblin.gmg_commands.theme:theme_parser_setup',
# 'func': 'mediagoblin.gmg_commands.theme:theme',
diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py
index 98ec617d..fbac09f6 100644
--- a/mediagoblin/gmg_commands/import_export.py
+++ b/mediagoblin/gmg_commands/import_export.py
@@ -16,6 +16,7 @@
from mediagoblin import mg_globals
from mediagoblin.db.open import setup_connection_and_db_from_config
+from mediagoblin.gmg_commands import util as commands_util
from mediagoblin.storage.filestorage import BasicFileStorage
from mediagoblin.init import setup_storage, setup_global_and_app_config
@@ -223,6 +224,7 @@ def env_export(args):
'''
Export database and media files to a tar archive
'''
+ commands_util.check_unrecognized_args(args)
if args.cache_path:
if os.path.exists(args.cache_path):
_log.error('The cache directory must not exist '
diff --git a/mediagoblin/gmg_commands/reprocess.py b/mediagoblin/gmg_commands/reprocess.py
new file mode 100644
index 00000000..e2f19ea3
--- /dev/null
+++ b/mediagoblin/gmg_commands/reprocess.py
@@ -0,0 +1,302 @@
+# 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/>.
+import argparse
+import os
+
+from mediagoblin import mg_globals
+from mediagoblin.db.models import MediaEntry
+from mediagoblin.gmg_commands import util as commands_util
+from mediagoblin.submit.lib import run_process_media
+from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
+from mediagoblin.tools.pluginapi import hook_handle
+from mediagoblin.processing import (
+ ProcessorDoesNotExist, ProcessorNotEligible,
+ get_entry_and_processing_manager, get_processing_manager_for_type,
+ ProcessingManagerDoesNotExist)
+
+
+def reprocess_parser_setup(subparser):
+ subparser.add_argument(
+ '--celery',
+ action='store_true',
+ help="Don't process eagerly, pass off to celery")
+
+ subparsers = subparser.add_subparsers(dest="reprocess_subcommand")
+
+ ###################
+ # available command
+ ###################
+ available_parser = subparsers.add_parser(
+ "available",
+ help="Find out what actions are available for this media")
+
+ available_parser.add_argument(
+ "id_or_type",
+ help="Media id or media type to check")
+
+ available_parser.add_argument(
+ "--action-help",
+ action="store_true",
+ help="List argument help for each action available")
+
+ available_parser.add_argument(
+ "--state",
+ help="The state of media you would like to reprocess")
+
+
+ #############
+ # run command
+ #############
+
+ run_parser = subparsers.add_parser(
+ "run",
+ help="Run a reprocessing on one or more media")
+
+ run_parser.add_argument(
+ 'media_id',
+ help="The media_entry id(s) you wish to reprocess.")
+
+ run_parser.add_argument(
+ 'reprocess_command',
+ help="The reprocess command you intend to run")
+
+ run_parser.add_argument(
+ 'reprocess_args',
+ nargs=argparse.REMAINDER,
+ help="rest of arguments to the reprocessing tool")
+
+
+ ################
+ # thumbs command
+ ################
+ thumbs = subparsers.add_parser(
+ 'thumbs',
+ help='Regenerate thumbs for all processed media')
+
+ thumbs.add_argument(
+ '--size',
+ nargs=2,
+ type=int,
+ metavar=('max_width', 'max_height'))
+
+ #################
+ # initial command
+ #################
+ subparsers.add_parser(
+ 'initial',
+ help='Reprocess all failed media')
+
+ ##################
+ # bulk_run command
+ ##################
+ bulk_run_parser = subparsers.add_parser(
+ 'bulk_run',
+ help='Run reprocessing on a given media type or state')
+
+ bulk_run_parser.add_argument(
+ 'type',
+ help='The type of media you would like to process')
+
+ bulk_run_parser.add_argument(
+ '--state',
+ default='processed',
+ nargs='?',
+ help='The state of the media you would like to process. Defaults to' \
+ " 'processed'")
+
+ bulk_run_parser.add_argument(
+ 'reprocess_command',
+ help='The reprocess command you intend to run')
+
+ bulk_run_parser.add_argument(
+ 'reprocess_args',
+ nargs=argparse.REMAINDER,
+ help='The rest of the arguments to the reprocessing tool')
+
+ ###############
+ # help command?
+ ###############
+
+
+def available(args):
+ # Get the media type, either by looking up media id, or by specific type
+ try:
+ media_id = int(args.id_or_type)
+ media_entry, manager = get_entry_and_processing_manager(media_id)
+ media_type = media_entry.media_type
+ except ValueError:
+ media_type = args.id_or_type
+ media_entry = None
+ manager = get_processing_manager_for_type(media_type)
+ except ProcessingManagerDoesNotExist:
+ entry = MediaEntry.query.filter_by(id=args.id_or_type).first()
+ print 'No such processing manager for {0}'.format(entry.media_type)
+
+ if args.state:
+ processors = manager.list_all_processors_by_state(args.state)
+ elif media_entry is None:
+ processors = manager.list_all_processors()
+ else:
+ processors = manager.list_eligible_processors(media_entry)
+
+ print "Available processors:"
+ print "====================="
+ print ""
+
+ if args.action_help:
+ for processor in processors:
+ print processor.name
+ print "-" * len(processor.name)
+
+ parser = processor.generate_parser()
+ parser.print_help()
+ print ""
+
+ else:
+ for processor in processors:
+ if processor.description:
+ print " - %s: %s" % (processor.name, processor.description)
+ else:
+ print " - %s" % processor.name
+
+
+def run(args, media_id=None):
+ if not media_id:
+ media_id = args.media_id
+ try:
+ media_entry, manager = get_entry_and_processing_manager(media_id)
+
+ # TODO: (maybe?) This could probably be handled entirely by the
+ # processor class...
+ try:
+ processor_class = manager.get_processor(
+ args.reprocess_command, media_entry)
+ except ProcessorDoesNotExist:
+ print 'No such processor "%s" for media with id "%s"' % (
+ args.reprocess_command, media_entry.id)
+ return
+ except ProcessorNotEligible:
+ print 'Processor "%s" exists but media "%s" is not eligible' % (
+ args.reprocess_command, media_entry.id)
+ return
+
+ reprocess_parser = processor_class.generate_parser()
+ reprocess_args = reprocess_parser.parse_args(args.reprocess_args)
+ reprocess_request = processor_class.args_to_request(reprocess_args)
+ run_process_media(
+ media_entry,
+ reprocess_action=args.reprocess_command,
+ reprocess_info=reprocess_request)
+
+ except ProcessingManagerDoesNotExist:
+ entry = MediaEntry.query.filter_by(id=media_id).first()
+ print 'No such processing manager for {0}'.format(entry.media_type)
+
+
+def bulk_run(args):
+ """
+ Bulk reprocessing of a given media_type
+ """
+ query = MediaEntry.query.filter_by(media_type=args.type,
+ state=args.state)
+
+ for entry in query:
+ run(args, entry.id)
+
+
+def thumbs(args):
+ """
+ Regenerate thumbs for all processed media
+ """
+ query = MediaEntry.query.filter_by(state='processed')
+
+ for entry in query:
+ try:
+ media_entry, manager = get_entry_and_processing_manager(entry.id)
+
+ # TODO: (maybe?) This could probably be handled entirely by the
+ # processor class...
+ try:
+ processor_class = manager.get_processor(
+ 'resize', media_entry)
+ except ProcessorDoesNotExist:
+ print 'No such processor "%s" for media with id "%s"' % (
+ 'resize', media_entry.id)
+ return
+ except ProcessorNotEligible:
+ print 'Processor "%s" exists but media "%s" is not eligible' % (
+ 'resize', media_entry.id)
+ return
+
+ reprocess_parser = processor_class.generate_parser()
+
+ # prepare filetype and size to be passed into reprocess_parser
+ if args.size:
+ extra_args = 'thumb --{0} {1} {2}'.format(
+ processor_class.thumb_size,
+ args.size[0],
+ args.size[1])
+ else:
+ extra_args = 'thumb'
+
+ reprocess_args = reprocess_parser.parse_args(extra_args.split())
+ reprocess_request = processor_class.args_to_request(reprocess_args)
+ run_process_media(
+ media_entry,
+ reprocess_action='resize',
+ reprocess_info=reprocess_request)
+
+ except ProcessingManagerDoesNotExist:
+ print 'No such processing manager for {0}'.format(entry.media_type)
+
+
+def initial(args):
+ """
+ Reprocess all failed media
+ """
+ query = MediaEntry.query.filter_by(state='failed')
+
+ for entry in query:
+ try:
+ media_entry, manager = get_entry_and_processing_manager(entry.id)
+ run_process_media(
+ media_entry,
+ reprocess_action='initial')
+ except ProcessingManagerDoesNotExist:
+ print 'No such processing manager for {0}'.format(entry.media_type)
+
+
+def reprocess(args):
+ # Run eagerly unless explicetly set not to
+ if not args.celery:
+ os.environ['CELERY_ALWAYS_EAGER'] = 'true'
+
+ commands_util.setup_app(args)
+
+ if args.reprocess_subcommand == "run":
+ run(args)
+
+ elif args.reprocess_subcommand == "available":
+ available(args)
+
+ elif args.reprocess_subcommand == "bulk_run":
+ bulk_run(args)
+
+ elif args.reprocess_subcommand == "thumbs":
+ thumbs(args)
+
+ elif args.reprocess_subcommand == "initial":
+ initial(args)
diff --git a/mediagoblin/gmg_commands/util.py b/mediagoblin/gmg_commands/util.py
index 6a6853d5..63e39ca9 100644
--- a/mediagoblin/gmg_commands/util.py
+++ b/mediagoblin/gmg_commands/util.py
@@ -36,5 +36,5 @@ def prompt_if_not_set(variable, text, password=False):
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 543830c8..e3888f1b 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 1f086613..efd7d170 100644
--- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
@@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/mediagoblin/language/ar/)\n"
"MIME-Version: 1.0\n"
@@ -23,250 +23,280 @@ 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:26
-msgid "Username"
-msgstr "اسم المستخدم"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "كلمة السر"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "عنوان البريد الإلكتروني"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "عÙوًا، التسجيل غير متاح هنا."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "اسم المستخدم او الايميل"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "اسم مستخدم او ايميل غير صحيح."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "هذا الحقل لا يأخذ ايميل."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "هذا الحقل يحتاج ايميل."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "عÙوًا، التسجيل غير متاح هنا."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "عذرًا، لقد اختار مستخدم آخر هذا الاسم."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "عذرًا، لقد اختار مستخدم آخر هذا الايميل."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "تم التحقق من بريدك الإلكتروني. يمكنك الآن الولوج، وتحرير ملÙÙƒ الشخصي، ونشر الصور!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Ù…ÙØªØ§Ø­ التحقق أو معر٠المستخدم خاطئ"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "يجب عليك تسجيل الدخول لإرسال بريد الكترونى لك!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "لقد قمت Ø¨Ø§Ù„ÙØ¹Ù„ بالتحقق من عنوان البريد الإلكتروني الخاص بك!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "أعدنا إرسال رسالة التحقق."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "إذا كان هذا الايميل(حساس للحرو٠الكبيرة والصغيرة!) Ù…ÙØ³Ø¬Ù„, Ùقد تم إرسال ايميل به تعليمات عن كيÙية تغيير رقمك السري."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "لم نتمكن من العثور على أحد له أسم المستخدم هذا."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "لقد تم إرسال ايميل به تعليمات عن كيÙية تغيير رقمك السري."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "تستطيع الآن الدخول باستخدام رقمك السري الجديد."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "العنوان"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "وص٠هذا العمل."
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "بامكانك استخدام âŽ\n<a href=\"http://daringfireball.net/projects/markdown/basics\">âŽ\nMarkdown</a> للإدراج."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "الوسوم"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "قم Ø¨ÙØµÙ„ المحددات Ø¨ÙØµÙ„Ø©."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "المسار"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "لا يمكن ترك المسار ÙØ§Ø±ØºÙ‹Ø§"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "مقدمة عنوان هذه الميديا, غالبا لن تحتاج لتغيره."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "ترخيص"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "السيرة"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "الموقع الإلكتروني"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "العنوان يحتوي على اخطاء"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "ارسل لي رسالة عندما يقوم الاخرون بالتعليق على الميديا خاصتي"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "ØªÙØ¶ÙŠÙ„ رخصة"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "سو٠تكون هذه رخصتك المبدئية ÙÙŠ نماذج التحميل."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "ارسل لي رسالة عندما يقوم الاخرون بالتعليق على الميديا خاصتي"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "لا يمكن ترك العنوان ÙØ§Ø±ØºÙ‹Ø§"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "وص٠هذه المجموعة"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "مقدمة عنوان هذه المجموعة, غالبا لن تحتاج لتغيره."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr " كلمة السر القديمة"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "قم بإدخال رقمك السري القديم حتى تثبت انك صاحب هذا الحساب."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "رقم سري جديد"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "كلمة السر"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "يوجد مل٠آخر بهذا المسار لدى هذى المستخدم."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "أنت تحرّر وسائط مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "لقد قمت Ø¨Ø¥Ø¶Ø§ÙØ© مرÙقة %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "يمكنك Ùقط تعديل حسابك الخاص"
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "أنت تحرّر مل٠مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "تم Ø­ÙØ¸ تغيرات حسابك"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "تم Ø­ÙØ¸ خصائص حسابك"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "يجب عليك تأكيد إلغاء حسابك."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "أنت لديك مجموعة تدعى \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "توجد مجموعة اخرى بهذا المسار لهذا المستخدم."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "أنت تعدل مجموعة مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "كلمة سر خاطئة"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "لم يتم ربط الثيم... لاتوجد مجموعة ثيمات\n"
@@ -301,19 +331,62 @@ msgid ""
"domain."
msgstr "CSRF كوكيز غير موجودة, وهذا من الممكن ان يكون نتيجة لمانع الكوكيز او شئ من هذا القبيل.<br/>تأكد من أنك قمت بالسماح لخصائص الكوكيز لهذا الميدان."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "عذرا, انا لا ادعم هذا النوع من Ø§Ù„Ù…Ù„ÙØ§Øª :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "ÙØ´Ù„ ÙÙŠ تحويل الÙيديو"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "قام بالتعليق على مشاركتك"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "اسم المستخدم"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "عنوان البريد الإلكتروني"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "المكان"
@@ -377,7 +450,7 @@ msgstr "الرابط الموجه للبرنامج, هذا الحقل\n<strong>Ù
msgid "This field is required for public clients"
msgstr "هذا الحقل مطلوب لجمهور العملاء"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "العميل {0} تم تسجيله!"
@@ -390,59 +463,209 @@ msgid "Your OAuth clients"
msgstr "عميلك المنشئ"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "اضÙ"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "إلغاء"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "تسجيل دخول"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "ÙØ´Ù„ الولوج!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "المل٠المعطى لهذا النوع من الميديا غير صحيح."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "الملÙ"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "يجب أن تضع ملÙًا."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "يا سلام! Ù†ÙØ´Ø±ÙŽØª!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "تم Ø¥Ø¶Ø§ÙØ© المجموعة \"%s\"!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "تأكد من بريدك الإلكترونى!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "تسجيل خروج"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "تسجيل دخول"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "<a href=\"%(user_url)s\">%(user_name)s</a>'s حساب"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "تغيير خصائص الحساب"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -450,16 +673,16 @@ msgstr "تغيير خصائص الحساب"
msgid "Media processing panel"
msgstr "لوحة معالجة الوسائط"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "تسجيل خروج"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "أض٠وسائط"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "إنشاء مجموعة جديدة"
@@ -506,6 +729,59 @@ msgstr "آخر 10 تحويلات ناجحة"
msgid "No processed entries, yet!"
msgstr "لا يوجد مداخل Ù…ÙØ¹Ø§Ù„جة بعد! "
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -538,19 +814,15 @@ msgid ""
"a happy goblin!"
msgstr "مرحبًا يا %(username)sØŒ\n\nإن أردت تغيير كلمة سرك ÙÙŠ غنو ميدياغوبلن ÙØ§Ùتح الوصلة التالية ÙÙŠ Ù…ØªØµÙØ­Ùƒ:\n\n%(verification_url)s\n\nإن كنت ترى أن هذه الرسالة وصلتك خطأً ÙØªØ¬Ø§Ù‡Ù„ها واستمتع بحياتك!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "ÙØ´Ù„ الولوج!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "ألا تملك حسابًا بعد؟"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "أنشئ حسابًا هنا!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "أنسيت كلمة سرك؟"
@@ -559,7 +831,7 @@ msgstr "أنسيت كلمة سرك؟"
msgid "Create an account!"
msgstr "أنشئ حسابًا!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "أنشئ"
@@ -593,7 +865,7 @@ msgstr "تم النشر ÙˆÙقا Ù„ <a href=\"http://www.fsf.org/licensing/licen
msgid "Explore"
msgstr "استكشÙ"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "اهلا, مرحبا بك ÙÙŠ موقع MediaGoblin."
@@ -603,22 +875,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "هذا الموقع يقوم بتشغيل <a href=\"http://mediagoblin.org\">MediaGoblin</a>, وهو برنامج Ø§Ø³ØªØ¶Ø§ÙØ© ميديا ÙØ§Ø¦Ù‚ الروعة."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "لكي تضي٠الميديا خاصتك, تضع التعليقات, والمزيد, يجب عليك الدخول بحساب MediaGoblin الخاص بك."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "ليس لديك واحد حتى الآن؟ انه سهل!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -633,13 +910,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "تعديل المرÙقات Ù„ %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "مرÙقات"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "أض٠مرÙقة"
@@ -656,22 +933,29 @@ msgstr "ألغÙ"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Ø§Ø­ÙØ¸ التغييرات"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -699,14 +983,14 @@ msgstr "تحرير %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "نغيير %(username)s خصائص الحساب"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "إلغ٠حسابي"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -718,6 +1002,36 @@ msgstr "تحرير %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "تحرير مل٠%(username)s الشخصي"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -728,8 +1042,7 @@ msgstr "يتم تحديد الميديا ب: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "تحميل"
@@ -753,7 +1066,7 @@ msgid ""
msgstr "تستطيع الحصول على Ù…ØªØµÙØ­ حديث âŽ\n»يمكنه تشغيل الصوت ÙÙŠ <a href=\"http://getfirefox.com\">âŽ\n» http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "مل٠أصلي"
@@ -762,6 +1075,10 @@ msgstr "مل٠أصلي"
msgid "WebM file (Vorbis codec)"
msgstr "مل٠WebM (Vorbic كوديك)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -773,47 +1090,39 @@ msgstr "مل٠WebM (Vorbic كوديك)"
msgid "Image for %(media_title)s"
msgstr "صورة ل%(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "تبديل التدوير"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "منظور"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "مقدمة"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "أعلى"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "جانب"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "تحميل نموذج"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "بنية الملÙ"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "طول الكائن"
@@ -832,8 +1141,8 @@ msgid ""
msgstr "تستطيع الحصول على Ù…ØªØµÙØ­ حديث âŽ\n»يمكنه تشغيل هذا الÙيديو ÙÙŠ <a href=\"http://getfirefox.com\">âŽ\n» http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "WebM مل٠(640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -859,11 +1168,6 @@ msgstr "%(collection_title)s بواسطة <a href=\"%(user_url)s\">%(username)s<
msgid "Edit"
msgstr "تعديل"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "إلغاء"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -918,29 +1222,22 @@ msgstr "وسائط <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■اختيار الميديا بواسطة <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "أض٠تعليق"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "اض٠هذا التعليق"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1099,26 +1396,34 @@ msgstr "تحدد ب"
msgid "Could not read the image file."
msgstr "لم نستطيع قراءة هذه الصورة."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "ويحي!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "حدث خطأ"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "غير مسموح بهذه العملية"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "عذرا ديÙ, لا استطيع ترك ØªÙØ¹Ù„ هذا!</p><p>لقد حاولت تشغيل خاصية ليست مسموحة لك. هل كنت تحاول إلغاء جميع حسابات المستخدمين مجددا؟"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1155,10 +1460,9 @@ msgstr "تعليق"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "بامكانك استخدام <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> للإدراج."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1180,77 +1484,80 @@ msgstr "-- إختار --"
msgid "Include a note"
msgstr "إدراج ملاحظة"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "قام بالتعليق على مشاركتك"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "عذرا, لقد قمت بادخال تعليق ÙØ§Ø±Øº."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "لقد تم إرسال تعليقك!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "من ÙØ¶Ù„Ùƒ قم Ø¨ÙØ­Øµ المداخل وقم بالمحاولة مرة أخرى."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "يجب عليك إختيار أو Ø¥Ø¶Ø§ÙØ© مجموعة"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" توجد Ø¨Ø§Ù„ÙØ¹Ù„ ÙÙŠ المجموعة \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" Ø£ÙØ¶ÙŠÙت للمجموعة \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "لقد قمت بإلغاء الميديا."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "لم يتم إلغاء الميديا لأنك لم تقم بإختيار انك متأكد من ذلك."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "أنت على وشك حذ٠وسائط مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "لقد قمت بإلغاء المادة من المجموعة."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "لم يتم إلغاء المادة لأنك لم تقم بإختيار انك متأكد من ذلك."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "أنت على وشك حذ٠مادة من مجموعة مستخدم آخر. كن حذرا."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "لقد قمت بإلغاء المجموعة \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "لم يتم إلغاء المجموعة لأنك لم تقم بإختيار انك متأكد من ذلك."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "أنت على وشك حذ٠مجموعة مستخدم آخر. كن حذرا."
diff --git a/mediagoblin/i18n/bg/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/bg/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..9ffae8c1
--- /dev/null
+++ b/mediagoblin/i18n/bg/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/bg/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/bg/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..e669285a
--- /dev/null
+++ b/mediagoblin/i18n/bg/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,1559 @@
+# Translations template for PROJECT.
+# Copyright (C) 2013 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# Yasen Pramatarov <yasen@lindeas.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"Language-Team: Bulgarian (http://www.transifex.com/projects/p/mediagoblin/language/bg/)\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: bg\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr ""
+
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25
+msgid "Username or email"
+msgstr "ПотребителÑко име или е-поща"
+
+#: mediagoblin/auth/tools.py:41
+msgid "Invalid User name or email address."
+msgstr "Ðеправилно потребителÑко име или е-поща."
+
+#: mediagoblin/auth/tools.py:42
+msgid "This field does not take email addresses."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:43
+msgid "This field requires an email address."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:146
+msgid "Sorry, a user with that name already exists."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
+
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
+msgid ""
+"Your email address has been verified. You may now login, edit your profile, "
+"and submit images!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:167
+msgid "The verification key or user id is incorrect"
+msgstr ""
+
+#: mediagoblin/auth/views.py:185
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:193
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:203
+msgid "Resent your verification email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:237
+msgid ""
+"If that email address (case sensitive!) is registered an email has been sent"
+" with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:248
+msgid "Couldn't find someone with that username."
+msgstr ""
+
+#: mediagoblin/auth/views.py:251
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:258
+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:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
+msgid "You can now log in using your new password."
+msgstr "Вече може да влезете Ñ Ð½Ð¾Ð²Ð°Ñ‚Ð° Ñи парола."
+
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:45
+msgid "Title"
+msgstr "Заглавие"
+
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr "Може да ползвате\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> за форматиране."
+
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
+msgid "Tags"
+msgstr "Етикети"
+
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
+msgid "Slug"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
+msgid "The slug can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:42
+msgid ""
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
+#: mediagoblin/templates/mediagoblin/utils/license.html:20
+msgid "License"
+msgstr "Лиценз"
+
+#: mediagoblin/edit/forms.py:52
+msgid "Bio"
+msgstr "БиографиÑ"
+
+#: mediagoblin/edit/forms.py:58
+msgid "Website"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:60
+msgid "This address contains errors"
+msgstr "ÐдреÑÑŠÑ‚ Ñъдържа грешки"
+
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
+msgid "License preference"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:87
+msgid "The title can't be empty"
+msgstr "Заглавието е задължително"
+
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:48
+msgid "Description of this collection"
+msgstr "ОпиÑание на колекциÑта"
+
+#: mediagoblin/edit/forms.py:96
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:103
+msgid "Old password"
+msgstr "Стара парола"
+
+#: mediagoblin/edit/forms.py:105
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:108
+msgid "New password"
+msgstr "Ðова парола"
+
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr "Ðов Ð°Ð´Ñ€ÐµÑ Ð½Ð° е-поща"
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Парола"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
+msgid "An entry with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:91
+msgid "You are editing another user's media. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:161
+#, python-format
+msgid "You added the attachment %s!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:188
+msgid "You can only edit your own profile."
+msgstr ""
+
+#: mediagoblin/edit/views.py:194
+msgid "You are editing a user's profile. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:210
+msgid "Profile changes saved"
+msgstr "Промените в профила Ñа запазени"
+
+#: mediagoblin/edit/views.py:243
+msgid "Account settings saved"
+msgstr "ÐаÑтройките на профила Ñа запазени"
+
+#: mediagoblin/edit/views.py:277
+msgid "You need to confirm the deletion of your account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:317
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:332
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
+msgid "Wrong password"
+msgstr "Грешна парола"
+
+#: mediagoblin/edit/views.py:370
+msgid "Your password was changed successfully"
+msgstr "Паролата ви е Ñменена уÑпешно"
+
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr "ÐдреÑÑŠÑ‚ на е-пощата ви е проверен."
+
+#: mediagoblin/gmg_commands/assetlink.py:60
+msgid "Cannot link theme... no theme set\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:73
+msgid "No asset directory for this theme\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:76
+msgid "However, old link directory symlink found; removed.\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:112
+#, python-format
+msgid "Could not link \"%s\": %s exists and is not a symlink\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:119
+#, python-format
+msgid "Skipping \"%s\"; already set up.\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:124
+#, python-format
+msgid "Old link found for \"%s\"; removing.\n"
+msgstr ""
+
+#: mediagoblin/meddleware/csrf.py:134
+msgid ""
+"CSRF cookie not present. This is most likely the result of a cookie blocker "
+"or somesuch.<br/>Make sure to permit the settings of cookies for this "
+"domain."
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
+msgid "Sorry, I don't support that file type :("
+msgstr ""
+
+#: mediagoblin/media_types/pdf/processing.py:142
+msgid "unoconv failing to run, check log file"
+msgstr ""
+
+#: mediagoblin/media_types/video/processing.py:44
+msgid "Video transcoding failed"
+msgstr ""
+
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "ПотребителÑко име"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð° е-поща"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "ПотребителÑко име или е-поща"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
+#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
+msgid "Location"
+msgstr "МеÑтоположение"
+
+#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:52
+#, python-format
+msgid "View on <a href=\"%(osm_url)s\">OpenStreetMap</a>"
+msgstr "Разглеждане Ñ <a href=\"%(osm_url)s\">OpenStreetMap</a>"
+
+#: mediagoblin/plugins/oauth/forms.py:29
+msgid "Allow"
+msgstr "Позволение"
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Deny"
+msgstr "Забрана"
+
+#: mediagoblin/plugins/oauth/forms.py:34
+msgid "Name"
+msgstr "Име"
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "The name of the OAuth client"
+msgstr "Име на OAuth клиента"
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "Description"
+msgstr "ОпиÑание"
+
+#: mediagoblin/plugins/oauth/forms.py:38
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:40
+msgid "Type"
+msgstr "Вид"
+
+#: mediagoblin/plugins/oauth/forms.py:45
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:52
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:54
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:66
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:55
+msgid "The client {0} has been registered!"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/templates/oauth/client/connections.html:22
+msgid "OAuth client connections"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/templates/oauth/client/list.html:22
+msgid "Your OAuth clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
+msgid "Add"
+msgstr "ДобавÑне"
+
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr "OpenID"
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr "Грешка при проверката на %s: %s"
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr "Проверката е отменена"
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr "ДобавÑне на OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr "Изтриване на OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Изтриване"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Вход"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Грешка при влизането"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
+#: mediagoblin/submit/forms.py:26
+msgid "File"
+msgstr "Файл"
+
+#: mediagoblin/submit/views.py:52
+msgid "You must provide a file."
+msgstr "ТрÑбва да предоÑтавите файл"
+
+#: mediagoblin/submit/views.py:101
+msgid "Woohoo! Submitted!"
+msgstr ""
+
+#: mediagoblin/submit/views.py:154
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:79
+msgid "Verify your email!"
+msgstr "Проверете е-пощата Ñи!"
+
+#: mediagoblin/templates/mediagoblin/base.html:86
+msgid "log out"
+msgstr "изход"
+
+#: mediagoblin/templates/mediagoblin/base.html:105
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:112
+msgid "Change account settings"
+msgstr "ПромÑна наÑтройките на профила"
+
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
+#: mediagoblin/templates/mediagoblin/admin/panel.html:21
+#: mediagoblin/templates/mediagoblin/admin/panel.html:26
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:26
+msgid "Media processing panel"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:125
+msgid "Log out"
+msgstr "Изход"
+
+#: mediagoblin/templates/mediagoblin/base.html:128
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
+msgid "Add media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:131
+#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
+msgid "Create new collection"
+msgstr "Създаване на нова колекциÑ"
+
+#: mediagoblin/templates/mediagoblin/error.html:24
+msgid "Image of goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:32
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:29
+msgid ""
+"Here you can track the state of media being processed on this instance."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:32
+msgid "Media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:58
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:56
+msgid "No media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:61
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:59
+msgid "These uploads failed to process:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:90
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:86
+msgid "No failed entries!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:92
+msgid "Last 10 successful uploads"
+msgstr "ПоÑледни 10 уÑпешни качваниÑ"
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:112
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:107
+msgid "No processed entries, yet!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr "Влезли Ñте като"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr "ПромÑна на данните ви"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
+msgid "Set your new password"
+msgstr "Задаване на нова парола"
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:39
+msgid "Set password"
+msgstr "Задаване на парола"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:23
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:31
+msgid "Recover password"
+msgstr "ВъзÑтановÑване на парола"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:34
+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:44
+msgid "Don't have an account yet?"
+msgstr "ÐÑмате профил?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
+msgid "Create one here!"
+msgstr "Създайте Ñи!"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
+msgid "Forgot your password?"
+msgstr "Забравили Ñте паролата Ñи?"
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:28
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
+msgid "Create an account!"
+msgstr "Създаване на профил"
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
+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/bits/base_footer.html:21
+#, python-format
+msgid ""
+"Powered by <a href=\"http://mediagoblin.org/\" title='Version "
+"%(version)s'>MediaGoblin</a>, a <a href=\"http://gnu.org/\">GNU</a> project."
+msgstr "Задвижвано от <a href=\"http://mediagoblin.org/\" title='Version %(version)s'>MediaGoblin</a>, проект на <a href=\"http://gnu.org/\">GNU</a>."
+
+#: mediagoblin/templates/mediagoblin/bits/base_footer.html:24
+#, python-format
+msgid ""
+"Released under the <a "
+"href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.html\">AGPL</a>. <a "
+"href=\"%(source_link)s\">Source code</a> available."
+msgstr "Публикувано ÑъглаÑно <a href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.html\">AGPL</a>. <a href=\"%(source_link)s\">ИзходниÑÑ‚ код</a> е наличен."
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:20
+msgid "Explore"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Здравейте и добре дошли в този Ñайт на MediaGoblin!"
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:24
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
+msgid ""
+"To add your own media, place comments, and more, you can log in with your "
+"MediaGoblin account."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
+msgid "Don't have one yet? It's easy!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/logo.html:23
+#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
+msgid "MediaGoblin logo"
+msgstr "Лого на MediaGoblin"
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:23
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:35
+#, python-format
+msgid "Editing attachments for %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
+msgid "Attachments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
+msgid "Add attachment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:61
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit.html:41
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:67
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:48
+msgid "Cancel"
+msgstr "Отказ"
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
+#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
+msgid "Save changes"
+msgstr "Запазване на промените"
+
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
+#, python-format
+msgid "Changing %(username)s's email"
+msgstr "ПромÑна е-пощата на %(username)s"
+
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
+msgid "Save"
+msgstr "ЗапиÑ"
+
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "ПромÑна паролата на %(username)s"
+
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
+#, python-format
+msgid "Really delete user '%(user_name)s' and all related media/comments?"
+msgstr "ÐаиÑтина ли да Ñе изтрие потребителÑÑ‚ '%(user_name)s' и вÑички прилежащи файлове и коментари?"
+
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:35
+msgid "Yes, really delete my account"
+msgstr "Да, наиÑтина да Ñе изтрие профилът ми"
+
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:44
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:48
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit.html:35
+#, python-format
+msgid "Editing %(media_title)s"
+msgstr "Редактиране на %(media_title)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:28
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr "ПромÑна наÑтройките на профила на %(username)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
+msgstr "Изтриване на профила ми"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr "Е-поща"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr "Редактиране на %(collection_title)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:34
+#, python-format
+msgid "Editing %(username)s's profile"
+msgstr "Редактиране профила на %(username)s"
+
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr "Ðови коментари"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr "ОтбелÑзване на вÑички като прочетени"
+
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
+#: 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/audio.html:56
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
+msgid "Download"
+msgstr "ИзтеглÑне"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:38
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:44
+msgid ""
+"Sorry, this audio will not work because \n"
+"\tyour web browser does not support HTML5 \n"
+"\taudio."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:47
+msgid ""
+"You can get a modern web browser that \n"
+"\tcan play the audio at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
+msgid "Original file"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:63
+msgid "WebM file (Vorbis codec)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Създадено"
+
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:99
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:105
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:65
+#, python-format
+msgid "Image for %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
+msgid "PDF file"
+msgstr "Файл PDF"
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
+msgid "Perspective"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
+msgid "Front"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
+msgid "Top"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+msgid "Side"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
+msgid "WebGL"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
+msgid "Download model"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
+msgid "File Format"
+msgstr "Файлов формат"
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
+msgid "Object Height"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:44
+msgid ""
+"Sorry, this video will not work because\n"
+" your web browser does not support HTML5 \n"
+" video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:47
+msgid ""
+"You can get a modern web browser that \n"
+" can play this video at <a href=\"http://getfirefox.com\">\n"
+" http://getfirefox.com</a>!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr "ДобавÑне на колекциÑ"
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:23
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Add your media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr "%(collection_title)s (ÐºÐ¾Ð»ÐµÐºÑ†Ð¸Ñ Ð½Ð° %(username)s)"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr "%(collection_title)s от <a href=\"%(user_url)s\">%(username)s</a>"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+msgid "Edit"
+msgstr "Редактиране"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "ÐаиÑтина ли да Ñе изтрие %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr "ÐаиÑтина ли да Ñе премахне %(media_title)s от %(collection_title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr "Премахване"
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:21
+#, python-format
+msgid "%(username)s's collections"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:28
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s collections"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
+#, python-format
+msgid ""
+"Hi %(username)s,\n"
+"%(comment_author)s commented on your post (%(comment_url)s) at %(instance_name)s\n"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:38
+#, python-format
+msgid ""
+"<a href=\"%(user_url)s\">%(username)s</a>'s media with tag <a "
+"href=\"%(tag_url)s\">%(tag)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:48
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:38
+#, python-format
+msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
+msgid "Add a comment"
+msgstr "ДобавÑне на коментар"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
+msgid "Add this comment"
+msgstr "ДобавÑне на коментара"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr "Преглед на коментара"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
+msgid "Added"
+msgstr "Добавено"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
+#, python-format
+msgid "Add “%(media_title)s†to a collection"
+msgstr "ДобавÑне на “%(media_title)s†към колекциÑ"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:54
+msgid "+"
+msgstr "+"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:58
+msgid "Add a new collection"
+msgstr "ДобавÑне на нова колекциÑ"
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
+msgid ""
+"You can track the state of media being processed for your gallery here."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:89
+msgid "Your last 10 successful uploads"
+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 "Профил на %(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: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:100
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:117
+msgid "Edit profile"
+msgstr "Редактиране на профила"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:105
+msgid "This user hasn't filled in their profile (yet)."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:124
+msgid "Browse collections"
+msgstr "Преглед на колекциите"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:137
+#, python-format
+msgid "View all of %(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:150
+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:162
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:84
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:70
+msgid "There doesn't seem to be any media here yet..."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:49
+msgid "(remove)"
+msgstr "(премахване)"
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:21
+msgid "Collected in"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:40
+msgid "Add to a collection"
+msgstr "ДобавÑне към колекциÑ"
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
+#: mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html:21
+msgid "feed icon"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
+#: mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html:23
+msgid "Atom feed"
+msgstr "ЕмиÑÐ¸Ñ Atom"
+
+#: mediagoblin/templates/mediagoblin/utils/license.html:25
+msgid "All rights reserved"
+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:28
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:33
+msgid "newer"
+msgstr "по-ново"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:39
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:44
+msgid "older"
+msgstr "по-Ñтаро"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "Tagged with"
+msgstr ""
+
+#: mediagoblin/tools/exif.py:83
+msgid "Could not read the image file."
+msgstr ""
+
+#: mediagoblin/tools/response.py:36
+msgid "Oops!"
+msgstr "Опа!"
+
+#: mediagoblin/tools/response.py:37
+msgid "An error occured"
+msgstr "Възникна грешка"
+
+#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr "Ðеправилна заÑвка"
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
+msgid "Operation not allowed"
+msgstr "ДейÑтвието не е позволено"
+
+#: mediagoblin/tools/response.py:61
+msgid ""
+"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
+"function that you are not allowed to. Have you been trying to delete all "
+"user accounts again?"
+msgstr ""
+
+#: mediagoblin/tools/response.py:69
+msgid ""
+"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
+" the address is correct, maybe the page you're looking for has been moved or"
+" deleted."
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:62
+msgid "year"
+msgstr "година"
+
+#: mediagoblin/tools/timesince.py:63
+msgid "month"
+msgstr "меÑец"
+
+#: mediagoblin/tools/timesince.py:64
+msgid "week"
+msgstr "Ñедмица"
+
+#: mediagoblin/tools/timesince.py:65
+msgid "day"
+msgstr "ден"
+
+#: mediagoblin/tools/timesince.py:66
+msgid "hour"
+msgstr "чаÑ"
+
+#: mediagoblin/tools/timesince.py:67
+msgid "minute"
+msgstr "минута"
+
+#: mediagoblin/user_pages/forms.py:23
+msgid "Comment"
+msgstr "Коментар"
+
+#: mediagoblin/user_pages/forms.py:25
+msgid ""
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr "Може да ползвате <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">Markdown</a> за форматиране."
+
+#: mediagoblin/user_pages/forms.py:31
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "I am sure I want to remove this item from the collection"
+msgstr "ÐаиÑтина иÑкам да премахна този Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ колекциÑта"
+
+#: mediagoblin/user_pages/forms.py:39
+msgid "Collection"
+msgstr "КолекциÑ"
+
+#: mediagoblin/user_pages/forms.py:40
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:42
+msgid "Include a note"
+msgstr "ДобавÑне на бележка"
+
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr "Може да ползвате\n <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n Markdown</a> за форматиране."
+
+#: mediagoblin/user_pages/views.py:179
+msgid "Sorry, comments are disabled."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:184
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:190
+msgid "Your comment has been posted!"
+msgstr "Коментарът ви е публикуван."
+
+#: mediagoblin/user_pages/views.py:225
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:265
+msgid "You have to select or add a collection"
+msgstr "ТрÑбва да изберете или добавите колекциÑ"
+
+#: mediagoblin/user_pages/views.py:276
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr "\"%s\" вече е в колекциÑта \"%s\""
+
+#: mediagoblin/user_pages/views.py:282
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr "\"%s\" е добавено към колекциÑта \"%s\""
+
+#: mediagoblin/user_pages/views.py:302
+msgid "You deleted the media."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:314
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:321
+msgid "You are about to delete another user's media. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:395
+msgid "You deleted the item from the collection."
+msgstr "Изтрихте Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ колекциÑта."
+
+#: mediagoblin/user_pages/views.py:399
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:407
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:440
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr "Изтрихте колекциÑта \"%s\""
+
+#: mediagoblin/user_pages/views.py:447
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:455
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
index ec01d7f7..3611ec56 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 9ebbdf18..b061407a 100644
--- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Catalan (http://www.transifex.com/projects/p/mediagoblin/language/ca/)\n"
"MIME-Version: 1.0\n"
@@ -21,250 +21,280 @@ msgstr ""
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Nom d'usuari"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Contrasenya"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Adreça electrònica"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Ho sentim, el registre està desactivat en aquest cas."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Nom d'usuari o correu"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Ho sentim, el registre està desactivat en aquest cas."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Lamentablement aquest usuari ja existeix."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Perdó, ja existeix un usuari amb aquesta adreça de correu."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
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:188
+#: mediagoblin/auth/views.py:167
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:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Has d'estar conectat per saber a qui hem d'enviar el correu!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Ja has verificat la teva adreça de correu!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Torna'm a enviar el correu de verificació"
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "S'ha enviat un correu amb instruccions de com cambiar la teva contrasenya"
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "No hem pogut enviar el correu de recuperació de contrasenya perquè el teu nom d'usuari és inactiu o bé l'adreça electrònica del teu compte no ha sigut verificada."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Ara et pots conectar amb la teva nova contrasenya."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Títol"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Descripció d'aquest treball."
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Pots utilitzar⎠<a href=\"http://daringfireball.net/projects/markdown/basics\">⎠Markdown</a> per donar-li format"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Etiquetes"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Separa els tags amb comes."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Llimac"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "El llimac no pot ésser buit"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "El títol de l'adreça d'aquest mitjà. Normalment no necessites modificar això."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Llicència"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Biografia"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Lloc web"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Aquesta adreça conté errors"
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Envia'm correu quan d'altres comentin al meu mitjà"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Envia'm correu quan d'altres comentin al meu mitjà"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
+msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "El títol no pot ser buit"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Descripció d'aquesta col.lecció"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "La part del títol de l'adreça d'aquesta col.lecció. Normalment no cal que canviis això."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Contrasenya antiga"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Introdueix la teva contrasenya antiga per comprovar que aquest compte és teu."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nova contrasenya"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Contrasenya"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "Ja existeix una entrada amb aquest llimac per aquest usuari"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
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:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Esteu editant el perfil d'un usuari. Aneu amb compte"
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Els canvis al perfil s'han guardat"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Els detalls del compte s'han guardat"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Ja tens una col.lecció anomenada \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Estas editant la col.lecció d'un altre usuari. Prossegueix amb cautela."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Contrasenya errònia"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "No es pot enllaçar el tema... no hi ha tema establert\n"
@@ -299,19 +329,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Ho sento, no puc manegar aquest tipus d'arxiu :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "La transformació del vídeo ha fallat"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "comentat al teu post"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Nom d'usuari"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Adreça electrònica"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Ubicació"
@@ -375,7 +448,7 @@ msgstr "La URI de redirecció per les aplicacions, aquest camp\n és
msgid "This field is required for public clients"
msgstr "Aquest camp és requeriment per a clients públics"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "El client {0} ha sigut enregistrat!"
@@ -388,59 +461,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Afegir"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Esborrar"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Entra"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Inici de sessió ha fallat!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Aquest tipus de fitxer no és vàlid."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Fitxer"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Heu d'escollir un fitxer."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Visca! S'ha enviat!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "S'ha afegit la col.leccio \"%s\"!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Verifica el teu correu electrònic"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Entra"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Modificar els ajustaments del compte"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -448,16 +671,16 @@ msgstr "Modificar els ajustaments del compte"
msgid "Media processing panel"
msgstr "Quadre de processament de fitxers"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Tots els fitxers"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -504,6 +727,59 @@ msgstr "Les últimes 10 pujades correctes"
msgid "No processed entries, yet!"
msgstr "Encara no hi ha entrades processades!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -536,19 +812,15 @@ msgid ""
"a happy goblin!"
msgstr "Hola %(username)s,⎠⎠per cambiar la teva contrasenya de GNU MediaGoblin, obre la següent URL al ⎠teu navegador:⎠⎠%(verification_url)s⎠⎠Si creus que hi ha un error, ignora el correu i continua essent⎠un goblin feliç!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Inici de sessió ha fallat!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Encara no teniu un compte?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Creeu-ne un aquí!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Has oblidat la teva contrasenya?"
@@ -557,7 +829,7 @@ msgstr "Has oblidat la teva contrasenya?"
msgid "Create an account!"
msgstr "Creeu un compte!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Crea"
@@ -591,7 +863,7 @@ msgstr "Alliberat segons la <a href=\"http://www.fsf.org/licensing/licenses/agpl
msgid "Explore"
msgstr "Explorar"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Hola, una benvinguda al MediaGoblin!"
@@ -601,22 +873,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "El lloc esta usant <a href=\"http://mediagoblin.org\">MediaGoblin</a>, una gran i extraordinària peça de software per allotjar mitjans."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Per afegir el teu propi mitjà, col.locar comentaris, i més, pots conectar-te amb el teu compte MediaGoblin."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "No en tens una encara? Es fàcil!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -631,13 +908,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Editant afegits per a %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -654,22 +931,29 @@ msgstr "Cancel·la"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Desa els canvis"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -697,12 +981,12 @@ msgstr "Edició %(media_title)s "
msgid "Changing %(username)s's account settings"
msgstr "Modificant els detalls del compte de %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -716,6 +1000,36 @@ msgstr "Editant %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Editant perfil de %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -726,8 +1040,7 @@ msgstr "Mitjà marcat amb: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Descarregar"
@@ -751,7 +1064,7 @@ msgid ""
msgstr "Pots obtenir un navegador web modern que \n »podrà reproduir l'àudio, a <a href=\"http://getfirefox.com\">\n » http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Arxiu original"
@@ -760,6 +1073,10 @@ msgstr "Arxiu original"
msgid "WebM file (Vorbis codec)"
msgstr "Arxiu WebM (Vorbis codec)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -771,47 +1088,39 @@ msgstr "Arxiu WebM (Vorbis codec)"
msgid "Image for %(media_title)s"
msgstr "Imatge per %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -830,8 +1139,8 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "Arxiu WebM (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -857,11 +1166,6 @@ msgstr "%(collection_title)s per a <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "Editar"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Esborrar"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -916,29 +1220,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■Navegant mitjà per a <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Afegeix un comentari"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Afegir aquest comentari"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1097,26 +1394,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr "No s'ha pogut llegir l'arxiu d'imatge"
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Ups!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1153,10 +1458,9 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Pots usar <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> per donar format."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1178,77 +1482,80 @@ msgstr "-- Sel.leccionar --"
msgid "Include a note"
msgstr "Incluir una nota"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "comentat al teu post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Uups, el teu comentari era buit."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "El teu comentari s'ha publicat!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Si et plau, comprova les teves entrades i intenta-ho de nou."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Has de sel.leccionar o afegir una col.lecció"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" ja és a la col.lecció \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" afegir a la col.lecció \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Has esborrat el mitjà"
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "El mitjà no s'ha esborrat perque no has marcat que n'estiguessis segur."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Ets a punt d'esborrar el mitjà d'un altre usuari. Prossegueix amb cautela."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Has esborrat l'element de la col.lecció"
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "L'element no s'ha eliminat perque no has marcat que n'estiguessis segur."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Ets a punt d'esborrar un element de la col.lecció d'un altre usuari. Prossegueix amb cautela."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Has esborrat la col.lecció \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "La col.lecció no s'ha esborrat perquè no has marcat que n'estiguessis segur."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Ets a punt d'esborrar la col.lecció d'un altre usuari. Prossegueix amb cautela."
diff --git a/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mo
index 53e3fedf..b524a104 100644
--- a/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po
index c78c08ac..b5b546fd 100644
--- a/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/da/LC_MESSAGES/mediagoblin.po
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Danish (http://www.transifex.com/projects/p/mediagoblin/language/da/)\n"
"MIME-Version: 1.0\n"
@@ -21,250 +21,280 @@ msgstr ""
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Brugernavn"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Kodeord"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Email adresse"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Desværre, registrering er ikke muligt på denne instans"
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Brugernavn eller email"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Desværre, registrering er ikke muligt på denne instans"
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Desværre, det brugernavn er allerede brugt"
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Desværre, en bruger er allerede oprettet for den email"
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Din email adresse er blevet bekræftet. Du kan nu logge på, ændre din profil, og indsende billeder!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Bekræftelsesnøglen eller brugerid er forkert"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Du er nødt til at være logget ind, så vi ved hvem vi skal emaile!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Du har allerede bekræftet din email adresse!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Email til godkendelse sendt igen."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "En email er blevet sendt med instruktioner til at ændre dit kodeord."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "Vi kunne ikke sende en kodeords nulstillings email da dit brugernavn er inaktivt, eller din konto's email adresse er ikke blevet godkendt."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Du kan nu logge ind med dit nye kodeord."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Beskrivelse af arbejdet"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Du kan bruge\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> til formattering."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Tags"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Separer tags med kommaer."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Titeldelen af dette medie's adresse. Du behøver normalt ikke ændre dette."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Licens"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Websted"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Denne adresse indeholder fejl"
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Email mig når andre kommenterer på mine medier"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Email mig når andre kommenterer på mine medier"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
+msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Titlen kan ikke være tom"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Beskrivelse af denne samling"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "Titeldelen af denne samlings's adresse. Du behøver normalt ikke ændre dette."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Gammelt kodeord"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Skriv dit gamle kodeord for at bevise det er din konto."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Ny kodeord"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Kodeord"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Du er ved at ændre en anden brugers' medier. Pas på."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Du er ved at ændre en bruger's profil. Pas på."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Profilændringer gemt"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Kontoindstillinger gemt"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Du har allerede en samling ved navn \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Du er ved at ændre en anden bruger's samling. Pas på."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Forkert kodeord"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "Kan ikke linke til tema... intet tema sat\n"
@@ -299,19 +329,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Desværre, jeg understøtter ikke den filtype :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Brugernavn"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Email adresse"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -375,7 +448,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr "Dette felt er nødvendigt for offentlige klienter"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Klienten {0} er blevet registreret!"
@@ -388,59 +461,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr ""
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Log ind"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Forkert fil for medietypen."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Du må give mig en fil"
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Juhuu! Delt!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Bekræft din email!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Log ind"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -448,16 +671,16 @@ msgstr ""
msgid "Media processing panel"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -504,6 +727,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -536,19 +812,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Har du endnu ikke en konto?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Opret en her!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr ""
@@ -557,7 +829,7 @@ msgstr ""
msgid "Create an account!"
msgstr "Opret en konto!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr ""
@@ -591,7 +863,7 @@ msgstr ""
msgid "Explore"
msgstr "Udforsk"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Hey, velkommen til denne MediaGoblin side!"
@@ -601,22 +873,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "For at tilføje dine egne medier, skrive kommentarer, og mere, du kan logge ind med din MediaGoblin konto."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Har du ikke en endnu? Det er let!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -631,13 +908,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -654,22 +931,29 @@ msgstr "Afbryd"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Gem ændringer"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -697,12 +981,12 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -716,6 +1000,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr "Redigerer %(username)s profil"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -726,8 +1040,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -751,7 +1064,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -760,6 +1073,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -771,47 +1088,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -830,7 +1139,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -857,11 +1166,6 @@ msgstr ""
msgid "Edit"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -916,29 +1220,22 @@ msgstr ""
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1097,26 +1394,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Hovsa!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1153,9 +1458,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1178,77 +1482,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
index e2fcf85d..f9036b92 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 e2147070..7ca48ab7 100644
--- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
@@ -15,15 +15,15 @@
# Elrond <elrond+mediagoblin.org@samba-tng.org>, 2011
# Art O. Pal <artopal@fastmail.fm>, 2011
# spaetz <sebastian@sspaeth.de>, 2012
-# Vinzenz Vietzke <vinz@vinzv.de>, 2012
-# Vinzenz Vietzke <vinz@vinzv.de>, 2011
+# vinzv Vietzke <vinz@vinzv.de>, 2012
+# vinzv Vietzke <vinz@vinzv.de>, 2011
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-28 10:43+0000\n"
-"Last-Translator: Elrond <elrond+mediagoblin.org@samba-tng.org>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: German (http://www.transifex.com/projects/p/mediagoblin/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,250 +32,280 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Benutzername"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Passwort"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "E-Mail-Adresse"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Benutzerregistrierung ist auf diesem Server leider deaktiviert."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Benutzername oder E-Mail-Adresse"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Benutzername oder E-Mail-Adresse"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Ungültiger Benutzername oder E-Mail-Adresse."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Dieses Feld akzeptiert keine E-Mail-Adressen."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Dieses Feld benötigt eine E-Mail-Adresse."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Benutzerregistrierung ist auf diesem Server leider deaktiviert."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Leider gibt es bereits einen Benutzer mit diesem Namen."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
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:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Dein GNU MediaGoblin Konto wurde hiermit aktiviert. Du kannst dich jetzt anmelden, dein Profil bearbeiten und Medien hochladen."
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Der Aktivierungsschlüssel oder die Nutzerkennung ist falsch."
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
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:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Deine E-Mail-Adresse wurde bereits aktiviert."
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Aktivierungsmail wurde erneut versandt."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Falls jemand mit dieser E-Mail-Adresse (Groß- und Kleinschreibung wird unterschieden!) registriert ist, wurde eine E-Mail mit Anleitungen verschickt, wie Du Dein Passwort ändern kannst."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Es konnte niemand mit diesem Benutzernamen gefunden werden."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Es wurde eine E-Mail mit der Anleitung zur Änderung des Passwortes an Dich gesendet."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "Die E-Mail zur Wiederherstellung des Passworts konnte nicht verschickt werden, weil dein Benutzername inaktiv oder deine E-Mail-Adresse noch nicht aktiviert wurde."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Du kannst dich jetzt mit deinem neuen Passwort anmelden."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Beschreibung des Werkes"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Die Texte lassen sich durch <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> formatieren."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Schlagwörter"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Kommaseparierte Schlagwörter"
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Kurztitel"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "Bitte gib einen Kurztitel ein"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"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:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Lizenz"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Biographie"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Webseite"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Diese Adresse ist fehlerhaft"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Mir eine E-Mail schicken, wenn andere meine Medien kommentieren"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "Bevorzugte Lizenz"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Dies wird Deine Standardlizenz in den Upload-Forumularen sein."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Mir eine E-Mail schicken, wenn andere meine Medien kommentieren"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Der Titel kann nicht leer sein"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Beschreibung dieser Sammlung"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "Der Titelteil dieser Sammlungsadresse. Du musst ihn normalerweise nicht ändern."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Altes Passwort"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Gib dein altes Passwort ein, um zu bestätigen, dass du dieses Konto besitzt."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Neues Passwort"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Passwort"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
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:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Du bearbeitest die Medien eines anderen Nutzers. Sei bitte vorsichtig."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Sie haben den Anhang %s hinzugefügt!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Du kannst nur dein eigenes Profil bearbeiten."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Du bearbeitest das Profil eines anderen Nutzers. Sei bitte vorsichtig."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Das Profil wurde aktualisiert"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Kontoeinstellungen gespeichert"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Du musst die Löschung deines Kontos bestätigen."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Du hast bereits eine Sammlung mit Namen »%s«!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "Eine Sammlung mit diesem Kurztitel existiert bereits für diesen Benutzer."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Du bearbeitest die Sammlung eines anderen Benutzers. Sei vorsichtig."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Falsches Passwort"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "Theme kann nicht verknüpft werden … Kein Theme gesetzt\n"
@@ -310,19 +340,62 @@ msgid ""
"domain."
msgstr "Das CSRF cookie ist nicht vorhanden. Das liegt vermutlich an einem Cookie-Blocker oder ähnlichem.<br/>Bitte stelle sicher, dass Cookies von dieser Domäne erlaubt sind."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Entschuldigung, dieser Dateityp wird nicht unterstützt."
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Videokonvertierung fehlgeschlagen"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "hat dein Medium kommentiert"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Benutzername"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "E-Mail-Adresse"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Benutzername oder E-Mail-Adresse"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Aufnahmeort"
@@ -386,7 +459,7 @@ msgstr "Die Weiterleitungs-URI für die Anwendung, dieses Feld\n ist
msgid "This field is required for public clients"
msgstr "Dieses Feld ist Pflicht für öffentliche Clients"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Client {0} wurde registriert!"
@@ -399,59 +472,209 @@ msgid "Your OAuth clients"
msgstr "Deine OAuth-Clients"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Hinzufügen"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Löschen"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Anmelden"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Anmeldevorgang fehlgeschlagen!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Datei"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Du musst eine Datei angeben."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "JAAA! Geschafft!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "Sammlung »%s« hinzugefügt!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Bitte bestätige Deine E-Mail-Adresse!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "abmelden"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Anmelden"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "<a href=\"%(user_url)s\">%(user_name)s</a>s Konto"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Kontoeinstellungen ändern"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -459,16 +682,16 @@ msgstr "Kontoeinstellungen ändern"
msgid "Media processing panel"
msgstr "Medienverarbeitung"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Abmelden"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Medien hinzufügen"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Neues Album erstellen"
@@ -515,6 +738,59 @@ msgstr "Die letzten zehn erfolgreichen Uploads"
msgid "No processed entries, yet!"
msgstr "Noch keine verarbeiteten Einträge!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -547,19 +823,15 @@ msgid ""
"a happy goblin!"
msgstr "Hallo %(username)s,\n\num dein GNU-MediaGoblin-Passwort zu ändern, öffne folgende URL\nin deinem Webbrowser:\n\n%(verification_url)s\n\nWenn du denkst, dass es sich hierbei um einen Fehler handelt,\nignoriere einfach diese E-Mail und bleib ein glücklicher Goblin!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Anmeldevorgang fehlgeschlagen!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Hast du noch keines?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Registriere dich einfach hier!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
@@ -568,7 +840,7 @@ msgstr "Passwort vergessen?"
msgid "Create an account!"
msgstr "Neues Nutzerkonto registrieren!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Registrieren"
@@ -602,7 +874,7 @@ msgstr "Veröffentlicht unter der <a href=\"http://www.fsf.org/licensing/license
msgid "Explore"
msgstr "Entdecken"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Hallo du, willkommen auf dieser MediaGoblin-Seite!"
@@ -612,23 +884,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Diese Webseite setzt <a href=\"http://mediagoblin.org\">MediaGoblin</a> ein, eine großartige Software für Medienhosting."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Melde Dich mit Deinem MediaGoblin-Konto an, um eigene Medien hinzuzufügen, andere zu kommentieren und vieles mehr."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Hast du noch keinen? Das geht ganz einfach!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Registriere dich auf dieser Seite</a> oder <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Installiere MediaGoblin auf deinem eigenen Server</a>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -642,13 +919,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Bearbeite Anhänge von %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Anhänge"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Anhang hinzufügen"
@@ -665,22 +942,29 @@ msgstr "Abbrechen"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Änderungen speichern"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -708,14 +992,14 @@ msgstr "%(media_title)s bearbeiten"
msgid "Changing %(username)s's account settings"
msgstr "%(username)ss Kontoeinstellungen ändern"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Mein Konto löschen"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -727,6 +1011,36 @@ msgstr "Bearbeite %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "%(username)ss Profil bearbeiten"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -737,8 +1051,7 @@ msgstr "Medien mit Schlagwort: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Download"
@@ -762,7 +1075,7 @@ msgid ""
msgstr "Hol dir auf <a href=\"http://getfirefox.com\">http://getfirefox.com</a> einen modernen Webbrowser, der dieses Audiostück abspielen kann!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Originaldatei"
@@ -771,6 +1084,10 @@ msgstr "Originaldatei"
msgid "WebM file (Vorbis codec)"
msgstr "WebM-Datei (Vorbis-Codec)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Originaldatum"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -782,47 +1099,39 @@ msgstr "WebM-Datei (Vorbis-Codec)"
msgid "Image for %(media_title)s"
msgstr "Bild für %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "PDF-Datei"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "Perspektive"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "Vorderseite"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Modell herunterladen"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Dateiformat"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Objekthöhe"
@@ -841,8 +1150,8 @@ msgid ""
msgstr "Hol dir auf <a href=\"http://getfirefox.com\">http://getfirefox.com</a> einen modernen Webbrowser, der dieses Video abspielen kann!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "WebM-Datei (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -868,11 +1177,6 @@ msgstr "%(collection_title)s von <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "Bearbeiten"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Löschen"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -927,29 +1231,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a>s Medien"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "â– Medien von <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Einen Kommentar schreiben"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Kommentar absenden"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Hinzugefügt"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "Originaldatum"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1108,26 +1405,34 @@ msgstr "Schlagwörter"
msgid "Could not read the image file."
msgstr "Die Bilddatei konnte nicht gelesen werden."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Hoppla!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Ein Fehler trat auf"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Funktion nicht erlaubt"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "So nicht!</p><p>Du wolltest eine Funktion verwenden zu der Du nicht die nötigen Rechte Rechte besitzt. Wolltest Du etwa schon wieder alle Nutzerkonten löschen?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1164,10 +1469,9 @@ msgstr "Kommentar"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Die Texte lassen sich durch <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> formatieren."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1189,77 +1493,80 @@ msgstr "-- Auswählen --"
msgid "Include a note"
msgstr "Notiz anfügen"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "hat dein Medium kommentiert"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Hoppla, der Kommentartext fehlte."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Dein Kommentar wurde angenommen!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Bitte prüfe deinen Einträge und versuche erneut."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Du musst eine Sammlung auswählen oder hinzufügen"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "»%s« ist bereits in der Sammlung »%s«"
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "»%s« zur Sammlung »%s« hinzugefügt"
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Du hast das Medium gelöscht."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Das Medium wurde nicht gelöscht, da nicht angekreuzt hast, dass du es wirklich löschen möchtest."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Du versuchst Medien eines anderen Nutzers zu löschen. Sei bitte vorsichtig."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Du hast das Objekt aus der Sammlung gelöscht."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "Das Objekt wurde nicht aus der Sammlung entfernt, weil du nicht bestätigt hast, dass du dir sicher bist."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Du bist dabei ein Objekt aus der Sammlung eines anderen Nutzers zu entfernen. Sei vorsichtig."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Du hast die Sammlung »%s« gelöscht"
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "Die Sammlung wurde nicht gelöscht, weil du nicht bestätigt hast, dass du dir sicher bist."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Du bist dabei eine Sammlung eines anderen Nutzers zu entfernen. Sei vorsichtig."
diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
index 1b22b786..bc5baccb 100644
--- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2013-06-16 20:06-0500\n"
+"POT-Creation-Date: 2013-09-04 16:07-0500\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,110 +17,117 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
-#: mediagoblin/auth/forms.py:25
-msgid "Username"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:29 mediagoblin/auth/forms.py:44
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:33
-msgid "Email address"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:40
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:51
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr ""
-#: mediagoblin/auth/tools.py:42
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:43
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:44
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/tools.py:109
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr ""
-#: mediagoblin/auth/tools.py:113
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:43
-msgid "Sorry, registration is disabled on this instance."
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
msgstr ""
-#: mediagoblin/auth/views.py:133
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your "
"profile, and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:139
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:157
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr ""
-#: mediagoblin/auth/views.py:165
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr ""
-#: mediagoblin/auth/views.py:178
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:209
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been "
"sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:220
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:223
+#: mediagoblin/auth/views.py:251
msgid "An email has been sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:230
+#: mediagoblin/auth/views.py:258
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:287
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr ""
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr ""
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a "
@@ -128,139 +135,162 @@ msgid ""
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr ""
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr ""
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr ""
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr ""
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -295,19 +325,62 @@ msgid ""
"this domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -375,7 +448,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -388,59 +461,208 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr ""
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a "
+"password set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid "Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr ""
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -448,16 +670,16 @@ msgstr ""
msgid "Media processing panel"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -503,6 +725,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,19 +810,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr ""
@@ -556,7 +827,7 @@ msgstr ""
msgid "Create an account!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr ""
@@ -591,7 +862,7 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
@@ -601,25 +872,29 @@ msgid ""
"an extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your"
" MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" "
+"href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your "
+"own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -634,13 +909,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:171
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:187
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:193
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -657,22 +932,29 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -700,12 +982,12 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -719,6 +1001,38 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then"
+" \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can "
+"ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -729,8 +1043,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -754,7 +1067,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -767,13 +1080,6 @@ msgstr ""
msgid "Created"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -785,47 +1091,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -844,7 +1142,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -871,11 +1169,6 @@ msgstr ""
msgid "Edit"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -931,15 +1224,19 @@ msgstr ""
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
@@ -1099,26 +1396,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr ""
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're "
"sure the address is correct, maybe the page you're looking for has been "
@@ -1156,8 +1461,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> "
-"for formatting."
+"href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1180,78 +1485,83 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed "
"with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were "
"sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid "You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
index 645af16b..067d4f4f 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 873869f0..4510069d 100644
--- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-06-01 21:16+0000\n"
-"Last-Translator: aleksejrs <deletesoftware@yandex.ru>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Esperanto (http://www.transifex.com/projects/p/mediagoblin/language/eo/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -22,250 +22,280 @@ msgstr ""
"Language: eo\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Uzantnomo"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Pasvorto"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "RetpoÅtadreso"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Bedaŭrinde, registrado estas malaktivigita en tiu ĉi instalaĵo."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Uzantonomo aÅ­ retpoÅtadreso"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Salutnomo aÅ­ retpoÅtadreso"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Nevalida ensalutnomo aÅ­ retpoÅtadreso."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Ĉi tiu kampo ne akceptas retpoÅtadresojn."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Ĉi tiu kampo postulas retpoÅtadreson."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Bedaŭrinde, registrado estas malaktivigita en tiu ĉi instalaĵo."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "BedaÅ­rinde, uzanto kun tiu nomo jam ekzistas."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
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:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Via retpoÅtadreso estas konfirmita. Vi povas nun ensaluti, redakti vian profilon, kaj alÅuti bildojn!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "La kontrol-kodo aÅ­ la uzantonomo ne estas korekta"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
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:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Vi jam konfirmis vian retpoÅtadreson!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Resendi vian kontrol-mesaÄon."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Se tiu retpoÅtadreso (majuskloj gravas!) estas registrita, tien senditas retletero kun instrukcio pri kiel ÅanÄi vian pasvorton."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Trovitas neniu kun tiu ensalutnomo."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Senditas retletero kun instrukcio pri kiel ÅanÄi vian pasvorton."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "Ni ne povas sendi pasvortsavan retleteron, ĉar aÅ­ via konto estas neaktiva, aÅ­ Äia retpoÅtadreso ne estis konfirmita."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Nun vi povas ensaluti per via nova pasvorto."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titolo"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Priskribo de ĉi tiu verko"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Vi povas uzi por markado la lingvon\n «<a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a>»."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Etikedoj"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Dividu la etikedojn per komoj."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "La distingiga adresparto"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "La distingiga adresparto ne povas esti malplena"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "La dosiertitol-bazita parto de la dosieradreso. Ordinare ne necesas Äin ÅanÄi."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Permesilo"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Retejo"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Ĉi tiu adreso enhavas erarojn"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "RetpoÅtu min kiam aliaj komentas pri miaj alÅutaĵoj."
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "Permesila prefero"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Tiu ĉi permesilo estos antaÅ­elektita en la alÅutformularoj."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "RetpoÅtu min kiam aliaj komentas pri miaj alÅutaĵoj."
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "La titolo ne povas malpleni."
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Priskribo de la kolekto"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "La distingiga adresparto de ĉi tiu kolekto. Ordinare ne necesas Äin ÅanÄi."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "La malnova pasvorto"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Enigu vian malnovan pasvorton por pruvi, ke ĉi tiu konto estas via."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "La nova pasvorto"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Pasvorto"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
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:91
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:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Vi aldonis la kundosieron %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Vi povas redakti nur vian propran profilon."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Vi redaktas profilon de alia uzanto. Agu singardeme."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "ProfilÅanÄoj estis konservitaj"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Kontagordoj estis konservitaj"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Vi bezonas konfirmi la forigon de via konto."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Vi jam havas kolekton kun la nomo «%s»!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "Ĉi tiu uzanto jam havas kolekton kun tiu distingiga adresparto."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Vi redaktas kolekton de alia uzanto. Agu singardeme."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "MalÄusta pasvorto"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "Via pasvorto estas sukcese ÅanÄita"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "Alligo de etoso ne eblas… ne estas elektita ekzistanta etoso\n"
@@ -300,19 +330,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Mi pardonpetas, mi ne subtenas tiun dosiertipon :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Malsukcesis transkodado de filmo"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "komentis je via afiÅo"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Uzantnomo"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "RetpoÅtadreso"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Uzantonomo aÅ­ retpoÅtadreso"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Loko"
@@ -376,7 +449,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -389,59 +462,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Aldoni"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Forigi"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Ensaluti"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Ensaluto malsukcesis!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "La provizita dosiero ne konformas al la informtipo."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Dosiero"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Vi devas provizi dosieron."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Hura! AlÅutitas!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "Kolekto «%s» aldonitas!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Konfirmu viecon de la retpoÅtadreso!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "elsaluti"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Ensaluti"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "Konto de <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "ÅœanÄi kontagordojn"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -449,16 +672,16 @@ msgstr "ÅœanÄi kontagordojn"
msgid "Media processing panel"
msgstr "Kontrolejo pri dosierpreparado."
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Elsaluti"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Aldoni dosieron"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Krei novan kolekton"
@@ -505,6 +728,59 @@ msgstr "La dek lastaj sukcesaj alÅutoj"
msgid "No processed entries, yet!"
msgstr "AnkoraÅ­ ne ekzistas eroj prilaboritaj!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -537,19 +813,15 @@ msgid ""
"a happy goblin!"
msgstr "Saluton, %(username)s,\n\npor ÅanÄi vian pasvorton ĉe GNUa MediaGoblin, sekvu la jenan retadreson per via TTT-legilo:\n\n%(verification_url)s\n\nSe vi pensas, ke ĉi tiu retletero estas sendita erare, simple ignoru Äin kaj plu restu feliĉa koboldo!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Ensaluto malsukcesis!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Ĉu ankoraŭ sen konto?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Kreu Äin ĉi tie!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Ĉu vi forgesis vian pasvorton?"
@@ -558,7 +830,7 @@ msgstr "Ĉu vi forgesis vian pasvorton?"
msgid "Create an account!"
msgstr "Kreu konton!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Krei"
@@ -592,7 +864,7 @@ msgstr "Disponigita laÅ­ la permesilo <a href=\"http://www.fsf.org/licensing/lic
msgid "Explore"
msgstr "Ĉirkaŭrigardi"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Saluton, kaj bonvenon al ĉi tiu MediaGoblina retpaÄaro!"
@@ -602,22 +874,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Ĉ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/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Por aldoni viajn proprajn dosierojn, afiÅi komentariojn ktp, vi povas ensaluti je via MediaGoblina konto."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Ĉu vi ankoraÅ­ ne havas tian? Ne malÄoju!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -632,13 +909,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Aldoni kundosierojn por %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Kundosieroj"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Aldoni kundosieron"
@@ -655,22 +932,29 @@ msgstr "Nuligi"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Konservi ÅanÄojn"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "ÅœanÄado de pasvorto de %(username)s"
+msgid "Changing %(username)s's email"
+msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "Konservi"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "ÅœanÄado de pasvorto de %(username)s"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -698,14 +982,14 @@ msgstr "Priredaktado de %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "ÅœanÄado de kontagordoj de %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "ÅœanÄi la pasvorton"
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Forigi mian konton."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -717,6 +1001,36 @@ msgstr "Redaktado de %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Redaktado de l’profilo de %(username)s'"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "antaÅ­ %(formatted_time)s"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -727,8 +1041,7 @@ msgstr "Dosieroj kun etikedo: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "ElÅuti"
@@ -752,7 +1065,7 @@ msgid ""
msgstr "Vi povas akiri modernan TTT-legilon, kapablan \n\tsonigi la registraĵon ĉe <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "originalan dosieron"
@@ -761,6 +1074,10 @@ msgstr "originalan dosieron"
msgid "WebM file (Vorbis codec)"
msgstr "WebMan dosieron (kun Vorbisa kodaĵo)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Kreita"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -772,47 +1089,39 @@ msgstr "WebMan dosieron (kun Vorbisa kodaĵo)"
msgid "Image for %(media_title)s"
msgstr "Bildo de «%(media_title)s»"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "PDF-dosiero"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "DeantaÅ­e"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "Desupre"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Deflanke"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "ElÅuti la modelon"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "InformaranÄo"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Alto de la objekto"
@@ -831,8 +1140,8 @@ msgid ""
msgstr "Vi povas elÅuti modernan TTT-legilon, kapablan \n montri la filmon, de <a href=\"http://getfirefox.com\">\n http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "la WebM-dosieron (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -858,11 +1167,6 @@ msgstr "%(collection_title)s de <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "ÅœanÄi"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Forigi"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -917,29 +1221,22 @@ msgstr "Dosieroj de <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■ПроÑмотр файлов Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Aldoni komenton"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Aldoni ĉi tiun komenton"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "antaÅ­ %(formatted_time)s"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Aldonita"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "Kreita"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1098,26 +1395,34 @@ msgstr "Markita per"
msgid "Could not read the image file."
msgstr "Malsukcesis lego de la bildodosiero"
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Oj!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Okazis eraro"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1154,10 +1459,9 @@ msgstr "Komenti"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Vi povas uzi por markado la lingvon «<a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a>»."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1179,77 +1483,80 @@ msgstr "-- Elektu --"
msgid "Include a note"
msgstr "Rimarko"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "komentis je via afiÅo"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "Ve, komentado estas malebligita."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Oj, via komento estis malplena."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Via komento estis afiÅita!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Bonvolu kontroli vian enigitaĵon kaj reprovi."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Necesas elekti aÅ­ aldoni kolekton"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "«%s» jam estas en la kolekto «%s»"
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "«%s» estis aldonita al la kolekto «%s»"
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Vi forigis la dosieron."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
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:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Vi estas forigonta dosieron de alia uzanto. Estu singardema."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Vi forigis la dosieron el la kolekto."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed 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:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Vi estas forigonta dosieron el kolekto de alia uzanto. Agu singardeme."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Vi forigis la kolekton «%s»"
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "La kolekto ne estis forigita, ĉar vi ne konfirmis vian certecon per la markilo."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Vi estas forigonta kolekton de alia uzanto. Agu singardeme."
diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
index c5e50f53..c9965ccf 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 8c2f046f..934fdad6 100644
--- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
@@ -19,9 +19,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-06-02 21:23+0000\n"
-"Last-Translator: larjona <larjona99@gmail.com>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/mediagoblin/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -30,250 +30,280 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Nombre de usuario"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Contraseña"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Dirección de correo electrónico"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Lo sentimos, el registro está deshabilitado en este momento."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Nombre de usuario o correo electrónico"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr "Lo siento, la autenticación está deshabilitada en esta instancia."
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Nombre de usuario o email"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Nombre de usuario o correo electrónico inválido."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Este campo no acepta direcciones de correo."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Este campo requiere una dirección de correo."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Lo sentimos, el registro está deshabilitado en este momento."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Lo sentimos, ya existe un usuario con ese nombre."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
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:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr "La clave de verificación o el identificador de usuario son incorrectos."
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Tu dirección de correo electrónico ha sido verificada. ¡Ahora puedes iniciar sesión, editar tu perfil, y enviar imágenes!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
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:206
+#: mediagoblin/auth/views.py:185
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:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "¡Ya has verificado tu dirección de correo!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Se reenvió tu correo electrónico de verificación."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Si esa dirección de correo (¡sensible a mayúsculas y minúsculas!) está registrada, se ha enviado un correo con instrucciones para cambiar la contraseña."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "No se ha podido encontrar a nadie con ese nombre de usuario."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Un correo electrónico ha sido enviado con instrucciones sobre cómo cambiar tu contraseña."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "No se pudo enviar un correo electrónico de recuperación de contraseñas porque tu nombre de usuario está inactivo o la dirección de su cuenta de correo electrónico no ha sido verificada."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr "El identificador de usuario es incorrecto."
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Ahora tu puedes iniciar sesión usando tu nueva contraseña."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr "Necesitas verificar tu correo electrónico antes de restablecer tu contraseña."
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Título"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Descripción de esta obra"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Puedes usar\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> para el formato."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Etiquetas"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Separa las etiquetas por comas."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Ficha"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "La ficha no puede estar vacía"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "El título de esta parte de la dirección de los contenidos. Por lo general no es necesario cambiar esto."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Licencia"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Sitio web"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "La dirección contiene errores"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Envíame un correo cuando otros escriban comentarios sobre mi contenido"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "Preferencias de licencia"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Ésta será tu licencia predeterminada en los formularios de subida."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Envíame un correo cuando otros escriban comentarios sobre mi contenido"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "El título no puede estar vacío"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Descripción de esta colección"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "El título de la dirección de esta colección. Generalmente no necesitas cambiar esto."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Vieja contraseña"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Escriba la anterior contraseña para demostrar que esta cuenta te pertenece."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nueva contraseña"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr "Nueva dirección de correo electrónico"
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Contraseña"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr "Introduce tu contraseña para probar que posees la cuenta."
+
+#: mediagoblin/edit/views.py:73
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:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Estás editando el contenido de otro usuario. Procede con precaución."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "¡Has añadido el adjunto %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Sólo puedes editar tu propio perfil."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Estás editando un perfil de usuario. Procede con precaución."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Los cambios de perfil fueron salvados"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "las configuraciones de cuenta fueron salvadas"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Necesitas confirmar el borrado de tu cuenta."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "¡Ya tienes una colección llamada \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "Una colección con esa ficha ya existe para este usuario/a."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Estás editando la colección de otro usuario/a. Ten cuidado."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Contraseña incorrecta"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "Se ha cambiado la contraseña correctamente"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr "Tu dirección de correo electrónico ha sido verificada."
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "No se puede enlazar al tema... no hay un tema seleccionado\n"
@@ -308,19 +338,62 @@ msgid ""
"domain."
msgstr "No se encuentra la cookie CSRF. Esto suele ser debido a un bloqueador de cookies o similar.<br/> Por favor asegúrate de permitir las cookies para este dominio."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Lo sentidos, No soportamos ese tipo de archivo :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr "ha fallado la ejecución de unoconv, comprueba el fichero de registro (log)"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Ha fallado la conversión de vídeo"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "comentó tu publicación"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr "¡Suscrito a comentarios sobre %s!"
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr "No recibirás notificaciones de comentarios sobre %s."
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr "Se debe proporcionar un código (token) de OAuth."
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr "No se ha encontrado el código (token) de petición."
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Nombre de usuario"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Dirección de correo electrónico"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Nombre de usuario o correo electrónico"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr "Mantener iniciada la sesión"
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Locación"
@@ -384,7 +457,7 @@ msgstr "La URI para redireccionar las aplicaciones, este campo es <strong>requer
msgid "This field is required for public clients"
msgstr "Este campo es requerido para los clientes públicos"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "¡El cliente {0} ha sido registrado!"
@@ -397,59 +470,209 @@ msgid "Your OAuth clients"
msgstr "Tus clientes OAuth"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Añadir "
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr "Lo siento, ya hay registrada una cuenta con esa OpenID."
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr "OpenID"
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr "Lo siento, no se ha encontrado el servidor OpenID"
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr "No se ha encontrado el servicio OpenID para %s"
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr "Falló la verificación de %s: %s"
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr "Verificación cancelada"
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr "Tu url de OpenID se ha guardado correctamente."
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr "No puedes borrar tu única url de OpenID a menos que tengas establecida una contraseña"
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr "Esa OpenID no está registrada para esta cuenta."
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr "Se ha eliminado correctamente la OpenID."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr "Agregar una OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr "Eliminar una OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Borrar"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr "OpenID's"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Iniciar sesión"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "¡Hubo un fallo al iniciar sesión!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr "¡Inicia sesión para crear una cuenta!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr "¡O inicia sesión con contraseña!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr "¡O inicia sesión con OpenID!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr "¡O regístrate con OpenID!"
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr "Lo siento, ya hay una cuenta registrada para ese correo electrónico de Persona."
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr "La dirección de correo electrónico de Persona se ha eliminado correctamente."
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr "No puedes borrar tu única dirección de correo electrónico de Persona a menos que tengas establecida una contraseña."
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr "Esa dirección de correo electrónico de Persona no está registrada para esta cuenta."
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr "Lo siento, ya hay una cuenta registrada con esa dirección de correo electrónico de Persona."
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr "Se ha guardado correctamente tu dirección de correo electrónico de Persona."
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr "Eliminar una dirección de correo electrónico de Persona"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr "Agregar una dirección de correo electrónico de Persona"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr "Editar tus direcciones de correo electrónico de Persona"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr "¡O inicia sesión con Persona!"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr "¡O regístrate con Persona!"
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Archivo inválido para el formato seleccionado."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr "La copia al almacenamiento público ha fallado."
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr "No se ha encontrado un fichero de procesamiento aceptable"
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Archivo"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Debes proporcionar un archivo."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "¡Yuju! ¡Enviado!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "¡Colección \"%s\" añadida!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "¡Verifica tu email!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "cerrar sesión"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Iniciar sesión"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "Cuenta de <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Cambiar la configuración de la cuenta"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -457,16 +680,16 @@ msgstr "Cambiar la configuración de la cuenta"
msgid "Media processing panel"
msgstr "Panel de procesamiento de contenido"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Cerrar sesión"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Añadir contenido"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Crear nueva colección"
@@ -513,6 +736,59 @@ msgstr "Últimos 10 envíos con éxito"
msgid "No processed entries, yet!"
msgstr "¡Aún no hay entradas procesadas!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr "Autorización"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr "Autorizar"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr "Has iniciado sesión como"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr "¿Quieres autorizar a"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr "una aplicación desconocida"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr "para que acceda a tu cuenta?"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr "Las aplicaciones con acceso a tu cuenta pueden:"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr "Publicar nuevos contenidos por tí"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr "Ver tu información (p.ej. perfil, contenidos, etc...)"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr "Cambiar tu información"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr "Autorización finalizada"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr "Autorización completa"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr "Copia y pega esto en tu cliente:"
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -545,19 +821,15 @@ msgid ""
"a happy goblin!"
msgstr "Hola %(username)s,\n\nPara cambiar tu contraseña de GNU MediaGoblin, abre la siguiente URL en un navegador:\n\n%(verification_url)s \n\nSi piensas que esto es un error, simplemente ignora este mensaje y sigue siendo un duende feliz."
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "¡Hubo un fallo al iniciar sesión!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "¿No tienes una cuenta?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "¡Crea una aquí!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "¿Olvidaste tu contraseña?"
@@ -566,7 +838,7 @@ msgstr "¿Olvidaste tu contraseña?"
msgid "Create an account!"
msgstr "¡Crea una cuenta!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Crear"
@@ -600,7 +872,7 @@ msgstr "Publicado bajo la <a href=\"http://www.fsf.org/licensing/licenses/agpl-3
msgid "Explore"
msgstr "Explorar"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Hola, ¡bienvenido a este sitio de MediaGoblin!"
@@ -610,23 +882,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Este sitio está montado con <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un extraordinario programa libre para alojar, gestionar y compartir contenido multimedia."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Para añadir tus propios contenidos, dejar comentarios y más, puedes iniciar sesión con tu cuenta de MediaGoblin."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "¿Aún no tienes una? ¡Es fácil!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr "\n >Crear una cuenta en este sitio</a>\n o"
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Crear una cuenta en este sitio</a>\n o\n <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Instalar MediaGoblin en tu propio servidor</a>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr "\n <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Instalar MediaGoblin en tu propio servidor</a>"
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -640,13 +917,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Editando archivos adjuntos a %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Adjuntos"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Agregar adjunto"
@@ -663,22 +940,29 @@ msgstr "Cancelar"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Guardar cambios"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "Cambiando la contraseña de %(username)s"
+msgid "Changing %(username)s's email"
+msgstr "Cambiando el correo electrónico de %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "Guardar"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "Cambiando la contraseña de %(username)s"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -706,14 +990,14 @@ msgstr "Editando %(media_title)s "
msgid "Changing %(username)s's account settings"
msgstr "Cambio de %(username)s la configuración de la cuenta "
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "Cambiar tu contraseña."
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Borrar mi cuenta"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr "Correo electrónico"
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -725,6 +1009,36 @@ msgstr "Editando %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Editando el perfil de %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr "Hola,\n\nQueríamos verificar que eres %(username)s. Si ése es el caso, entonces \npor favor sigue el enlace de abajo para verificar tu nueva dirección de correo electrónico.\n\n%(verification_url)s\n\nSi no eres %(username)s o no solicitaste un cambio de dirección de correo electrónico,\npuedes ignorar este correo."
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr "Nuevos comentarios"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "hace %(formatted_time)s"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr "Marcar todo como leído"
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -735,8 +1049,7 @@ msgstr "Contenido etiquetado con: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Descargar"
@@ -760,7 +1073,7 @@ msgid ""
msgstr "Tú puedes obtener un navegador más moderno que \n\tpueda reproducir el audio <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Archivo original"
@@ -769,6 +1082,10 @@ msgstr "Archivo original"
msgid "WebM file (Vorbis codec)"
msgstr "Archivo WebM (códec Vorbis)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Creado"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -780,47 +1097,39 @@ msgstr "Archivo WebM (códec Vorbis)"
msgid "Image for %(media_title)s"
msgstr "Imágenes para %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "Fichero PDF"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "Alternar Rotar"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "Perspectiva"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "Frente"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "Arriba"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Lateral"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Descargar modelo"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Formato de Archivo"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Altura del Objeto"
@@ -839,8 +1148,8 @@ msgid ""
msgstr "¡Puedes conseguir un navegador moderno \n que pueda reproducir este vídeo en <a href=\"http://getfirefox.com\">\n http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "Archivo WebM (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr "Archivo WebM (VP8/Vorbis)"
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -866,11 +1175,6 @@ msgstr "%(collection_title)s por <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "Editar"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Borrar"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -925,29 +1229,22 @@ msgstr "Contenido de <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "â– Explorando contenido de <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Añadir un comentario"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Añade un comentario "
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "hace %(formatted_time)s"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr "Previsualización del comentario"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Agregado"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "Creado"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1106,26 +1403,34 @@ msgstr "Marcado con"
msgid "Could not read the image file."
msgstr "No se pudo leer el archivo de imagen."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "¡Ups!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Ha ocurrido un error"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr "Petición errónea"
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr "La petición enviada al servidor no es válida, por favor compruébala"
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Operación no permitida"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "¡Lo siento Dave, no puedo permitir que hagas eso!</p><p>Has intentado realizar una operación no permitida. ¿Has vuelto a intentar borrar todas las cuentas de usuario?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1162,10 +1467,9 @@ msgstr "Comentario"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Puedes usar <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> para el formato."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr "Puedes usar <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">Markdown</a> para dar formato."
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1187,77 +1491,80 @@ msgstr "-- Selecciona --"
msgid "Include a note"
msgstr "Incluir una nota"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "comentó tu publicación"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr "Puedes usar\n <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n Markdown</a> para dar formato."
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "Lo siento, los comentarios están desactivados."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Ups, tu comentario estaba vacío."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "¡Tu comentario ha sido publicado!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Por favor, revisa tus entradas e inténtalo de nuevo."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Tienes que seleccionar o añadir una colección"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "%s\" ya está en la colección \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" añadido a la colección \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Eliminaste el contenido"
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
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:296
+#: mediagoblin/user_pages/views.py:321
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. Procede con precaución."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Borraste el ítem de la colección."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "El ítem no fue removido porque no confirmaste que estuvieras seguro/a."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Estás a punto de borrar un ítem de la colección de otro usuario. Procede con cuidado."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Borraste la colección \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "La colección no fue borrada porque no confirmaste que estuvieras seguro/a."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Estás a punto de borrar la colección de otro usuario. Procede con cuidado."
diff --git a/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mo
index 3422ad97..533a29bb 100644
--- a/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po
index 08e73e1a..c1a16616 100644
--- a/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/fa/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Persian (http://www.transifex.com/projects/p/mediagoblin/language/fa/)\n"
"MIME-Version: 1.0\n"
@@ -19,250 +19,280 @@ msgstr ""
"Language: fa\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "نام کاربری"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "گذرواٰژه"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "آدرس ایمیل"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Ù…ØªØ§Ø³ÙØ§Ù†Ù‡ØŒØ«Ø¨ØªÙ†Ø§Ù… به طور موقت غیر ÙØ¹Ø§Ù„ است."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr ""
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Ù…ØªØ§Ø³ÙØ§Ù†Ù‡ØŒØ«Ø¨ØªÙ†Ø§Ù… به طور موقت غیر ÙØ¹Ø§Ù„ است."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Ù…ØªØ§Ø³ÙØ§Ù†Ù‡ کاربری با این نام کاربری وجود دارد."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "ایمیل شما تایید شد.شما می توانید حالا وارد شوید،نمایه خود را ویرایش کنید و تصاویر خود را ثبت کنید!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "این کد تاییدیه یا شناسه کاربری صحیح نیست."
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr ""
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr ""
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "ایمیل تاییدیه باز ارسال شد."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "عنوان"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr ""
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "برچسب"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "زندگینامه"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "وبسایت"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr ""
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr ""
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "گذرواٰژه"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "شما در حال ویرایش رسانه کاربر دیگری هستید.با احتیاط عمل کنید"
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "شما در حال ویرایش نمایه کاربر دیگری هستید.با احتیاط عمل کنید."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr ""
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -297,19 +327,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "نام کاربری"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "آدرس ایمیل"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -373,7 +446,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -386,59 +459,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr ""
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "ورود"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "ورود با خطا انجام شد!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "ÙØ§ÛŒÙ„ÛŒ نا معتبر برای نوع رسانه داده شده."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "ÙØ§ÛŒÙ„"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "شما باید ÙØ§ÛŒÙ„ÛŒ ارايه بدهید."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "هورا!ثبت شد!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "ورود"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -446,16 +669,16 @@ msgstr ""
msgid "Media processing panel"
msgstr "پنل رسیدگی به رسانه ها"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -502,6 +725,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -534,19 +810,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "ورود با خطا انجام شد!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "آیا حساب کاربری ندارید؟"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "در اینجا یکی بسازید!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr ""
@@ -555,7 +827,7 @@ msgstr ""
msgid "Create an account!"
msgstr "ساخت یک حساب کاربری!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "ساختن"
@@ -589,7 +861,7 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
@@ -599,22 +871,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -629,13 +906,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -652,22 +929,29 @@ msgstr "انصراÙ"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "ذخیره تغییرات"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -695,12 +979,12 @@ msgstr "ویرایش %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -714,6 +998,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr "در حال ویرایش نمایه %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -724,8 +1038,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -749,7 +1062,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -758,6 +1071,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -769,47 +1086,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -828,7 +1137,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -855,11 +1164,6 @@ msgstr ""
msgid "Edit"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -914,29 +1218,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a>'s رسانه های"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1095,26 +1392,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "اوه"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1151,9 +1456,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1176,77 +1480,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
index 7bc860a0..9eb5dc65 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 6103c439..9d596861 100644
--- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
@@ -7,6 +7,7 @@
# alcazar <alexispay@gmail.com>, 2012
# chesuidayeur <chesuidayeur@yahoo.fr>, 2011
# Bibit <crash_bibit@hotmail.com>, 2013
+# Fubik, 2013
# joehillen <joehillen@gmail.com>, 2011
# hellpe <hell_pe@no-log.org>, 2013
# MarkTraceur <marktraceur@gmail.com>, 2011
@@ -17,8 +18,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: French (http://www.transifex.com/projects/p/mediagoblin/language/fr/)\n"
"MIME-Version: 1.0\n"
@@ -28,249 +29,279 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Nom d'utilisateur"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Mot de passe"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Adresse e-mail"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "L'inscription n'est pas activée sur ce serveur, désolé."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr ""
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr "Désolé, l'authentification est désactivée sur ce serveur."
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Nom d'utilisateur ou email"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Nom d'utilisateur ou adresse de courriel invalide."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
-msgstr ""
+msgstr "Ce champ n'accepte pas les adresses email."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
-msgstr ""
+msgstr "Ce champ nécessite une adresse email."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "L'inscription n'est pas activée sur ce serveur, désolé."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Un utilisateur existe déjà avec ce nom, désolé."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
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:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr "La clé de vérification ou l'identifiant de l'utilisateur est incorrect."
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Votre adresse e-mail a bien été vérifiée. Vous pouvez maintenant vous identifier, modifier votre profil, et soumettre des images !"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
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:206
+#: mediagoblin/auth/views.py:185
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:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Votre adresse e-mail a déjà été vérifiée !"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "E-mail de vérification renvoyé."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
-msgstr ""
+msgstr "Si cette adresse email (sensible à la casse !) est enregistrée, un email a été envoyé avec les instructions pour changer votre mot de passe."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Nom d'utilisateur introuvable."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Un email contenant les instructions pour changer votre mot de passe viens de vous être envoyé"
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr "L'identifiant de l'utilisateur est incorrect."
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Vous pouvez maintenant vous connecter avec votre nouveau mot de passe."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr "Vous devez vérifier votre email avant de pouvoir réinitialiser votre mot de passe."
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titre"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Descriptif pour ce travail"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Vous pouvez utiliser\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> pour le formattage."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Tags"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Séparez les champs avec des virgules."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Légende"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "La légende ne peut pas être laissée vide."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Le titre présent dans l'URL du média. Vous n'avez généralement pas besoin de le modifier"
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Licence"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Site web"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Cette adresse contiens des erreurs"
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Me prévenir par email lorsque d'autres commentent mes médias"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
-msgstr ""
+msgid "License preference"
+msgstr "Préférence de licence"
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Me prévenir par email lorsque d'autres commentent mes médias"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
+msgstr "Cette licence sera appliquée par défaut à vos contributions."
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Le titre ne peut être vide"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Description de cette collection"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "Le titre affiché dans l'URL de la collection. Vous n'avez généralement pas besoin d'y toucher."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Ancien mot de passe."
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Entrez votre ancien mot de passe pour prouver que vous êtes bien le propriétaire de ce compte."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nouveau mot de passe"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr "Nouvelle adresse email"
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Mot de passe"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr "Entrez votre mot de passe pour prouver que vous possédez ce compte."
+
+#: mediagoblin/edit/views.py:73
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."
+msgstr "Une entrée avec la même légende existe déjà pour cet utilisateur."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
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:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Vous avez ajouté la pièce jointe %s !"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Vous ne pouvez modifier que votre propre profil."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
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/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Les changements apportés au profile ont étés sauvegardés"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Les changements des préférences du compte ont étés sauvegardés"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Vous devez confirmer la suppression de votre compte."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Vous avez déjà une collection appelée \"%s\" !"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
-msgstr ""
+msgstr "Une collection avec la même légende existe déjà pour cet utilisateur."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Vous éditez la collection d'un autre utilisateurs. Faites attention."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Mauvais mot de passe"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
-msgstr ""
+msgstr "Votre mot de passe a correctement été changé"
+
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr "Votre adresse email a bien été validée."
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
@@ -287,38 +318,81 @@ msgstr ""
#: mediagoblin/gmg_commands/assetlink.py:112
#, python-format
msgid "Could not link \"%s\": %s exists and is not a symlink\n"
-msgstr ""
+msgstr "Ne peut pas lier \"%s\" : %s existe et n'est pas un lien symbolique\n"
#: mediagoblin/gmg_commands/assetlink.py:119
#, python-format
msgid "Skipping \"%s\"; already set up.\n"
-msgstr ""
+msgstr "Saute \"%s\"; déjà défini.\n"
#: mediagoblin/gmg_commands/assetlink.py:124
#, python-format
msgid "Old link found for \"%s\"; removing.\n"
-msgstr ""
+msgstr "Vieux lien trouvé pour \"%s\"; suppression.\n"
#: mediagoblin/meddleware/csrf.py:134
msgid ""
"CSRF cookie not present. This is most likely the result of a cookie blocker "
"or somesuch.<br/>Make sure to permit the settings of cookies for this "
"domain."
-msgstr ""
+msgstr "Cookie CSRF non présent. Cela est vraisemblablement l’œuvre d'un bloqueur de cookies ou autres.<br/>Veuillez vous assurer d'autoriser les cookies pour ce domaine."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Désolé, mais je ne prends pas en charge cette extension de fichier :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
-msgstr ""
+msgstr "unoconv n'arrive pas à s'exécuter, vérifiez le fichier log"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "L'encodage de la vidéo à échoué"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "a commenté votre post"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr "Inscrit aux commentaires sur %s !"
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr "Vous ne recevrez pas de notifications pour les commentaires sur %s."
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr "Doit fournir un oauth_token."
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Adresse e-mail"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Nom d'utilisateur ou email"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr "Rester connecter"
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Position"
@@ -342,7 +416,7 @@ msgstr "Nom"
#: mediagoblin/plugins/oauth/forms.py:35
msgid "The name of the OAuth client"
-msgstr ""
+msgstr "Le nom du client OAuth"
#: mediagoblin/plugins/oauth/forms.py:36
msgid "Description"
@@ -366,7 +440,7 @@ msgid ""
" <strong>Public</strong> - The client can't make confidential\n"
" requests to the GNU MediaGoblin instance (e.g. client-side\n"
" JavaScript client)."
-msgstr ""
+msgstr "<strong>Confidentiel</strong> - Le client peut envoyer des requêtes à l'instance de GNU MediaGoblin qui ne peuvent pas être interceptées par le user agent (un client côté serveur par exemple).<br />\n<strong>Public</strong> - Le client ne peut pas envoyer des requêtes confidentielles à l'instance de GNU MediaGoblin (un client JavaScript côté client par exemple)."
#: mediagoblin/plugins/oauth/forms.py:52
msgid "Redirect URI"
@@ -382,7 +456,7 @@ msgstr "L'URI de redirection pour l'application, ce champ est <strong>requis</st
msgid "This field is required for public clients"
msgstr "Ce champ est requis pour les clients publics"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Le client {0} as été enregistré !"
@@ -392,62 +466,212 @@ msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/list.html:22
msgid "Your OAuth clients"
-msgstr ""
+msgstr "Vos clients OAuth"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Ajouter"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr "Désolé, un compte est déjà enregistré avec cet OpenID."
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr "OpenID"
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr "Désolé, le serveur OpenID n'a pas pu être trouvé."
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr "Aucun service OpenID n'a été trouvé pour %s"
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr "La vérification de %s a échoué : %s"
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr "Vérification annulée"
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr "Votre url OpenID a été correctement enregistrée."
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr "Vous ne pouvez pas supprimer votre seul URL OpenID sauf si vous avez défini un mot de passe"
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr "Cet OpenID n'est pas relié à ce compte."
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr "OpenID a été correctement supprimé."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr "Ajouter un OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr "Supprimer un OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Effacer"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "S'identifier"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "La connexion a échoué!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr "Ou se connecter avec un mot de passe !"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr "Ou se connecter avec OpenID !"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr "Ou s'enregistrer avec OpenID !"
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr "Désolé, un compte est déjà enregistré avec cet email Persona."
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr "L'adresse email Persona a correctement été supprimée."
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr "Vous ne pouvez pas supprimer votre seul email Persona sauf si vous avez défini un mot de passe."
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr "Cette adresse email Persona n'est pas liée à ce compte."
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr "Désolé, un compte est déjà enregistré avec cette adresse email Persona."
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr "Votre adresse email Persona a bien été enregistrée."
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr "Supprimer une adresse email Persona"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr "Ajouter une adresse email Persona"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr "Éditer vos adresses email Persona"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr "Ou se connecter avec Persona !"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr "Ou s'enregistrer avec Persona !"
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Le fichier envoyé ne correspond pas au type de média."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr "La copie vers le stockage public a échoué."
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Fichier"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Il vous faut fournir un fichier."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Youhou, c'est envoyé !"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "Collection \"%s\" ajoutée !"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Vérifiez votre adresse e-mail !"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "Déconnexion"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "S'identifier"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
-msgstr ""
+msgstr "Compte de <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Changer les paramètres du compte"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -455,16 +679,16 @@ msgstr "Changer les paramètres du compte"
msgid "Media processing panel"
msgstr "Panneau pour le traitement des médias"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
-msgstr ""
+msgstr "Se déconnecter"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Ajouter des médias"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Créer une nouvelle collection"
@@ -511,6 +735,59 @@ msgstr "10 derniers envois terminés"
msgid "No processed entries, yet!"
msgstr "Aucune entrée traitée jusqu'à présent !"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr "Autorisation"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr "Autoriser"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr "Vous êtes connecté en tant que"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr "Voulez-vous autoriser"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr "une application inconnue"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr "pour accéder à votre compte ?"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr "Les applications ayant accès à votre compte peuvent :"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr "Poster un nouveau média sous votre nom"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr "Voir vos informations (profile, médias, etc...)"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr "Modifier vos informations"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr "Copier-coller ceci dans votre client :"
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -543,19 +820,15 @@ msgid ""
"a happy goblin!"
msgstr "Bonjour %(username)s,\n\nPour changer votre mot de passe GNU MediaGoblin, ouvrez l'URL suivante dans \nvotre navigateur internet :\n\n%(verification_url)s\n\nSi vous pensez qu'il s'agit d'une erreur, ignorez simplement cet email et restez\nun goblin heureux !"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "La connexion a échoué!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Pas encore de compte ?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Créez-en un ici !"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Vous avez oublié votre mot de passe ?"
@@ -564,7 +837,7 @@ msgstr "Vous avez oublié votre mot de passe ?"
msgid "Create an account!"
msgstr "Créer un compte !"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Créer"
@@ -584,7 +857,7 @@ msgstr "Bonjour %(username)s,\n\npour activer votre compte sur GNU MediaGoblin,
msgid ""
"Powered by <a href=\"http://mediagoblin.org/\" title='Version "
"%(version)s'>MediaGoblin</a>, a <a href=\"http://gnu.org/\">GNU</a> project."
-msgstr ""
+msgstr "Propulsé par <a href=\"http://mediagoblin.org/\" title='Version %(version)s'>MediaGoblin</a>, un projet <a href=\"http://gnu.org/\">GNU</a>."
#: mediagoblin/templates/mediagoblin/bits/base_footer.html:24
#, python-format
@@ -598,7 +871,7 @@ msgstr "Disponible sous la licence <a href=\"http://www.fsf.org/licensing/licens
msgid "Explore"
msgstr "Explorer"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Bonjour, et bienvenue sur ce site MediaGoblin !"
@@ -608,23 +881,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "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/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Pour ajouter vos propres médias, commenter, et bien plus encore, vous pouvez vous connecter avec votre compte MediaGoblin"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Vous n'en avez pas ? C'est facile !"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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 ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr "\n>Créer un compte sur ce site</a>\nou"
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr "\n<a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Installer MediaGoblin sur votre propre serveur</a>"
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -638,13 +916,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Éditer les pièces jointes de %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Pièces jointes"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Ajouter une pièce jointe"
@@ -661,30 +939,37 @@ msgstr "Annuler"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Enregistrer les modifications"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr ""
+msgid "Changing %(username)s's email"
+msgstr "Changement de l'email de %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
-msgstr ""
+msgstr "Sauvegarder"
+
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "Changement du mot de passe de %(username)s"
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
-msgstr ""
+msgstr "Réellement supprimer l'utilisateur \"%(user_name)s\" et tous les médias/commentaires liés ?"
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:35
msgid "Yes, really delete my account"
-msgstr ""
+msgstr "Oui, supprimer réellement mon compte"
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:44
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:48
@@ -704,13 +989,13 @@ msgstr "Modification de %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "Changement des préférences du compte de %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
-msgstr ""
+msgstr "Supprimer mon compte"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr "Email"
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
@@ -723,6 +1008,36 @@ msgstr "Modification de %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Modification du profil de %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr "Bonjour,\n\nNous voulons vérifier que vous êtes %(username)s. Si cela est bien le cas, veuillez suivre le lien ci-dessous pour vérifier votre nouvelle adresse email.\n\n%(verification_url)s\n\nSi vous n'êtes pas %(username)s ou n'avez pas demandé un changement d'adresse email, vous pouvez ignorer cet email."
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr "Nouveaux commentaires"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "Il y a %(formatted_time)s"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr "Marquer tous lus"
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -733,8 +1048,7 @@ msgstr "Médias taggés avec : %(tag_name)s "
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Télécharger"
@@ -758,7 +1072,7 @@ msgid ""
msgstr "Vous pouvez obtenir un navigateur à jour capable de lire cette vidéo sur <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Fichier original"
@@ -767,6 +1081,10 @@ msgstr "Fichier original"
msgid "WebM file (Vorbis codec)"
msgstr "fichier WebM (codec Vorbis)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Créé"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -778,67 +1096,59 @@ msgstr "fichier WebM (codec Vorbis)"
msgid "Image for %(media_title)s"
msgstr "Image de %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
-msgstr ""
+msgstr "Fichier PDF"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
-msgstr ""
+msgstr "Haut"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
-msgstr ""
+msgstr "Côté"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
-msgstr ""
+msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
-msgstr ""
+msgstr "Télécharger le modèle"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
-msgstr ""
+msgstr "Format de fichier"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
-msgstr ""
+msgstr "Hauteur de l'objet"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:44
msgid ""
"Sorry, this video will not work because\n"
" your web browser does not support HTML5 \n"
" video."
-msgstr ""
+msgstr "Désolé, cette vidéo ne marchera pas parce que votre navigateur web ne supporte pas les vidéos HTML5."
#: mediagoblin/templates/mediagoblin/media_displays/video.html:47
msgid ""
"You can get a modern web browser that \n"
" can play this video at <a href=\"http://getfirefox.com\">\n"
" http://getfirefox.com</a>!"
-msgstr ""
+msgstr "Vous pouvez télécharger un navigateur web moderne qui peut lire cette vidéo à <a href=\"http://getfirefox.com\">http://getfirefox.com</a> !"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "fichier WebM (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr "Fichier WebM (VP8/Vorbis)"
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -852,7 +1162,7 @@ msgstr "Ajoutez votre média"
#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
#, python-format
msgid "%(collection_title)s (%(username)s's collection)"
-msgstr ""
+msgstr "%(collection_title)s (collection de %(username)s)"
#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
#, python-format
@@ -864,11 +1174,6 @@ msgstr "%(collection_title)s de <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "Éditer"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Effacer"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -887,12 +1192,12 @@ msgstr "Retirer"
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:21
#, python-format
msgid "%(username)s's collections"
-msgstr ""
+msgstr "Collections de %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:28
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s collections"
-msgstr ""
+msgstr "Collections de <a href=\"%(user_url)s\">%(username)s</a>"
#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
#, python-format
@@ -911,7 +1216,7 @@ msgstr "Medias de %(username)s"
msgid ""
"<a href=\"%(user_url)s\">%(username)s</a>'s media with tag <a "
"href=\"%(tag_url)s\">%(tag)s</a>"
-msgstr ""
+msgstr "Media de <a href=\"%(user_url)s\">%(username)s</a> avec le tag <a href=\"%(tag_url)s\">%(tag)s</a>"
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:48
#, python-format
@@ -923,34 +1228,27 @@ msgstr "Médias de <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■Parcourir les médias de <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Ajouter un commentaire"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Ajouter ce commentaire"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr "Prévisualisation du commentaire"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
+msgstr "Ajouté"
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
msgid "Add “%(media_title)s†to a collection"
-msgstr ""
+msgstr "Ajouter “%(media_title)s†à une collection"
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:54
msgid "+"
@@ -1029,7 +1327,7 @@ msgstr "Cet utilisateur n'a pas (encore) rempli son profil."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:124
msgid "Browse collections"
-msgstr ""
+msgstr "Parcourir les collections"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:137
#, python-format
@@ -1050,7 +1348,7 @@ msgstr "Il ne semble pas y avoir de média là, pour l'instant ..."
#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:49
msgid "(remove)"
-msgstr ""
+msgstr "(supprimer)"
#: mediagoblin/templates/mediagoblin/utils/collections.html:21
msgid "Collected in"
@@ -1058,7 +1356,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/utils/collections.html:40
msgid "Add to a collection"
-msgstr ""
+msgstr "Ajouter à une collection"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
#: mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html:21
@@ -1104,26 +1402,34 @@ msgstr "Taggé avec"
msgid "Could not read the image file."
msgstr "Impossible de lire l'image."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Zut !"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Une erreur est survenue"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr "Mauvaise requête"
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr "La requête envoyée au serveur est non valide, veuillez la vérifier"
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Opération non autorisée"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "Je regrette Dave, cela m'est malheureusement impossible !</p><p>Vous avez essayé d'effectuer une action pour laquelle vous n'avez pas de permission. Avez-vous tenté de supprimer tous les comptes utilisateur à nouveau ?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1132,38 +1438,37 @@ msgstr "Il ne semble pas y avoir de page à cette adresse. Désolé ! </p><p>Si
#: mediagoblin/tools/timesince.py:62
msgid "year"
-msgstr ""
+msgstr "année"
#: mediagoblin/tools/timesince.py:63
msgid "month"
-msgstr ""
+msgstr "mois"
#: mediagoblin/tools/timesince.py:64
msgid "week"
-msgstr ""
+msgstr "semaine"
#: mediagoblin/tools/timesince.py:65
msgid "day"
-msgstr ""
+msgstr "jour"
#: mediagoblin/tools/timesince.py:66
msgid "hour"
-msgstr ""
+msgstr "heure"
#: mediagoblin/tools/timesince.py:67
msgid "minute"
-msgstr ""
+msgstr "minute"
#: mediagoblin/user_pages/forms.py:23
msgid "Comment"
-msgstr ""
+msgstr "Commenter"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Vous pouvez utilisez les <a href=\"http://daringfireball.net/projects/markdown/basics\">Balises</a> pour la mise en page."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr "Vous pouvez utiliser <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">Markdown</a> pour le formatage."
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1175,7 +1480,7 @@ msgstr "Je suis certain de vouloir retirer cet élément de la collection"
#: mediagoblin/user_pages/forms.py:39
msgid "Collection"
-msgstr ""
+msgstr "Collection"
#: mediagoblin/user_pages/forms.py:40
msgid "-- Select --"
@@ -1185,77 +1490,80 @@ msgstr "-- Sélectionner --"
msgid "Include a note"
msgstr "Inclure une note"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "a commenté votre post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr "Vous pouvez utiliser\n<a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\nMarkdown</a> pour le formatage."
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
-msgstr ""
+msgstr "Désolé, les commentaires sont désactivés."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Oups, votre commentaire était vide."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Votre commentaire a été posté !"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Veuillez vérifier vos entrées et réessayer."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Vous devez sélectionner ou ajouter une collection"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" est déjà dans la collection \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" as été ajouté à la collection \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Vous avez supprimé le media."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
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:296
+#: mediagoblin/user_pages/views.py:321
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. Procédez avec prudence."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Vous avez supprimé cet élément de la collection."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "L'élément n'as pas été supprimé car vous n'avez pas confirmé votre certitude."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Vous vous apprêtez à supprimer un élément de la collection d'un autre utilisateur. Procédez avec attention."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Vous avez supprimé la collection \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "La collection n'as pas été supprimée car vous n'avez pas confirmé votre certitude"
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Vous vous apprêtez à supprimer la collection d'un autre utilisateur. Procédez avec attention."
diff --git a/mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.mo
index 09412b0a..487668e1 100644
--- a/mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.po
index 4a5c2b52..251b528d 100644
--- a/mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/he/LC_MESSAGES/mediagoblin.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-06-01 07:11+0000\n"
-"Last-Translator: GenghisKhan <genghiskhan@gmx.ca>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Hebrew (http://www.transifex.com/projects/p/mediagoblin/language/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,250 +21,280 @@ msgstr ""
"Language: he\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "×©× ×ž×©×ª×ž×©"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "סיסמה"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "כתובת דו×״ל"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "לצערנו, ×¨×™×©×•× ×”×™× ×• מנוטרל על שרת ×–×”."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "×©× ×ž×©×ª×ž×© ×ו דו×״ל"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr "לצערנו, ×ימות הינו מנוטרל על שרת ×–×”."
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "×©× ×ž×©×ª×ž×© ×ו דו×״ל"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "×©× ×ž×©×ª×ž×© ×ו דו×״ל שגוי."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "שדה ×–×” ×œ× ×œ×•×§×— כתובות דו×״ל."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "שדה ×–×” מצריך כתובת דו×״ל."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "צר לי, ×¨×™×©×•× ×”×™× ×• מנוטרל על שרת ×–×”."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
-msgstr "צר לי, משתמש ×¢× ×©× ×–×” כבר ×§×™×™×."
+msgstr "לצערנו, משתמש ×¢× ×©× ×–×” כבר ×§×™×™×."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
-msgstr "צר לי, משתמש ×¢× ×“×•×״ל ×–×” כבר ×§×™×™×."
+msgstr "לצערנו, משתמש ×¢× ×“×•×״ל ×–×” כבר ×§×™×™×."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr "מפתח ×”×ימות ×ו מזהה המשתמש ×ינו מדויק."
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "כתובת הדו×״ל שלך ×ומתה. כעת ב×פשרותך להתחבר, לערוך ×ת דיוקנך, ולשלוח תמונות!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "מפתח ×”×ימות ×ו זהות משתמש ×”×™× × ×©×’×•×™×™×"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "עליך להתחבר על מנת שנדע ×ל מי לשלוח ×ת הדו×״ל!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "כבר ×ימתת ×ת כתובת הדו×״ל שלך!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "שלח שוב ×ת דו×״ל ×”×ימות שלך."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "במידה וכתובת הדו×״ל הזו (תלוי רישיות!) רשומה דו×״ל נשלח ×¢× ×”×•×¨×ות בנוגע לכיצד לשנות ×ת סיסמתך."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "×œ× ×”×™×” ניתן ×œ×ž×¦×•× ×ž×™×©×”×• ×¢× ×©× ×ž×©×ª×ž×© ×–×”."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "דו×״ל נשלח בצירוף הור×ות בנוגע לכיצד ניתן לשנות ×ת סיסמתך."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr "מזהה המשתמש ×ינו מדויק."
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "כעת ביכולתך להתחבר ב×מצעות סיסמתך החדשה."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr "עליך ל×מת ×ת הדו×ל שלך ×˜×¨× ×יפוס סיסמתך."
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "כותרת"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "תי×ור של מל××›×” זו"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "ביכולתך להשתמש בתחביר\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> לעיצוב."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "תגיות"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "הפרד תגיות בעזרת פסיקי×."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "חשופית"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "החשופית ×œ× ×™×›×•×œ×” להיות ריקה"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "×זור הכותרת של כתובת מדיה זו. לרוב ×ין הכרח לשנות ×ת חלק ×–×”."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "רשיון"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "ביו"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "×תר רשת"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "כתובת זו מכילה שגי×ות"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "שלח לי דו×״ל ×›×שר ××—×¨×™× ×ž×’×™×‘×™× ×¢×œ המדיה שלי"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "עדיפות רשיון"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "×–×” ×™×”×™×” הרשיוןן המשתמט (ברירת מחדל) שלך בטופסי העל××”."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "שלח לי דו×״ל ×›×שר ××—×¨×™× ×ž×’×™×‘×™× ×¢×œ המדיה שלי"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "הכותרת ×œ× ×™×›×•×œ×” להיות ריקה"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "תי×ור ×וסף ×–×”"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "×זור הכותרת של כתובת ×וסף ×–×”. לרוב ×ין הכרח לשנות ×ת חלק ×–×”."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "סיסמה ישנה"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "הזן ×ת סיסמתך הישנה כדי להוכיח ש×תה ×”×‘×¢×œ×™× ×©×œ חשבון ×–×”."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "סיסמה חדשה"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr "כתובת דו×״ל חדשה"
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "סיסמה"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "רשומה ×¢× ×—×©×•×¤×™×ª זו כבר קיימת עבור משתמש ×–×”."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "×תה עורך מדיה של משתמש ×חר. המשך בזהירות."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "הוספת ×ת התצריף %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "ב×פשרותך לערוך רק ×ת הדיוקן שלך."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "×תה עורך דיוקן של משתמש. המשך בזהירות."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "שינויי דיוקן נשמרו"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "הגדרות חשבון נשמרו"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "עליך ל×מת ×ת המחיקה של חשבונך."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "כבר יש לך ×וסף שקרוי ×‘×©× \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "×וסף ×¢× ×—×©×•×¤×™×ª זו כבר ×§×™×™× ×¢×‘×•×¨ משתמש ×–×”."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "×תה עורך ×וסף של משתמש ×חר. המשך בזהירות."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "סיסמה שגויה"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "סיסמתך שונתה בהצלחה"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr "כתובת הדו×״ל שלך ×ומתה."
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "×œ× × ×™×ª×Ÿ לקשר ×ל מוטיב... ×œ× ×”×•×’×“×¨ מוטיב\n"
@@ -299,19 +329,62 @@ msgid ""
"domain."
msgstr "עוגיית CSRF ×œ× × ×•×›×—×ª. ×–×” קרוב לווד××™ נובע ×ž×©×•× ×—×•×¡× ×¢×•×’×™×™×” ×ו משהו בסגנון.<br/>הבטח קביעה של עוגיות עבור ×ª×—×•× ×–×”."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
-msgstr "צר לי, ××™× × ×™ תומך בטיפוס קובץ ×–×” :("
+msgstr "לצערנו, ××™× × ×™ תומך בטיפוס קובץ ×–×” :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr "unoconv נכשל לפעול, בדוק קובץ יומן"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "המרת ויד×ו נכשלה"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "הגיב/ה על פרסומך"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr "×”×™×¨×©× ×ל תגובות בתוך %s!"
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "×©× ×ž×©×ª×ž×©"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "כתובת דו×״ל"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "×©× ×ž×©×ª×ž×© ×ו דו×״ל"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr "היש×ר מחובר"
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "מיקו×"
@@ -375,7 +448,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr "שדה ×–×” הינו דרוש עבור לקוחות פומביי×"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "הלקוח {0} נרש×!"
@@ -388,59 +461,209 @@ msgid "Your OAuth clients"
msgstr "לקוחות OAuth שלך"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "הוסף"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr "לצערנו, ×§×™×™× ×›×‘×¨ חשבון ×שר ×¨×©×•× ×¢× OpenID."
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr "לצערנו, שרת OpenID ×œ× ×”×™×” יכול להימצ×"
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr "×œ× × ×ž×¦× ×©×™×¨×•×ª OpenID עבור %s"
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr "הוסף OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr "מחק OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "מחק"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "התחברות"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "התחברות נכשלה!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr "התחבר כדי ליצור חשבון!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr "×ו התחבר בעזרת סיסמה!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr "×ו התחבר ×¢× OpenID!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr "×ו ×”×™×¨×©× ×‘×¢×–×¨×ª OpenID!"
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr "לצערנו, ×§×™×™× ×›×‘×¨ חשבון ×שר ×¨×©×•× ×œ×ישיות דו×״ל זו."
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr "לצערנו, ×§×™×™× ×›×‘×¨ חשבון ×שר ×¨×©×•× ×¢× ×ישיות כתובת דו×״ל זו."
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "ניתן קובץ שגוי עבור טיפוס מדיה."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "קובץ"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "עליך לספק קובץ."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "הידד! נשלח!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "×וסף \"%s\" התווסף!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "×מת ×ת הדו×״ל שלך!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "התנתקות"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "התחברות"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "החשבון של <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "שנה הגדרות חשבון"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -448,16 +671,16 @@ msgstr "שנה הגדרות חשבון"
msgid "Media processing panel"
msgstr "לוח עיבוד מדיה"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "התנתקות"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "הוספת מדיה"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "צור ×וסף חדש"
@@ -504,6 +727,59 @@ msgstr "10 העל×ות מוצלחות ×חרונות"
msgid "No processed entries, yet!"
msgstr "×ין ×¨×™×©×•×ž×™× ×ž×¢×•×‘×“×™×, עדיין!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -536,19 +812,15 @@ msgid ""
"a happy goblin!"
msgstr "×©×œ×•× %(username)s,\n\nבכדי לשנות ×ת סיסמתך ×צל GNU MediaGoblin, עליך לפתוח ×ת הכתובת הב××” \nבתוך דפדפן הרשת שלך:\n\n%(verification_url)s\n\nבמידה ו×תה חושב שמדובר בשגי××”, פשוט ×”×ª×¢×œ× ×ž×Ÿ דו×״ל ×–×” והמשך להיות\nגובלין מ×ושר!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "התחברות נכשלה!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "×ין לך חשבון עדיין?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "צור חשבון ×›×ן!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "שכחת ×ת סיסמתך?"
@@ -557,7 +829,7 @@ msgstr "שכחת ×ת סיסמתך?"
msgid "Create an account!"
msgstr "צור חשבון!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "צור"
@@ -591,7 +863,7 @@ msgstr "משוחרר תחת הרשיון <a href=\"http://www.fsf.org/licensing/
msgid "Explore"
msgstr "לחקור"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "×©×œ×•× ×œ×š, ברוך בו×ך ×ל ×תר MediaGoblin ×–×”!"
@@ -601,23 +873,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "×תר ×–×” מריץ <a href=\"http://mediagoblin.org\">MediaGoblin</a>, חתיכת תוכנת ×ירוח מדיה יוצ×ת מן הכלל."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "בכדי להוסיף ×ת המדיה שלך, ×œ×”×©×™× ×ª×’×•×‘×•×ª, ועוד, ביכולתך להתחבר ×¢× ×—×©×‘×•×Ÿ MediaGoblin."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "×ין ברשותך חשבון עדיין? ×–×” קל!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">צור חשבון ב×תר ×–×”</a>\n ×ו\n <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">התקן ×ת MediaGoblin על שרתך</a>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -631,13 +908,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "עריכת ×ª×¦×¨×™×¤×™× ×¢×‘×•×¨ %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "תצריפי×"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "הוספת תצריף"
@@ -654,22 +931,29 @@ msgstr "ביטול"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "שמור שינויי×"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "משנה כעת ×ת הסיסמה של %(username)s'"
+msgid "Changing %(username)s's email"
+msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "שמור"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "משנה כעת ×ת הסיסמה של %(username)s'"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -697,14 +981,14 @@ msgstr "ערוך %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "שינוי הגדרות חשבון עבור %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "שנה ×ת סיסמתך."
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "מחק ×ת החשבון שלי"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -716,6 +1000,36 @@ msgstr "עריכת %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "עריכת דיוקן עבור %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "מלפני %(formatted_time)s"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -726,8 +1040,7 @@ msgstr "מדיה מתויגת ×¢×: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "הורד"
@@ -741,7 +1054,7 @@ msgid ""
"Sorry, this audio will not work because \n"
"\tyour web browser does not support HTML5 \n"
"\taudio."
-msgstr "צר לי, ×ודיו ×–×” ×œ× ×™×¢×‘×•×“ מכיוון \n\tשדפדפן הרשת שלך ×œ× ×ª×•×ž×š \n\t×ודיו של HTML5."
+msgstr "לצערנו, ×ודיו ×–×” ×œ× ×™×¢×‘×•×“ מכיוון \n\tשדפדפן הרשת שלך ×œ× ×ª×•×ž×š \n\t×ודיו של HTML5."
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:47
msgid ""
@@ -751,7 +1064,7 @@ msgid ""
msgstr "ביכולתך להשיג דפדפן רשת מודרני \n\tשכן מסוגל לנגן ×ת ×ודיו ×–×” ×צל <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "קובץ מקורי"
@@ -760,6 +1073,10 @@ msgstr "קובץ מקורי"
msgid "WebM file (Vorbis codec)"
msgstr "קובץ WebM (קודק Vorbis)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "נוצר"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -771,47 +1088,39 @@ msgstr "קובץ WebM (קודק Vorbis)"
msgid "Image for %(media_title)s"
msgstr "תמונה עבור %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "קובץ PDF"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "החלף סיבוב"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "נקודת מבט"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "לפני×"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "ר×ש"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "צד"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "הורד מודל"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "פורמט קובץ"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "גובה ×ובייקט"
@@ -820,7 +1129,7 @@ msgid ""
"Sorry, this video will not work because\n"
" your web browser does not support HTML5 \n"
" video."
-msgstr "צר לי, ויד×ו ×–×” ×œ× ×™×¢×‘×•×“ מכיוון \n שדפדפן הרשת שלך ×œ× ×ª×•×ž×š \n ויד×ו של HTML5."
+msgstr "לצערנו, ויד×ו ×–×” ×œ× ×™×¢×‘×•×“ מכיוון \n שדפדפן הרשת שלך ×œ× ×ª×•×ž×š \n ויד×ו של HTML5."
#: mediagoblin/templates/mediagoblin/media_displays/video.html:47
msgid ""
@@ -830,8 +1139,8 @@ msgid ""
msgstr "ביכולתך להשיג דפדפן רשת מודרני \n שכן מסוגל לנגן ×ת ויד×ו ×–×” ×צל <a href=\"http://getfirefox.com\">\n http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "קובץ WebM ‫(640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -857,11 +1166,6 @@ msgstr "%(collection_title)s מ×ת <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "ערוך"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "מחק"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -916,29 +1220,22 @@ msgstr "המדיה של <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■עיון במדיה מ×ת <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "הוסף תגובה"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "הוסף ×ת תגובה זו"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "מלפני %(formatted_time)s"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "התווסף"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "נוצר"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -970,7 +1267,7 @@ msgstr "הדיוקן של %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
msgid "Sorry, no such user found."
-msgstr "צר לי, משתמש נתון ×œ× × ×ž×¦×."
+msgstr "לצערנו, משתמש נתון ×œ× × ×ž×¦×."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
@@ -1097,31 +1394,39 @@ msgstr "מתויגת ×¢×"
msgid "Could not read the image file."
msgstr "×œ× ×”×™×” ניתן ×œ×§×¨×•× ×ת קובץ התמונה."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "×ופס!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "×ירעה שגי××”"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "פעולה ×œ× ×ž×•×¨×©×™×ª"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
-msgstr "צר לי דוד, ×× ×™ ×œ× ×™×›×•×œ להתיר לך לעשות ×–×ת!</p><p>ניסית לבצע פעולה ש×ינך מורשה לעשות. ×”×× × ×™×¡×™×ª למחוק ×ת כל החשבונות של ×”×ž×©×ª×ž×©×™× ×©×•×‘?"
+msgstr "צר לי דייב, ×× ×™ ×œ× ×™×›×•×œ להתיר לך לעשות ×–×ת!</p><p>ניסית לבצע פעולה ש×ינך מורשה לעשות. ×”×× × ×™×¡×™×ª למחוק ×ת כל החשבונות של ×”×ž×©×ª×ž×©×™× ×©×•×‘?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
" deleted."
-msgstr "×œ× × ×¨××” ×©×§×™×™× ×¢×ž×•×“ בכתובת זו. צר לי!</p><p>×× ×תה בטוח שהכתובת ×”×™× ×” מדויקת, ייתכן שהעמוד ש×תה מחפש כעת הועבר ×ו נמחק."
+msgstr "×œ× × ×¨××” ×›×™ ×§×™×™× ×¢×ž×•×“ בכתובת זו. צר לי!</p><p>×× ×תה בטוח שהכתובת ×”×™× ×” מדויקת, ייתכן שהעמוד ש×תה מחפש כעת הועבר ×ו נמחק."
#: mediagoblin/tools/timesince.py:62
msgid "year"
@@ -1153,10 +1458,9 @@ msgstr "תגובה"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "ביכולתך לעשות שימוש בתחביר <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> לעיצוב."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1178,77 +1482,80 @@ msgstr "-- בחר --"
msgid "Include a note"
msgstr "הכללת פתק"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "הגיב/ה על פרסומך"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "מצטערי×, תגובות מנוטרלות."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "×ופס, תגובתך היתה ריקה."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "תגובתך פורסמה!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "×× × ×‘×“×•×§ ×ת רשומותיך ונסה שוב."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "עליך לבחור ×ו להוסיף ×וסף"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" כבר ×§×™×™× ×‘×וסף \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" התווסף ×ל ×”×וסף \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "מחקת ×ת מדיה זו."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "המדיה ×œ× × ×ž×—×§×” מכיוון ×©×œ× ×¡×™×ž× ×ª ש×תה בטוח."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "בחרת למחוק מדיה של משתמש ×חר. המשך בזהירות."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "מחקת ×ת הפריט מן ×וסף ×–×”."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "הפריט ×œ× ×”×•×¡×¨ מכיוון ×©×œ× ×¡×™×ž× ×ª ש×תה בטוח."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "בחרת למחוק פריט מן ×וסף של משתמש ×חר. המשך בזהירות."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "מחקת ×ת ×”×וסף \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "×”×וסף ×œ× ×”×•×¡×¨ מכיוון ×©×œ× ×¡×™×ž× ×ª ש×תה בטוח."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "בחרת למחוק ×וסף של משתמש ×חר. המשך בזהירות."
diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
index d22f6ee6..53444ef4 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 c9f814fc..84801f32 100644
--- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
@@ -4,13 +4,13 @@
#
# Translators:
# Aleksandr Brezhnev <abrezhnev@gmail.com>, 2012
-# Emilio Sepúlveda <emisepulvedam@gmail.com>, 2011
+# Emilio Sepúlveda, 2011
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Interlingua (http://www.transifex.com/projects/p/mediagoblin/language/ia/)\n"
"MIME-Version: 1.0\n"
@@ -20,250 +20,280 @@ msgstr ""
"Language: ia\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Nomine de usator"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Contrasigno"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Adresse de e-posta"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr ""
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr ""
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr ""
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr ""
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr ""
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titulo"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr ""
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Etiquettas"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Sito web"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr ""
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr ""
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Contrasigno"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr ""
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -298,19 +328,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Nomine de usator"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Adresse de e-posta"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -374,7 +447,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -387,59 +460,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr ""
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Initiar session"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr ""
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "File"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Initiar session"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +670,16 @@ msgstr ""
msgid "Media processing panel"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -503,6 +726,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,19 +811,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr ""
@@ -556,7 +828,7 @@ msgstr ""
msgid "Create an account!"
msgstr "Crear un conto!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr ""
@@ -590,7 +862,7 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
@@ -600,22 +872,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +907,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -653,22 +930,29 @@ msgstr "Cancellar"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,12 +980,12 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -715,6 +999,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,8 +1039,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -750,7 +1063,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -759,6 +1072,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1087,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -829,7 +1138,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -856,11 +1165,6 @@ msgstr ""
msgid "Edit"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1219,22 @@ msgstr ""
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1096,26 +1393,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr ""
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1152,9 +1457,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1177,77 +1481,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.mo
index 596ab843..fb1674f0 100644
--- a/mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.po
index 77896b87..83322047 100644
--- a/mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/is_IS/LC_MESSAGES/mediagoblin.po
@@ -3,14 +3,16 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# Sveinn í Felli <sveinki@nett.is>, 2013
# tryggvib <tryggvib@fsfi.is>, 2012
# tryggvib <tryggvib@fsfi.is>, 2013
+# tryggvib <tryggvib@fsfi.is>, 2012-2013
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-06-05 22:51+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:05+0000\n"
"Last-Translator: tryggvib <tryggvib@fsfi.is>\n"
"Language-Team: Icelandic (Iceland) (http://www.transifex.com/projects/p/mediagoblin/language/is_IS/)\n"
"MIME-Version: 1.0\n"
@@ -20,253 +22,283 @@ msgstr ""
"Language: is_IS\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Notandanafn"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Lykilorð"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Netfang"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Því miður er nýskráning ekki leyfð á þessu svæði."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Notandanafn eða tölvupóstur"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr "Því miður er auðkenning ekki möguleg á þessu vefsvæði."
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Notandanafn eða netfang"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Ógilt notandanafn eða netfang"
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Þessi reitur tekur ekki við netföngum."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
-msgstr "í þennan reit verður að slá inn netfang."
-
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Því miður er nýskráning ekki leyfð á þessu svæði."
+msgstr "í þennan reit verður að slá inn tölvupóstfang."
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Því miður er nú þegar til notandi með þetta nafn."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Því miður þá er annar notandi í kerfinu með þetta netfang skráð."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr "Staðfestingarlykillinn eða notendaauðkennið er rangt."
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Netfangið þitt hefur verið staðfest. Þú getur núna innskráð þig, breytt kenniskránni þinni og sent inn efni!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Staðfestingarlykillinn eða notendaauðkennið er rangt"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Þú verður að hafa innskráð þig svo við vitum hvert á að senda tölvupóstinn!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Þú hefur staðfest netfangið þitt!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Endursendi staðfestingartölvupóst"
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Ef þetta netfang (há- og lágstafir skipta máli) er skráð hjá okkur hefur tölvupóstur verið sendur með leiðbeiningum um hvernig þú getur breytt lykilorðinu þínu."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Gat ekki fundið neinn með þetta notandanafn."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Tölvupóstur hefur verið sendur með leiðbeiningum um hvernig þú átt að breyta lykilorðinu þínu."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "Gat ekki sent tölvupóst um endurstillingu lykilorðs því notandanafnið þitt er óvirkt eða þá að þú hefur ekki staðfest netfangið þitt."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr "Notendaauðkennið er rangt."
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Þú getur núna innskráð þig með nýja lykilorðinu þínu."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr "Þú verður að staðfesta netfangið þitt áður en þú getur endurstillt lykilorðið þitt."
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr "Þú ert ekki lengur virkur notandi. Vinsamlegast hafðu samband við kerfisstjóra til að endurvirkja aðganginn þinn."
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titill"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Lýsing á þessu efni"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Þú getur notað\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> til að stílgera textann."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Efnisorð"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Aðskildu efnisorðin með kommum."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Vefslóðarormur"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "Vefslóðarormurinn getur ekki verið tómur"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Titilhlutinn í vefslóð þessa efnis. Þú þarft vanalega ekki að breyta þessu."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
-msgstr "Leyfi"
+msgstr "Notkunarleyfi"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Lýsing"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Vefsíða"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Þetta netfang inniheldur villur"
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
-msgstr "Leyfiskjörstilling"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Senda mér tölvupóst þegar einhver bætir athugasemd við efnið mitt"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr "Virkja innri tilkynningar um viðburði."
#: mediagoblin/edit/forms.py:69
+msgid "License preference"
+msgstr "Stilling á notkunarleyfi"
+
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Þetta verður sjálfgefna leyfið þegar þú vilt hlaða upp efni."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Senda mér tölvupóst þegar einhver bætir athugasemd við efnið mitt"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Þessi titill getur verið innihaldslaus"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Lýsing á þessu albúmi"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "Titilhlutinn í vefslóð þessa albúms. Þú þarft vanalega ekki að breyta þessu."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Gamla lykilorðið"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Skráðu gamla lykilorðið þitt til að sanna að þú átt þennan aðgang."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nýtt lykilorð"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr "Nýtt netfang"
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Lykilorð"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr "Sláðu inn lykilorðið þitt til að sanna að þú eigir þennan aðgang."
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "Efni merkt með þessum vefslóðarormi er nú þegar til fyrir þennan notanda."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Þú ert að breyta efni annars notanda. Farðu mjög varlega."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Þú bættir við viðhenginu %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Þú getur bara breytt þinni eigin kenniskrá."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Þú ert að breyta kenniskrá notanda. Farðu mjög varlega."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Breytingar á kenniskrá vistaðar"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Aðgangsstillingar vistaðar"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Þú verður að samþykkja eyðingu á notandaaðganginum þínum."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Þú hefur nú þegar albúm sem kallast \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "Albúm með þessu vefslóðarormi er nú þegar til fyrir þennan notanda."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Þú ert að breyta albúmi annars notanda. Farðu mjög varlega."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
-msgstr "Vitlaust lykilorð"
+msgstr "Rangt lykilorð"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "Það tókst að breyta lykilorðinu þínu"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr "Netfangið þitt hefur verið staðfest."
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
-msgstr "Get ekki hlekkjað í þema... ekkert þema stillt\n"
+msgstr "Get ekki tengt þema... ekkert þema stillt\n"
#: mediagoblin/gmg_commands/assetlink.py:73
msgid "No asset directory for this theme\n"
@@ -274,12 +306,12 @@ msgstr "Engin eignamappa fyrir þetta þema\n"
#: mediagoblin/gmg_commands/assetlink.py:76
msgid "However, old link directory symlink found; removed.\n"
-msgstr "Fann samt gamlan táknrænan tengil á möppu; fjarlægður.\n"
+msgstr "Fann samt gamlan tákntengil á möppu; fjarlægður.\n"
#: mediagoblin/gmg_commands/assetlink.py:112
#, python-format
msgid "Could not link \"%s\": %s exists and is not a symlink\n"
-msgstr "Gat ekki tengt \"%s\": %s er til og er ekki sýndartengill\n"
+msgstr "Gat ekki tengt \"%s\": %s er til og er ekki tákntengill\n"
#: mediagoblin/gmg_commands/assetlink.py:119
#, python-format
@@ -296,20 +328,63 @@ msgid ""
"CSRF cookie not present. This is most likely the result of a cookie blocker "
"or somesuch.<br/>Make sure to permit the settings of cookies for this "
"domain."
-msgstr "CSRF smygildi ekki til staðar. Þetta er líklegast orsakað af smygildishindrara eða einhverju þess háttar.<br/>Athugaðu hvort þú leyfir ekki alveg örugglega smygildi fyrir þetta lén."
+msgstr "CSRF smákaka ekki til staðar. Þetta er líklegast orsakað af smákökugildru eða einhverju þess háttar.<br/>Athugaðu hvort þú leyfir ekki alveg örugglega smákökur fyrir þetta lén."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Ég styð því miður ekki þessa gerð af skrám :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr "tekst ekki að keyra unoconv, athugaðu annálsskrá"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
-msgstr "Myndbandsþverkótun mistókst"
+msgstr "Þverkóðun myndskeiðs mistókst"
+
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "skrifaði athugasemd við færsluna þína"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr "Þú ert nú áskrifandi að athugasemdum „%s“!"
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr "Þú færð tilkynningar þegar einhver skrifar athugasemd við „%s“."
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr "Þú verður að gefa upp OAuth tóka (oauth_token)."
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr "Engin beiðni fannst."
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Notandanafn"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Tölvupóstfang"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Notandanafn eða tölvupóstur"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr "Muna eftir mér"
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
@@ -330,7 +405,7 @@ msgstr "Banna"
#: mediagoblin/plugins/oauth/forms.py:34
msgid "Name"
-msgstr "Nafn"
+msgstr "Heiti"
#: mediagoblin/plugins/oauth/forms.py:35
msgid "The name of the OAuth client"
@@ -374,7 +449,7 @@ msgstr "Ãframsendingarvefslóðin fyrir forritin, þessi reitur\n er
msgid "This field is required for public clients"
msgstr "Þessi reitur er nauðsynlegur fyrir opinbera biðlara"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Biðlarinn {0} hefur verið skráður!"
@@ -387,59 +462,209 @@ msgid "Your OAuth clients"
msgstr "OAuth-biðlararnir þínir"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Bæta við"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr "Því miður er annar aðgangur nú þegar skráður fyrir þetta OpenID auðkenni."
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr "OpenID auðkenni"
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr "Því miður fannst OpenID netþjónninn ekki"
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr "Engin OpenID þjónusta fannst fyrir „%s“"
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr "Staðfesting á „%s“ mistóksts: „%s“"
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr "Hætt við staðfestingu"
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr "Það tókst að vista OpenID vefslóðina þína."
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr "Þú getur ekki eytt einu OpenID vefslóðinni nema þú hafir skráð lykilorð"
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr "Þetta OpenID auðkenni er ekki skráð á þennan aðgang."
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr "Það tókst að fjarlægja OpenID auðkennið."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr "Bæta við OpenID auðkenni"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr "Eyða OpenID auðkenni"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Eyða"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr "OpenID auðkenni"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Innskrá"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Mistókst að skrá þig inn."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr "Skráðu þig inn til að búa til nýjan aðgang!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr "...eða skráðu þig inn með lykilorði!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr "...eða skráðu þig inn með OpenID auðkenni!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr "...eða nýskráðu þig með OpenID auðkenni!"
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr "Því miður er annar aðgangur nú þegar skráður fyrir þetta „Persona“ netfang."
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr "Það tókst að fjarlægja „Persona“ netfangið."
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr "Þú getur ekki eytt eina „Persona“ netfanginu þínu nema þú hafir skráð lykilorð."
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr "Þetta „Persona“ netfang er ekki skráð fyrir þennan aðgang."
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr "Því miður er annar aðgangur nú þegar skráður fyrir þetta „Persona“ netfang."
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr "Það tókst að vista „Persona“ netfangið þitt."
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr "Eyða „Persona“ netfangi"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr "Bæta við „Persona“ netfangi"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr "Breyta „Persona“ netföngunum þínum"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr "...eða skráðu þig inn með „Persona“!"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr "...eða nýskráðu þig með „Persona“!"
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Ógild skrá gefin fyrir þessa margmiðlunartegund."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr "Það tókst ekki að afrita yfir í almennu geymsluna."
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr "Nothæf keyrsluskrá fannst ekki"
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Skrá"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Þú verður að gefa upp skrá."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Jibbí jei! Það tókst að senda inn!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "Albúmið \"%s\" var búið til!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Staðfestu netfangið þitt!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "útskrá"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Innskrá"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "Notandaaðgangur: <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Breyta stillingum notandaaðgangs"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +672,16 @@ msgstr "Breyta stillingum notandaaðgangs"
msgid "Media processing panel"
msgstr "Margmiðlunarvinnsluskiki"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Skrá út"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Senda inn efni"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Búa til nýtt albúm"
@@ -503,6 +728,59 @@ msgstr "Síðustu 10 árangursríku innsendingarnar"
msgid "No processed entries, yet!"
msgstr "Ekkert fullunnið efni enn!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr "Heimilun"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr "Heimila"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr "Þú ert"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr "Viltu heimila"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr "óþekktu forriti"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr "að fá aðgang að aðganginum þínum?"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr "Forrit með aðgang að notendaaðganginum þínum geta:"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr "Sent inn nýtt margmiðlunarefni sem þú"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr "Skoða upplýsingarnar þínar (t.d. kenniskrá, margmiðlunarefni o.s.frv.)"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr "Breytt upplýsingunum þínum"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr "Heimilun lokið"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr "Heimild klár"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr "Afritaðu og límdu þetta í forritið þitt:"
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,19 +813,15 @@ msgid ""
"a happy goblin!"
msgstr "Hæ %(username)s,\n\ntil að breyta GNU MediaGoblin lykilorðinu þínu opnar þú eftirfarandi vefslóð í \nvafranum þínum:\n\n%(verification_url)s\n\nEf þú heldur að það sé einhver vitleysa í gangi husnar þú bara þennan póst og heldur áfram að vera\nánægður durtur!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Mistókst að skrá þig inn."
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Ertu ekki með notendaaðgang?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Búðu til aðgang hérna!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Gleymdirðu lykilorðinu þínu?"
@@ -556,7 +830,7 @@ msgstr "Gleymdirðu lykilorðinu þínu?"
msgid "Create an account!"
msgstr "Búðu til nýjan aðgang!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Búa til"
@@ -590,7 +864,7 @@ msgstr "Gefið út undir <a href=\"http://www.fsf.org/licensing/licenses/agpl-3.
msgid "Explore"
msgstr "Skoða"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Hæ! Gakktu í bæinn á þetta MediaGoblin vefsvæði!"
@@ -600,23 +874,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Þetta vefsvæði keyrir á <a href=\"http://mediagoblin.org\">MediaGoblin</a> sem er ótrúlega frábær hugbúnaður til að geyma margmiðlunarefni."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Til að senda inn þitt efni, gera athugasemdir og fleira getur þú skráð þig inn með þínum MediaGoblin aðgangi."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Ertu ekki með aðgang? Það er auðvelt að búa til!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Búa til aðgang á þessari síðu</a>\neða\n<a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Settu upp þinn eigin margmiðlunarþjón</a>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr "\n>Búa til aðgang á þessari síðu</a>\neða"
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr "\n <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">settu upp þinn eigin margmiðlunarþjón</a>"
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +909,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Breyti viðhengjum við: %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Viðhengi"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Bæta við viðhengi"
@@ -653,22 +932,29 @@ msgstr "Hætta við"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Vista breytingar"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "Breyti lykilorði fyrir notandann: %(username)s"
+msgid "Changing %(username)s's email"
+msgstr "Breyti netfangi fyrir notandann: %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "Vista"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "Breyti lykilorði fyrir notandann: %(username)s"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,14 +982,14 @@ msgstr "Breyti %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "Breyti notandaaðgangsstillingum fyrir: %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "Breyta lykilorðinu þínu."
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Eyða aðganginum mínum"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr "Netfang"
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -715,6 +1001,36 @@ msgstr "Breyti %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Breyti kenniskrá notandans: %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr "Hi,\n\nVið vildum staðfesta að þú værir notandinn „%(username)s“. Ef það er rétt,\nvinsamlegast smelltu á tengilinn hér fyrir neðan til að staðfesta nýja netfangið þitt.\n\n%(verification_url)s\n\nEf þú ert ekki „%(username)s“ or baðst ekki um að breytan netfanginu getur þú hunsað\nþennan tölvupóst."
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr "Nýjar athugasemdir"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "Fyrir %(formatted_time)s"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr "Merkja allt lesið"
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,11 +1041,10 @@ msgstr "Efni merkt með: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
-msgstr "Sækja af Netinu"
+msgstr "Sækja"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:38
msgid "Original"
@@ -750,7 +1065,7 @@ msgid ""
msgstr "Þú getur náð í nýlegan vafra sem \n\tgetur spilað hljóðskrár á <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Upphaflega skráin"
@@ -759,6 +1074,10 @@ msgstr "Upphaflega skráin"
msgid "WebM file (Vorbis codec)"
msgstr "WebM skrá (Vorbis víxlþjöppun)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Búið til"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1089,39 @@ msgstr "WebM skrá (Vorbis víxlþjöppun)"
msgid "Image for %(media_title)s"
msgstr "Mynd fyrir %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "PDF skrá"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "Stilla snúning af eða á"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
-msgstr "Sjónhorf"
+msgstr "Fjarvídd"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "Framhlið"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "Toppur"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Hlið"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Hala niður líkani"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Skráarsnið"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Hæð hlutar"
@@ -819,18 +1130,18 @@ msgid ""
"Sorry, this video will not work because\n"
" your web browser does not support HTML5 \n"
" video."
-msgstr "Því miður mun þetta myndband ekki virka því\n vafrinn þinn styður ekki HTML5 \n myndbönd."
+msgstr "Því miður mun þetta myndskeið ekki virka því\n vafrinn þinn styður ekki HTML5 \n myndbönd."
#: mediagoblin/templates/mediagoblin/media_displays/video.html:47
msgid ""
"You can get a modern web browser that \n"
" can play this video at <a href=\"http://getfirefox.com\">\n"
" http://getfirefox.com</a>!"
-msgstr "Þú getur náð í nýlegan vafra sem \n sem getur spilað myndbandið á <a href=\"http://getfirefox.com\">\n http://getfirefox.com</a>!"
+msgstr "Þú getur náð í nýlegan vafra sem \n sem getur spilað myndskeiðið á <a href=\"http://getfirefox.com\">\n http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "WebM skrá (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr "WebM skrá (VP8/Vorbis)"
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -856,11 +1167,6 @@ msgstr "%(collection_title)s sem <a href=\"%(user_url)s\">%(username)s</a> bjó
msgid "Edit"
msgstr "Breyta"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Eyða"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1221,22 @@ msgstr "Efni sem <a href=\"%(user_url)s\">%(username)s</a> á"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■Skoða efnið sem <a href=\"%(user_url)s\">%(username)s</a> setti inn"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Bæta við athugasemd"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Senda inn þessa athugasemd"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "Fyrir %(formatted_time)s"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr "Útlit athugasemdar"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Bætt við"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "Skapað"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1096,26 +1395,34 @@ msgstr "Merkt með"
msgid "Could not read the image file."
msgstr "Gat ekki lesið myndskrána."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Obbosí!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Villa kom upp"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr "Ekki nógu góð beiðni"
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr "Beiðnin sem var send til netþjónsins er ógild, vinsamlegast athugaðu hana aftur"
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Aðgerð ekki leyfileg"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
-msgstr "Fyrirgefðu Davíð. Ég get ekki leyft þér að gera þetta!</p></p>Þú hefur reynt að framkvæma aðger sem þú hefur ekki leyfi til. Varstu að reyna að eyða öllum notendunum aftur?"
+msgstr "Fyrirgefðu Davíð. Ég get ekki leyft þér að gera þetta!</p></p>Þú reyndir að framkvæma aðgerð sem þú hefur ekki leyfi til að gera. Varstu að reyna að eyða öllum notendareikningum aftur?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1152,10 +1459,9 @@ msgstr "Athugasemd"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Þú getur notað <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> til að stílgera textann"
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr "Þú getur notað <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">Markdown</a> til að stílgera textann."
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1177,77 +1483,80 @@ msgstr "-- Velja --"
msgid "Include a note"
msgstr "Bæta við minnispunktum"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "skrifaði athugasemd við færsluna þína"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr "Þú getur notað\n <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n Markdown</a> til að stílgera textann."
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "Því miður, athugasemdir eru óvirkar."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Obbosí! Athugasemdin þín var innihaldslaus."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Athugasemdin þín var skráð!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
-msgstr "Vinsamlegast kíktu á innsendingarnar þínar og reyndu aftur."
+msgstr "Vinsamlegast kíktu á færslurnar þínar og reyndu aftur."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Þú verður að velja eða búa til albúm"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" er nú þegar í albúminu \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" sett í albúmið \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Þú eyddir þessu efni."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Efninu var ekki eytt þar sem þú merktir ekki við að þú værir viss."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Þú ert í þann mund að fara að eyða efni frá öðrum notanda. Farðu mjög varlega."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Þú tókst þetta efni úr albúminu."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "Þetta efni var ekki fjarlægt af því að þú merktir ekki við að þú værir viss."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Þú ert í þann mund að fara að eyða efni úr albúmi annars notanda. Farðu mjög varlega."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Þú eyddir albúminu \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "Þessu albúmi var ekki eytt vegna þess að þu merktir ekki við að þú værir viss."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Þú ert í þann mund að fara að eyða albúmi annars notanda. Farðu mjög varlega."
diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
index 62575b62..74176ccf 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 c782fc62..2e73b622 100644
--- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
@@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/mediagoblin/language/it/)\n"
"MIME-Version: 1.0\n"
@@ -23,250 +23,280 @@ msgstr ""
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Nome utente"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Password"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Indirizzo email"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Spiacente, la registrazione è disabilitata su questa istanza."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Nome utente o indirizzo email"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Spiacente, la registrazione è disabilitata su questa istanza."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Spiacente, esiste già un utente con quel nome."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
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:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Il tuo indirizzo email è stato verificato. Ora puoi accedere, modificare il tuo profilo e caricare immagini!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "La chiave di verifica o l'id utente è sbagliato"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Devi effettuare l'accesso così possiamo sapere a chi inviare l'email!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Hai già verificato il tuo indirizzo email!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Rispedisci email di verifica"
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Ti è stata inviata un'email con le istruzioni per cambiare la tua password."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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 indirizzo email non è stato verificato."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Ora puoi effettuare l'accesso con la nuova password."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titolo"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Descrizione di questo lavoro"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Puoi usare il\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> per la formattazione."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Tags"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Separa le tags con la virgola."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Il titolo è parte dell'indirizzo del file. Nella maggior parte dei casi non c'è bisogno di cambiarlo."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Licenza"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Biografia"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Sito web"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Questo indirizzo contiene errori"
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Inviami messaggi email quando altre persone commentano i miei files multimediali"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Inviami messaggi email quando altre persone commentano i miei files multimediali"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
+msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Password vecchia"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Inserisci la vecchia password per dimostrare di essere il proprietario dell'account."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nuova password"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Password"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Stai modificando files multimediali di un altro utente. Procedi con attenzione."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Stai modificando il profilo di un utente. Procedi con attenzione."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Cambiamenti del profilo salvati"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Impostazioni del profilo salvate"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Password errata"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -301,19 +331,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Mi dispiace, non supporto questo tipo di file :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Transcodifica video fallita"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "ha commentato il tuo post"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Nome utente"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Indirizzo email"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Posizione"
@@ -377,7 +450,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -390,59 +463,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Aggiungi"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Elimina"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Accedi"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Accesso fallito!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "File non valido per il tipo di file multimediale indicato."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "File"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Devi specificare un file."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Evviva! Caricato!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Verifica la tua email!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Accedi"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Cambia le impostazioni dell'account"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -450,16 +673,16 @@ msgstr "Cambia le impostazioni dell'account"
msgid "Media processing panel"
msgstr "Pannello di elaborazione files multimediali"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Aggiungi files multimediali"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -506,6 +729,59 @@ msgstr "Ultimi 10 caricamenti riusciti"
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -538,19 +814,15 @@ msgid ""
"a happy goblin!"
msgstr "Ciao %(username)s,\n\nper cambiare la tua password MediaGoblin apri il seguente URL nel\ntuo browser web:\n\n%(verification_url)s\n\nSe pensi che questo sia un errore, ignora semplicemente questa email e continua ad essere \nun goblin felice!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Accesso fallito!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Non hai ancora un account?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Creane uno qui!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Hai dimenticato la tua password?"
@@ -559,7 +831,7 @@ msgstr "Hai dimenticato la tua password?"
msgid "Create an account!"
msgstr "Crea un account!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Crea"
@@ -593,7 +865,7 @@ msgstr "Rilasciato con licenza <a href=\"http://www.fsf.org/licensing/licenses/a
msgid "Explore"
msgstr "Esplora"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Ciao, benvenuto in questo sito MediaGoblin!"
@@ -603,22 +875,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Questo sito sta utilizzando <a href=\"http://mediagoblin.org\">Mediagoblin</a>, un ottimo programma per caricare e condividere files multimediali."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Per aggiungere i tuoi file multimediali, scrivere commenti e altro puoi accedere con il tuo account MediaGoblin."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Non ne hai già uno? E' semplice!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -633,13 +910,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Stai modificando gli allegati di %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Allegati"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Aggiungi allegato"
@@ -656,22 +933,29 @@ msgstr "Annulla"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Salva i cambiamenti"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -699,12 +983,12 @@ msgstr "Stai modificando %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "Stai cambiando le impostazioni dell'account di %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -718,6 +1002,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr "Stai modificando il profilo di %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -728,8 +1042,7 @@ msgstr "File taggato con: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Scarica"
@@ -753,7 +1066,7 @@ msgid ""
msgstr "Puoi scaricare un browser web moderno,\n\t in grado di leggere questo file audio, qui <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "File originario"
@@ -762,6 +1075,10 @@ msgstr "File originario"
msgid "WebM file (Vorbis codec)"
msgstr "File WebM (codec Vorbis)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -773,47 +1090,39 @@ msgstr "File WebM (codec Vorbis)"
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -832,8 +1141,8 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "File WebM (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -859,11 +1168,6 @@ msgstr ""
msgid "Edit"
msgstr "Modifica"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Elimina"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -918,29 +1222,22 @@ msgstr "Files multimediali di <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "â– Stai guardando i files multimediali di <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Aggiungi un commento"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Aggiungi questo commento"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1099,26 +1396,34 @@ msgstr "Taggato con"
msgid "Could not read the image file."
msgstr "Impossibile leggere il file immagine."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Oops!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1155,10 +1460,9 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Puoi usare il <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> per la formattazione."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1180,77 +1484,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "ha commentato il tuo post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Oops, il tuo commento era vuoto."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Il tuo commento è stato aggiunto!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Hai eliminato il file."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
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:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Stai eliminando un file multimediale di un altro utente. Procedi con attenzione."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
index 3c82d1ff..841f0219 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 97d68127..88a8ddc8 100644
--- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Japanese (http://www.transifex.com/projects/p/mediagoblin/language/ja/)\n"
"MIME-Version: 1.0\n"
@@ -20,250 +20,280 @@ msgstr ""
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "ユーザãƒãƒ¼ãƒ "
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "パスワード"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "メールアドレス"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ç™»éŒ²ã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ã€‚"
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr ""
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ç™»éŒ²ã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ã€‚"
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãã®åå‰ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã™ã§ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚"
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "メアドãŒç¢ºèªã•れã¦ã„ã¾ã™ã€‚ã“れã§ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãƒ—ロファイルを編集ã—ã€ç”»åƒã‚’æå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "検証キーã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼IDãŒé–“é•ã£ã¦ã„ã¾ã™"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr ""
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr ""
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "検証メールをå†é€ã—ã¾ã—ãŸã€‚"
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "タイトル"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr ""
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "ã‚¿ã‚°"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "スラグ"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "スラグã¯å¿…è¦ã§ã™ã€‚"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "自己紹介"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "URL"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr ""
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr ""
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "パスワード"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "ãã®ã‚¹ãƒ©ã‚°ã‚’æŒã¤ã‚¨ãƒ³ãƒˆãƒªã¯ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "ã‚ãªãŸã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集ã—ã¦ã„ã¾ã™ã€‚ã”æ³¨æ„ãã ã•ã„。"
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "ã‚ãªãŸã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ—ロファイルを編集ã—ã¦ã„ã¾ã™ã€‚ã”æ³¨æ„ãã ã•ã„。"
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr ""
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -298,19 +328,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "ユーザãƒãƒ¼ãƒ "
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "メールアドレス"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -374,7 +447,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -387,59 +460,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "追加"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "削除"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "ログイン"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr ""
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "ファイル"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "ファイルをæä¾›ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "投稿終了ï¼"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "ログイン"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +670,16 @@ msgstr ""
msgid "Media processing panel"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -503,6 +726,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,19 +811,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "ã¾ã ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’æŒã£ã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "ã“ã“ã§ä½œæˆï¼"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "パスワードを忘れã¾ã—ãŸã‹ï¼Ÿ"
@@ -556,7 +828,7 @@ msgstr "パスワードを忘れã¾ã—ãŸã‹ï¼Ÿ"
msgid "Create an account!"
msgstr "アカウントを作æˆï¼"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr ""
@@ -590,7 +862,7 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "ã“ã‚“ã«ã¡ã¯ã€ã“ã®MediaGoblinサイトã¸ã‚ˆã†ã“ãï¼"
@@ -600,22 +872,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +907,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -653,22 +930,29 @@ msgstr "キャンセル"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "投稿ã™ã‚‹"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,12 +980,12 @@ msgstr "%(media_title)sを編集中"
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -715,6 +999,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr "%(username)sã•ã‚“ã®ãƒ—ロフィールを編集中"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,8 +1039,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "ダウンロード"
@@ -750,7 +1063,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -759,6 +1072,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1087,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -829,7 +1138,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -856,11 +1165,6 @@ msgstr ""
msgid "Edit"
msgstr "編集"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "削除"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1219,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a>ã•ã‚“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1096,26 +1393,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr ""
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1152,9 +1457,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1177,77 +1481,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.mo
index 7d37ab7c..dec0d936 100644
--- a/mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.po
index 5333de02..b192f7ab 100644
--- a/mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ko_KR/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/mediagoblin/language/ko_KR/)\n"
"MIME-Version: 1.0\n"
@@ -19,250 +19,280 @@ msgstr ""
"Language: ko_KR\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "ì‚¬ìš©ìž ì´ë¦„"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "비밀번호"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "email 주소"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "죄송합니다. ì§€ê¸ˆì€ ê°€ìž… 하실 수 없습니다."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "ì‚¬ìš©ìž ì´ë¦„ ë˜ëŠ” email"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "죄송합니다. ì§€ê¸ˆì€ ê°€ìž… 하실 수 없습니다."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "죄송합니다. 해당 ì‚¬ìš©ìž ì´ë¦„ì´ ì´ë¯¸ 존재 합니다."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "죄송합니다. 사용ìžì™€ 해당 ì´ë©”ì¼ì€ ì´ë¯¸ 등ë¡ë˜ì–´ 있습니다."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "해당 email 주소가 ì´ë¯¸ ì¸ì¦ ë˜ì–´ 있습니다. 지금 로그ì¸í•˜ì‹œê³  계정 정보를 수정하고 ì‚¬ì§„ì„ ì „ì†¡í•´ 보세요!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "ì¸ì¦ 키 ë˜ëŠ” ì‚¬ìš©ìž IDê°€ 올바르지 않습니다."
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "로그ì¸ì„ 하셔야 고블린ì—서 ë©”ì¼ì„ 보낼 수 있습니다!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "ì´ë¯¸ ì¸ì¦ë°›ì€ email 주소를 가지고 있습니다!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "ì¸ì¦ ë©”ì¼ì„ 다시 ë³´ë‚´ 주세요."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "비밀번호를 변경하는 ë°©ë²•ì— ëŒ€í•œ 설명서가 ë©”ì¼ë¡œ 전송 ë˜ì—ˆìŠµë‹ˆë‹¤."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "사용ìžì˜ ì´ë¦„ì´ ì¡´ìž¬í•˜ì§€ 않거나, 사용ìžì˜ email 주소가 ì¸ì¦ë˜ì§€ 않아 비밀번호 복구 ë©”ì¼ì„ 보낼 수 없습니다."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "ì´ì œ 새로운 비밀번호로 ë¡œê·¸ì¸ í•˜ì‹¤ 수 있습니다."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "제목"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "ì´ ìž‘ì—…ì— ëŒ€í•œ 설명"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "í¬ë©§íŒ…ì„ ì‚¬ìš©í•˜ë ¤ë©´\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> ë§í¬ë¥¼ 참고 하세요."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "태그"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "태그는 , 로 구분 ë©ë‹ˆë‹¤."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "'슬러그'"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "'슬러그'는 ê³µë°±ì¼ ìˆ˜ 없습니다."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "ì œëª©ì€ ë¯¸ë””ì–´ ì£¼ì†Œì˜ ì¼ë¶€ë¶„ 입니다. 수정하지 ì•Šì•„ë„ ë©ë‹ˆë‹¤."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "License"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "소개"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "웹 주소"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "ì£¼ì†Œì— ì—러가 있습니다."
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "ì œ ë¯¸ë””ì–´ì— ëŒ€í•œ 컨í…ì„ ì›í•œë‹¤ë©´, ë©”ì¼ì„ 보내주세요."
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "ì œ ë¯¸ë””ì–´ì— ëŒ€í•œ 컨í…ì„ ì›í•œë‹¤ë©´, ë©”ì¼ì„ 보내주세요."
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
+msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "ì œëª©ì€ ê³µë°±ì¼ ìˆ˜ 없습니다."
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "모ìŒì§‘ì— ëŒ€í•œ 설명"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "예전 비밀번호"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "계정 확ì¸ì„ 위해, ì´ì „ 비밀 번호를 입력해 주세요."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "새로운 비밀번호"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "비밀번호"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "해당 ìœ ì €ì— ëŒ€í•œ '슬러그'ê°€ ì´ë¯¸ 존재합니다."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "다른 사용ìžì˜ 미디어를 수정하고 있습니다. 조심해서 수정하세요."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "사용ìžì˜ 계정 정보를 수정하고 있습니다. 조심해서 수정하세요."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "계정 ì •ë³´ê°€ 저장 ë˜ì—ˆìŠµë‹ˆë‹¤."
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "계정 ì„¤ì •ì´ ì €ìž¥ ë˜ì—ˆìŠµë‹ˆë‹¤."
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "\"%s\" 모ìŒì§‘ì„ ì´ë¯¸ 가지고 있습니다!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "다른 ìœ ì €ì˜ ëª¨ìŒì§‘ì„ ìˆ˜ì • 중 입니다. 주ì˜í•˜ì„¸ìš”."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "ìž˜ëª»ëœ ë¹„ë°€ë²ˆí˜¸"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "í…Œë§ˆì— ì—°ê²°í•  수 없습니다... 테마 ì…‹ì´ ì—†ìŠµë‹ˆë‹¤.\n"
@@ -297,19 +327,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "죄송합니다. 해당 íƒ€ìž…ì˜ íŒŒì¼ì€ ì§€ì›í•˜ì§€ 않아요 :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "비디오 ë³€í™˜ì— ì‹¤íŒ¨ 했습니다."
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "ê²Œì‹œë¬¼ì— ë§ê¸€ì´ 달렸습니다."
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "ì‚¬ìš©ìž ì´ë¦„"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "email 주소"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "장소"
@@ -373,7 +446,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr "ì´ í•­ëª©ì€ ê³µê°œ 사용ìžë“¤ì„ 위해 ê¼­ í•„ìš” 합니다."
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "ì‚¬ìš©ìž {0}ë‹˜ì´ ë“±ë¡ ë˜ì—ˆìŠµë‹ˆë‹¤!"
@@ -386,59 +459,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "추가"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "삭제"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "로그ì¸"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "로그ì¸ì— 실패 했습니다!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "알수없는 미디어 íŒŒì¼ ìž…ë‹ˆë‹¤."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "파ì¼"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "파ì¼ì„ 등ë¡í•˜ì…”야 합니다."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "ì´í–!! 등ë¡í–ˆìŠµë‹ˆë‹¤!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "\"%s\" 모ìŒì§‘ì´ ì¶”ê°€ë˜ì—ˆìŠµë‹ˆë‹¤!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "ë©”ì¼ì„ 확ì¸í•˜ì„¸ìš”!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "로그ì¸"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "계정 설정 변경"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -446,16 +669,16 @@ msgstr "계정 설정 변경"
msgid "Media processing panel"
msgstr "미디어 작업 패ë„"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "미디어 추가"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -502,6 +725,59 @@ msgstr "지난 10ê°œì˜ ì—…ë¡œë“œ 목ë¡"
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -534,19 +810,15 @@ msgid ""
"a happy goblin!"
msgstr "안녕하세요 %(username)s,\n\nGNU MediaGoblinì˜ ì‚¬ìš©ìž ê³„ì • 비밀번호를 바꾸시려면, ì¸í„°ë„· ì°½ì„ ì—¬ì‹œê³  아래 URLì„ í†µí•´ ì ‘ì† í•˜ì„¸ìš”. :\n\n%(verification_url)s\n\n오류ë¼ê³  ìƒê° ëœë‹¤ë©´, ì´ ë©”ì¼ì„ 무시하시고 ê³ ë¸”ë¦°ì„ ì¦ê¸°ì„¸ìš”!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "로그ì¸ì— 실패 했습니다!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "ì•„ì§ ê³„ì •ì´ ì—†ìœ¼ì„¸ìš”?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "ì´ê³³ì—서 새로 만드세요!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "비밀번호를 잊으셨나요?"
@@ -555,7 +827,7 @@ msgstr "비밀번호를 잊으셨나요?"
msgid "Create an account!"
msgstr "ê³„ì •ì„ ìƒˆë¡œ 만듭니다!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "ìƒì„±"
@@ -589,7 +861,7 @@ msgstr "Released under the <a href=\"http://www.fsf.org/licensing/licenses/agpl-
msgid "Explore"
msgstr "íƒìƒ‰"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "안녕하세요! 미디어 고블린 사ì´íŠ¸ì— ì˜¨ê±¸ í™˜ì˜ í•©ë‹ˆë‹¤!"
@@ -599,22 +871,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "ì´ì‚¬ì´íŠ¸ëŠ” <a href=\"http://mediagoblin.org\">MediaGoblin</a>으로 ìž‘ë™ ì¤‘ìž…ë‹ˆë‹¤. ì´ëŠ” 특ì´í•œ 미디어 호스팅 소프트웨어중 하나 입니다."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "ìžì‹ ì˜ 미디어를 추가하고, ëŒ“ê¸€ì„ ë‚¨ê¸°ì„¸ìš”! 미디어 고블린 계정으로 ë‚´ì—­ì„ í™•ì¸ í•˜ì‹¤ 수 있습니다!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "ì•„ì§ ì•„ë¬´ê²ƒë„ ì—†ìœ¼ì‹œë‹¤êµ¬ìš”? 매우 쉽습니다!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -629,13 +906,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "%(media_title)sì˜ ì²¨ë¶€ 수정 중..."
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "첨부"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "첨부 추가"
@@ -652,22 +929,29 @@ msgstr "취소"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "저장"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -695,12 +979,12 @@ msgstr "%(media_title)s 편집중..."
msgid "Changing %(username)s's account settings"
msgstr "%(username)s'ì˜ ê³„ì • 설정 변경중..."
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -714,6 +998,36 @@ msgstr "%(collection_title)s 편집 중"
msgid "Editing %(username)s's profile"
msgstr "%(username)sì˜ ê³„ì • ì •ë³´ 수정중..."
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -724,8 +1038,7 @@ msgstr "미디어는 다ìŒìœ¼ë¡œ 태그 ë˜ì—ˆìŠµë‹ˆë‹¤.: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "다운로드"
@@ -749,7 +1062,7 @@ msgid ""
msgstr "사운드 파ì¼ì„ ìž¬ìƒ í•˜ì‹œë ¤ë©´\n\tì´ê³³ì—서 ìµœì‹ ì˜ ë¸Œë¼ìš°ì ¸ë¥¼ 다운받으세요! <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "ì›ë³¸ 파ì¼"
@@ -758,6 +1071,10 @@ msgstr "ì›ë³¸ 파ì¼"
msgid "WebM file (Vorbis codec)"
msgstr "WebM íŒŒì¼ (Vorbis ì½”ë±)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -769,47 +1086,39 @@ msgstr "WebM íŒŒì¼ (Vorbis ì½”ë±)"
msgid "Image for %(media_title)s"
msgstr "%(media_title)s ì´ë¯¸ì§€"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -828,8 +1137,8 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "WebM íŒŒì¼ (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -855,11 +1164,6 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a>ì˜ %(collection_title)s"
msgid "Edit"
msgstr "수정"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "삭제"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -914,29 +1218,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a>ì˜ ë¯¸ë””ì–´"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "â– <a href=\"%(user_url)s\">%(username)s</a>ì˜ ë¯¸ë””ì–´ë¥¼ ë³´ê³  있습니다."
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "ë§ê¸€ 달기"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "ë§ê¸€ 추가"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1095,26 +1392,34 @@ msgstr "태그 정보"
msgid "Could not read the image file."
msgstr "ì´ë¯¸ì§€ 파ì¼ì„ ì½ì„ 수 없습니다."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "ì›ìФ!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1151,10 +1456,9 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "í¬ë©§íŒ…ì„ ìœ„í•´ <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> ì„ ì‚¬ìš©í•  수 있습니다.."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1176,77 +1480,80 @@ msgstr "-- ì„ íƒ --"
msgid "Include a note"
msgstr "노트 추가"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "ê²Œì‹œë¬¼ì— ë§ê¸€ì´ 달렸습니다."
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "오우, ëŒ“ê¸€ì´ ë¹„ì—ˆìŠµë‹ˆë‹¤."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "ëŒ“ê¸€ì´ ë“±ë¡ ë˜ì—ˆìŠµë‹ˆë‹¤!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "확ì¸ì„ 하시고 다시 시ë„하세요."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "모ìŒì§‘ì„ ì¶”ê°€í•˜ê±°ë‚˜ 기존 모ìŒì§‘ì„ ì„ íƒí•˜ì„¸ìš”."
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" 모ìŒì§‘ì´ ì´ë¯¸ 존재 합니다. \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" 모ìŒì§‘ì„ ì¶”ê°€í–ˆìŠµë‹ˆë‹¤. \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "미디어를 삭제 했습니다."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "í™•ì¸ ì²´í¬ë¥¼ 하지 않았습니다. 미디어는 ì‚­ì œë˜ì§€ 않았습니다."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "다른 ì‚¬ëžŒì˜ ë¯¸ë””ì–´ë¥¼ 삭제하려고 합니다. 다시 한번 확ì¸í•˜ì„¸ìš”."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "모ìŒì§‘ì— ìžˆëŠ” í•­ëª©ì„ ì‚­ì œ 했습니다."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "확ì¸ì„ 하지 않았습니다. í•­ëª©ì€ ì‚­ì œí•˜ì§€ 않았습니다."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "다른 사용ìžì˜ 모ìŒì§‘ì— ìžˆëŠ” í•­ëª©ì„ ì‚­ì œí•˜ì˜€ìŠµë‹ˆë‹¤. 주ì˜í•˜ì„¸ìš”."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "\"%s\" 모ìŒì§‘ì„ ì‚­ì œí•˜ì…¨ìŠµë‹ˆë‹¤."
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "확ì¸ì„ 하지 않았습니다. 모ìŒì§‘ì€ ì‚­ì œí•˜ì§€ 않았습니다."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "다른 사용ìžì˜ 모ìŒì§‘ì„ ì‚­ì œí•˜ë ¤ê³  합니다. 주ì˜í•˜ì„¸ìš”."
diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
index 4e6e51ce..2b6c247d 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 14e4fb33..7853ec7c 100644
--- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Dutch (http://www.transifex.com/projects/p/mediagoblin/language/nl/)\n"
"MIME-Version: 1.0\n"
@@ -20,250 +20,280 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Gebruikersnaam"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Wachtwoord"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "E-mail adres"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Sorry, registratie is uitgeschakeld op deze instantie."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Gebruikersnaam of email-adres"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Sorry, registratie is uitgeschakeld op deze instantie."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Sorry, er bestaat al een gebruiker met die naam."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Sorry, een gebruiker met dat e-mailadres bestaat al."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Uw e-mailadres is geverifieerd. U kunt nu inloggen, uw profiel bewerken, en afbeeldingen toevoegen!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "De verificatie sleutel of gebruikers-ID is onjuist"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
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:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Je hebt je e-mailadres al geverifieerd!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Verificatie e-mail opnieuw opgestuurd."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Een e-mail met instructies om je wachtwoord te veranderen is verstuurd."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Je kunt nu inloggen met je nieuwe wachtwoord."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Beschrijving van dit werk"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Voor opmaak kun je <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> gebruiken."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Etiket"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Hou labels gescheiden met komma's."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Slug"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "De slug kan niet leeg zijn"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Het titelgedeelte van het adres van deze media. Normaal gesproken hoef je deze niet te veranderen."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Licentie"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Website"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Dit adres bevat fouten"
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Oud wachtwoord"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Vul je oude wachtwoord in om te bewijzen dat dit jouw account is"
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nieuw wachtwoord"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "Er bestaat al een met die slug voor deze gebruiker."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
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:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "U bent een gebruikersprofiel aan het aanpassen. Ga voorzichtig te werk."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Profielaanpassingen opgeslagen"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Accountinstellingen opgeslagen"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Verkeerd wachtwoord"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -298,19 +328,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Sorry, dat bestandstype wordt niet ondersteunt."
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "E-mail adres"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Locatie"
@@ -374,7 +447,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -387,59 +460,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Voeg toe"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Inloggen"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Inloggen is mislukt!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Verkeerd bestandsformaat voor mediatype opgegeven."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Bestand"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "U moet een bestand aangeven."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Mooizo! Toegevoegd!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Verifieer je e-mailadres!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Inloggen"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Accountinstellingen aanpassen"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +670,16 @@ msgstr "Accountinstellingen aanpassen"
msgid "Media processing panel"
msgstr "Mediaverwerkingspaneel"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Voeg media toe"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -503,6 +726,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,19 +811,15 @@ msgid ""
"a happy goblin!"
msgstr "Hoi %(username)s,\n\nOm je wachtwoord voor GNU MediaGoblin te veranderen, moet je dit adres in je webbrowser openen:\n\n%(verification_url)s\n\nAls je denkt dat dit niet klopt, kun je deze e-mail gewoon negeren."
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Inloggen is mislukt!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Heeft u nog geen account?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Maak er hier een!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Wachtwoord vergeten?"
@@ -556,7 +828,7 @@ msgstr "Wachtwoord vergeten?"
msgid "Create an account!"
msgstr "Maak een account aan!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Creëer"
@@ -590,7 +862,7 @@ msgstr "Uitgegeven onder de <a href=\"http://www.fsf.org/licensing/licenses/agpl
msgid "Explore"
msgstr "Verkennen"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Hoi, welkom op deze MediaGoblin website!"
@@ -600,22 +872,27 @@ msgid ""
"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/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Heb je er nog geen? Het is heel eenvoudig!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +907,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -653,22 +930,29 @@ msgstr "Annuleren"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Wijzigingen opslaan"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,12 +980,12 @@ msgstr "%(media_title)s aanpassen"
msgid "Changing %(username)s's account settings"
msgstr "%(username)ss accountinstellingen aanpassen"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -715,6 +999,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr "Het profiel aanpassen van %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,8 +1039,7 @@ msgstr "Media met het label: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -750,7 +1063,7 @@ msgid ""
msgstr "U kunt een moderne web-browser die \n\taudio kan afspelen vinden op <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -759,6 +1072,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1087,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr "Afbeelding voor %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -829,7 +1138,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -856,11 +1165,6 @@ msgstr ""
msgid "Edit"
msgstr "Pas aan"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Verwijderen"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1219,22 @@ msgstr "Media van <a href=\"%(user_url)s\"> %(username)s </a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "â– Blader door media van <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Geef een reactie"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Voeg dit bericht toe"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1096,26 +1393,34 @@ msgstr "Getagged met"
msgid "Could not read the image file."
msgstr "Kon het afbeeldingsbestand niet lezen."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Oeps!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1152,10 +1457,9 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Voor opmaak kun je &lt;a href=\"http://daringfireball.net/projects/markdown/basics\"&gt;Markdown&lt;/a&gt; gebruiken."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1177,77 +1481,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Oeps, je bericht was leeg."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Je bericht is geplaatst!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Je hebt deze media verwijderd."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
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:296
+#: mediagoblin/user_pages/views.py:321
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."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
index 9cbd03b2..4b2e7815 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 6a11d5da..261713fb 100644
--- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-31 15:40+0000\n"
-"Last-Translator: velmont <odin.omdal@gmail.com>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/mediagoblin/language/nn_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,250 +20,280 @@ msgstr ""
"Language: nn_NO\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Brukarnamn"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Passord"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Epost"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Registrering er slege av. Orsak."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Brukarnamn eller epost"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr "Autentisering er slege av. Orsak."
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Brukarnamn eller epost"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Ugyldig brukarnamn eller passord."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Dette feltet tek ikkje epostadresser."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Dette feltet krev ei epostadresse."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Registrering er slege av. Orsak."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Ein konto med dette brukarnamnet finst allereide."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Ein brukar med den epostadressa finst allereie."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr "Stadfestingsnykelen eller brukar-ID-en din er feil."
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Kontoen din er stadfesta. Du kan no logga inn, endra profilen din og lasta opp filer."
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Stadfestingsnykelen eller brukar-ID-en din er feil."
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Du må vera innlogga, slik me veit kven som skal ha eposten."
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Du har allereie verifisiert epostadressa."
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
-msgstr "Send ein ny stadfestingsepost."
+msgstr "Stadfestingsepost sendt."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Dersom denne epostadressa er registrert, har ein epost med instruksjonar for å endra passord vorte sendt til han."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Fann ingen med det brukarnamnet."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Sender epost med instruksjonar for å endra passordet ditt."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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."
+msgstr "Kunne ikkje senda epost. Brukarnamnet ditt er inaktivt eller ikkje stadfesta."
+
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr "Brukar-ID-en er feil."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Du kan no logga inn med det nye passordet ditt."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr "Du må bekrefta eposten din før du kan tilbakestilla passordet ditt."
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Tittel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Skildring av verk"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Du kan bruka <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> til formattering."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Merkelappar"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Separer merkelappar med komma."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Nettnamn"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "Nettnamnet kan ikkje vera tomt"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Nettnamnet (adressetittel) for verket di. Trengst ikkje endrast."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Lisens"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Presentasjon"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Heimeside"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Adressa inneheld feil"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Send meg epost når andre kjem med innspel på verka mine."
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "Lisens-val"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Dette vil vera standardvalet ditt for lisens."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Send meg epost når andre kjem med innspel på verka mine."
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Tittelen kjan ikkje vera tom"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Forklaringa til denne samlinga"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "Tittel-delen av denne samlinga si adresse. Du treng normalt sett ikkje endra denne."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Gamalt passort"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Skriv inn det gamle passordet ditt for å stadfesta at du eig denne kontoen."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nytt passord"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr "Ny epostadresse"
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Passord"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr "Skriv inn passordet som prov på at dette er din konto."
+
+#: mediagoblin/edit/views.py:73
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:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Trå varsamt, du endrar nokon andre sine verk."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "La til vedlegg %s."
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Du kan berre enda din eigen profil."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Trå varsamt, du endrar nokon andre sin profil."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Lagra endring av profilen"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Lagra kontoinstellingar"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Du må stadfesta slettinga av kontoen din."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Du har allereie ei samling med namn «%s»."
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "Ei samling med den nettadressa finst allereie for denne brukaren."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Du endrar ein annan brukar si samling. Trå varsamt."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Feil passord"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "Endra passord"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr "Epostadressa di er bekrefta."
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "Cannot link theme... no theme set\n"
@@ -298,19 +328,62 @@ msgid ""
"domain."
msgstr "Finn ikkje CSRF-cookien. Dette er truleg grunna ein cookie-blokkar.<br/>\nSjå til at du tillet cookies for dette domenet."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Orsak, stør ikkje den filtypen :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr "klarte ikkje køyra unoconv, sjekk logg-fil"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Skjedde noko gale med video transkodinga"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "kom med innspel på innlegget ditt"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr "Tingar innspel frå %s."
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr "Du vil ikkje få notifikasjonar for innspel på %s."
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr "Treng oauth_token (must provide oath_token)."
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr "Noko gjekk gale :( (no request token found)."
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Brukarnamn"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Epost"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Brukarnamn eller epost"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr "Hald meg innlogga"
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Stad"
@@ -374,7 +447,7 @@ msgstr "Omdirigerings-URI-en for programmene. Denne feltet <strong>krevst</stron
msgid "This field is required for public clients"
msgstr "Dette feltet krevst for opne (public) klientar"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Klienten {0} er registrert."
@@ -387,59 +460,209 @@ msgid "Your OAuth clients"
msgstr "Dine OAuth-klientar"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Legg til"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr "Ein konto er allereie registrert til den OpenID-en."
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr "OpenID"
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr "Fann ikkje OpenID-tenaren."
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr "Ingen OpenID funne for %s."
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr "Stadfesting av %s feila: %s"
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr "Stadfesting avbrutt"
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr "Lagra OpenID-url."
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr "Kan ikkje sletta den einaste OpenID-urlen utan at du har eit passord satt."
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr "Den OpenID-en er ikkje registrert til denne kontoen."
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr "Fjerna OpenID-en."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr "Legg til OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr "Slett ein OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Slett"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr "OpenID-ar"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Logg inn"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Innlogging feila"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr "Logg inn for å oppretta ein konto"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr "Eller logg inn med passord."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr "Eller logg inn med OpenID."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr "Eller registrer med OpenID."
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr "Ein konto er allereie registrert til den Persona-eposten."
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr "Persone-eposten fjerna."
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr "Du kan ikkje sletta din einaste Persona-epostadresse utan eit passord satt."
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr "Den Persona-epostadressa er ikkje registrert til denne kontoen."
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr "Ein konto med den Persona-epostadressa finst allereie."
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr "Persone-epostadressa lagra."
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr "Fjern ei Persona-epostadresse"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr "Ny Persona-epostadresse"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr "Endra Persona-epostadressa di"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr "Eller logg inn med Persona."
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr "Eller registrer med Persona."
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Ugyldig fil for medietypen."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr "Klarte ikkje kopiera til «public storage»."
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr "Fann ingen akseptable filar for prosessering."
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Du må velja ei fil."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Johoo! Opplasta!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "La til samlinga «%s»."
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
-msgstr "Verifiser epostadressa di."
+msgstr "Stadfest epostadressa di."
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "Logg ut"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Logg inn"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "<a href=\"%(user_url)s\">%(user_name)s</a> sin konto"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Endra kontoinstellingar"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +670,16 @@ msgstr "Endra kontoinstellingar"
msgid "Media processing panel"
msgstr "Verkprosesseringspanel"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Logg ut"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Legg til verk"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Lag ny samling"
@@ -503,6 +726,59 @@ msgstr "Dei siste ti opplastningane"
msgid "No processed entries, yet!"
msgstr "Ingenting prossesert, enno."
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr "Godkjenning"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr "Godkjenn"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr "Du er innlogga som"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr "Vil du godkjenna"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr "som ukjend applikasjon"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr "å få tilgang til kontoen din?"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr "Applikasjonar med tilgang til kontoen din kan:"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr "Leggja til media som deg"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr "Sjå informasjonen din (t.d. profil, bilete, osb...)"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr "Endra informasjonen din"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr "Godkjenning ferdig"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr "Godkjenning ferdig"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr "Kopier og lim inn dette i klienten din:"
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,28 +811,24 @@ msgid ""
"a happy goblin!"
msgstr "Hei %(username)s,\n\nfor å endra MediaGoblin-passordet ditt, opna fylgjande URL i ein netlesar:\n\n <%(verification_url)s>\n\nDersom du mistenkjer dette er eit misstak, ignorer eposten og hald fram med å vera ein glad goblin!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Innlogging feila"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
-msgstr "Har du ingen konto?"
+msgstr "Manglar du konto?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
-msgstr "Lag ein!"
+msgstr "Opprett ein!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Gløymd passordet?"
#: mediagoblin/templates/mediagoblin/auth/register.html:28
#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create an account!"
-msgstr "Lag ein konto."
+msgstr "Opprett ein konto."
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Opprett"
@@ -590,7 +862,7 @@ msgstr "Lisensiert med <a href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.
msgid "Explore"
msgstr "Utforsk"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Heihei, velkomen til denne MediaGoblin-sida."
@@ -600,23 +872,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Denne sida køyrer <a href=\"http://mediagoblin.org\">MediaGoblin</a>, eit superbra program for å visa fram dine kreative verk."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Vil du leggja til eigne verk og innpel, so må du logga inn."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Har du ikkje ein enno? Det er enkelt!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Opprett ein konto på denne sida</a>\n eller\n <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set opp din eigen MediaGoblin-server</a>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr "\n>Opprett ein konto på denne sida</a>\neller"
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr "\n <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set opp din eigen MediaGoblin-server</a>"
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +907,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Endrar vedlegg for %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Vedlegg"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Legg ved vedlegg"
@@ -653,22 +930,29 @@ msgstr "Bryt av"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Lagra"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "Endrar passordet til %(username)s"
+msgid "Changing %(username)s's email"
+msgstr "Endrar eposten til %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "Lagra"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "Endrar passordet til %(username)s"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,14 +980,14 @@ msgstr "Endrar %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "Endrar kontoinnstellingane til %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "Endra passordet ditt."
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Slett kontoen min"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr "Epost"
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -715,6 +999,36 @@ msgstr "Endrar %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Endrar profilen til %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr "Hei!\n\nMe ynskjer å stadfesta at du er %(username)s. Dersom du er\nfylg denne lenkja for å stadfesta epostadressa di:\n\n%(verification_url)s\n\nDersom du ikkje er %(username)s eller ikkje ynskjer ei epost-endring kan du\nberre ignorera denne eposten."
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr "Nye innspel"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "%(formatted_time)s sidan"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr "Marker alt lese"
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,8 +1039,7 @@ msgstr "Verk merka med: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Last ned"
@@ -750,7 +1063,7 @@ msgid ""
msgstr "Du kan skaffa ein moderne netlesar som kan spela av dette lydklippet hjå <a href=\"http://opera.com/download\">http://opera.com/download</a>."
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Opphavleg fil"
@@ -759,6 +1072,10 @@ msgstr "Opphavleg fil"
msgid "WebM file (Vorbis codec)"
msgstr "WebM-fil (Vorbis-kodek)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Oppretta"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1087,39 @@ msgstr "WebM-fil (Vorbis-kodek)"
msgid "Image for %(media_title)s"
msgstr "Bilete for %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "PDF-fil"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "Slå av/på rotering"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "Perspektiv"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "Front"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "Topp"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Side"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Last ned modell"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Filformat"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Objekthøgd"
@@ -829,8 +1138,8 @@ msgid ""
msgstr "Du kan skaffa deg ein moderne netlesar som kan spela denne videoen hjå <a href=http://opera.com>http://opera.com</a> eller <a href=\"http://getfirefox.com\">http://getfirefox.com</a>."
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "WebM fil (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr "WebM-fil (VP8/Vorbis)"
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -856,11 +1165,6 @@ msgstr "%(collection_title)s av <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "Endra"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Slett"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1219,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a> sine verk"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■Ser på <a href=\"%(user_url)s\">%(username)s</a> sine verk"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Legg att innspel"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Legg til dette innspelet"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "%(formatted_time)s sidan"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr "Førehandsvisning av innspel"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Lagt til"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "Oppretta"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -974,7 +1271,7 @@ 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."
+msgstr "Treng stadfesting av epostadressa"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
@@ -991,7 +1288,7 @@ msgstr "I tilfelle det ikkje skjer:"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
-msgstr "Send ein ny epost"
+msgstr "Send ein ny stadfestingsepost"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
@@ -1096,26 +1393,34 @@ msgstr "Merka med"
msgid "Could not read the image file."
msgstr "Klarte ikkje lesa biletefila."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Oops."
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Noko gjekk gale"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr "Bad Request (noko gjekk gale)"
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr "The request sent to the server is invalid, please double check it"
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Ulovleg operasjon"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "Orsak Dave, eg kan ikkje la deg gjera det!&lt;HAL2000&gt;</p>\n<p>Du prøvde å gjera noko du ikkje har løyve til. Prøvar du å sletta alle brukarkonti no igjen?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1152,10 +1457,9 @@ msgstr "Innspel"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Du kan bruka <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> til formatterring."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr "Du kan bruka <a href=\"http://daringfireball.net/projects/markdown/basics\" target=_blank>Markdown</a> til formatterring."
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1177,77 +1481,80 @@ msgstr "-- Vel --"
msgid "Include a note"
msgstr "Legg ved eit notat"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "kom med innspel på innlegget ditt"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr "Du kan bruka <a href=\"http://daringfireball.net/projects/markdown/basics\" target=_blank>Markdown</a> til formattering."
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "Innspel er avslege"
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Vops, innspelet ditt var tomt."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Innspelet ditt er lagt til."
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Sjekk filene dine og prøv omatt."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Du må velja eller laga ei samling"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "«%s» er allereie i samling «%s»"
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "«%s» lagt til samling «%s»"
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Du sletta verket."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Sletta ikkje verket."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Du er i ferd med å sletta ein annan brukar sine verk. Trå varsamt."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Du fjerna fila frå samlinga."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "Fila var ikkje fjerna fordi du ikkje var sikker."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Du er i ferd med å fjerna ei fil frå ein annan brukar si samling. Trå varsamt."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Samlinga «%s» sletta"
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "Sletta ikkje samlinga."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Du er i ferd med å sletta ein annan brukar si samling. Trå varsamt."
diff --git a/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mo
index 8b318329..238b025c 100644
--- a/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po
index 78ab219a..cf82c6b5 100644
--- a/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/pl/LC_MESSAGES/mediagoblin.po
@@ -3,15 +3,15 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# Daniel Koć <kocio@aster.pl>, 2012
+# Daniel Koć <daniel@xn--ko-wla.pl>, 2012
# Sergiusz Pawlowicz <transifex@pawlowicz.name>, 2013
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-28 13:51+0000\n"
-"Last-Translator: Sergiusz Pawlowicz <transifex@pawlowicz.name>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/mediagoblin/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,250 +20,280 @@ msgstr ""
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Użytkownik"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Hasło"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Adres e-mail"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Niestety rejestracja w tym serwisie jest wyłączona."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Nazwa konta lub adres poczty elektronicznej"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Użytkownik lub adres e-mail"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Nieprawidłowa nazwa konta albo niewłaściwy adres poczty elektronicznej."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Niniejsze pole nie jest przeznaczone na adres poczty elektronicznej."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Niniejsze pole wymaga podania adresu poczty elektronicznej."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Niestety rejestracja w tym serwisie jest wyłączona."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Niestety użytkownik o takiej nazwie już istnieje."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Niestety użytkownik z tym adresem e-mail już istnieje."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr "Klucz kontrolny albo identyfikator użytkownika jest nieprawidłowy."
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Twój adres e-mail został zweryfikowany. Możesz się teraz zalogować, wypełnić opis swojego profilu i wysyłać grafiki!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Nieprawidłowy klucz weryfikacji lub identyfikator użytkownika."
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Musisz się zalogować żebyśmy wiedzieli do kogo wysłać e-mail!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Twój adres e-mail już został zweryfikowany!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Wyślij ponownie e-mail weryfikujący."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Jeśli ten adres poczty elektronicznej istnieje (uwzględniając wielkość liter!), wysłano na niego list z instrukcją, w jaki sposób możesz zmienić swoje hasło."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Nie potrafię znaleźć nikogo o tej nazwie użytkownika."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Wysłano e-mail z instrukcjami jak zmienić hasło."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "Nie udało się wysłać e-maila w celu odzyskania hasła, ponieważ twoje konto jest nieaktywne lub twój adres e-mail nie został zweryfikowany."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr "Identyfikator użytkownika nie jest prawidłowy."
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Teraz możesz się zalogować używając nowego hasła."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr "Zanim będziesz mógł ponownie ustawić hasło, musisz potwierdzić swój adres poczty elektronicznej."
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Tytuł"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Opis tej pracy"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Możesz formatować tekst za pomocą składni \n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a>."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Znaczniki"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Rozdzielaj znaczniki przecinkami."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Slug"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "Slug nie może być pusty"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Fragment adresu mediów zawierający tytuł. Zwykle nie ma potrzeby aby go zmieniać."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Licencja"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Biogram"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Strona internetowa"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Ten adres zawiera błędy"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Powiadamiaj mnie e-mailem o komentarzach do moich mediów"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "Ulubiona licencja"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "To będzie twoja domyślna licencja dla wgrywanych mediów."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Powiadamiaj mnie e-mailem o komentarzach do moich mediów"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Tytuł nie może być pusty"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Opis tej kolekcji"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "Część adresu zawierająca tytuł. Zwykle nie musisz tego zmieniać."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Stare hasło"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Wprowadź swoje stare hasło aby udowodnić, że to twoje konto."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nowe hasło"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr "Nowy adres poczty elektronicznej"
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Hasło"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "Adres z tym slugiem dla tego użytkownika już istnieje."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Edytujesz media innego użytkownika. Zachowaj ostrożność."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Dodałeś załącznik %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Masz możliwość edycji tylko własnego profilu."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Edytujesz profil innego użytkownika. Zachowaj ostrożność."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Zapisano zmiany profilu"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Zapisano ustawienia konta"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Musisz potwierdzić, że chcesz skasować swoje konto."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Kolekcja \"%s\" już istnieje!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "Kolekcja tego użytkownika z takim slugiem już istnieje."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Edytujesz kolekcję innego użytkownika. Zachowaj ostrożność."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Nieprawidłowe hasło"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "Twoje hasło zostało zmienione"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr "Twój adres poczty elektronicznej został potwierdzony."
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "Nie można podlinkować motywu... nie wybrano motywu\n"
@@ -298,19 +328,62 @@ msgid ""
"domain."
msgstr "Ciasteczko CSFR nie jest dostępne. Najprawdopodobniej stosujesz jakąś formę blokowania ciasteczek.<br/>Upewnij się, że nasz serwer może zakładać ciasteczka w twojej przeglądarce."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "NIestety, nie obsługujemy tego typu plików :-("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr "nie dało się uruchomić unoconv, sprawdź log"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Konwersja wideo nie powiodła się"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "komentarze do twojego wpisu"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr "Musisz podać oauth_token."
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Użytkownik"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Adres e-mail"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Nazwa konta lub adres poczty elektronicznej"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr "Pozostań zalogowany"
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Położenie"
@@ -374,7 +447,7 @@ msgstr "Przekierowanie URI dla aplikacji, to pole\n jest <strong>wyma
msgid "This field is required for public clients"
msgstr "To pole jest wymagane dla klientów publicznych"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Klient {0} został zarejestrowany!"
@@ -387,59 +460,209 @@ msgid "Your OAuth clients"
msgstr "Twoi klienci OAuth"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Dodaj"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr "OpenID"
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr "Przepraszamy, serwer OpenID nie został znaleziony"
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr "Potwierdzenie anulowane"
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr "Konto OpenID zostało pomyślnie usunięte."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr "Dodaj konto OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr "Usuń konto OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Usuń"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Zaloguj siÄ™"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Logowanie nie powiodło się!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr "Zaloguj się, aby utworzyć konto!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr "Albo zaloguj się hasłem!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr "Albo zaloguj siÄ™ kontem OpenID!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Niewłaściwy plik dla tego rodzaju mediów."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Plik"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Musisz podać plik."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Hura! Wysłano!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "Kolekcja \"%s\" została dodana!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Zweryfikuj swój adres e-mail!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "wyloguj siÄ™"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Zaloguj siÄ™"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "konto <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Zmień ustawienia konta"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +670,16 @@ msgstr "Zmień ustawienia konta"
msgid "Media processing panel"
msgstr "Panel przetwarzania mediów"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Wyloguj siÄ™"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Dodaj media"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Utwórz nową kolekcję"
@@ -503,6 +726,59 @@ msgstr "Ostatnie 10 udanych wysyłek"
msgid "No processed entries, yet!"
msgstr "Na razie nie przetworzono żadnego wpisu!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr "JesteÅ› zalogowany jako"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr "Zobacz swoje dane (np. profil, media, itp.)"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr "Skopiuj i wklej to do swojego klienta:"
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,19 +811,15 @@ msgid ""
"a happy goblin!"
msgstr "Cześć %(username)s,\n\naby zmienić twoje hasło dla GNU MediaGoblin, otwórz następującą stronę w swojej przeglądarce:\n\n%(verification_url)s\n\nJeśli sądzisz, że to pomyłka, po prostu zignoruj tę wiadomość i bądź nadal szczęśliwym goblinem!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Logowanie nie powiodło się!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Nie masz jeszcze konta?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Utwórz je tutaj!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Zapomniałeś hasła?"
@@ -556,7 +828,7 @@ msgstr "Zapomniałeś hasła?"
msgid "Create an account!"
msgstr "Utwórz konto!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Utwórz"
@@ -590,7 +862,7 @@ msgstr "Opublikowane na licencji <a href=\"http://www.fsf.org/licensing/licenses
msgid "Explore"
msgstr "Odkrywaj"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Cześć, witaj na stronie MediaGoblin!"
@@ -600,23 +872,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Ten serwis działa w oparciu o <a href=\"http://mediagoblin.org\">MediaGoblin</a>, świetne oprogramowanie do publikowania mediów."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Aby dodawać swoje pliki, komentować i wykonywać inne czynności, możesz się zalogować na swoje konto MediaGoblin."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Jeszcze go nie masz? To proste!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Załóż konto na tym serwerze</a>\n albo\n <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Uruchom MediaGoblin na swoim własnym serwerze</a>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +907,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Edycja załączników do %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Załączniki"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Dodaj załącznik"
@@ -653,22 +930,29 @@ msgstr "Anuluj"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Zapisz zmiany"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "Zmieniam hasło użytkownika %(username)s"
+msgid "Changing %(username)s's email"
+msgstr "Zmieniam konto poczty elektronicznej dla %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "Zachowaj"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "Zmieniam hasło użytkownika %(username)s"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,14 +980,14 @@ msgstr "Edytowanie %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "Zmiana ustawień konta %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "Zmień swoje hasło."
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Usuń moje konto"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr "Adres poczty elektronicznej"
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -715,6 +999,36 @@ msgstr "Edycja %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Edycja profilu %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr "Nowe komentarze"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "%(formatted_time)s temu"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr "Oznacz wszystkie jako przeczytane"
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,8 +1039,7 @@ msgstr "Media ze znacznikami: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Pobierz"
@@ -750,7 +1063,7 @@ msgid ""
msgstr "Proszę pobrać przeglądarkę, która obsługuje \n\tdźwięk w HTML5, pod adresem <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Oryginalny plik"
@@ -759,6 +1072,10 @@ msgstr "Oryginalny plik"
msgid "WebM file (Vorbis codec)"
msgstr "plik WebM (kodek Vorbis)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Utworzono"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1087,39 @@ msgstr "plik WebM (kodek Vorbis)"
msgid "Image for %(media_title)s"
msgstr "Grafika dla %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "Plik PDF"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "Obróć"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "Perspektywa"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "PoczÄ…tek"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "Góra"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Krawędź"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Pobierz model"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Format pliku"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Wysokość obiektu"
@@ -829,8 +1138,8 @@ msgid ""
msgstr "Możesz pobrać porządną przeglądarkę, która jest w stanie odtworzyć ten materiał filmowy, ze strony <a href=\"http://getfirefox.com/\">⎠http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "plik WebM (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr "Plik WebM (VP8/Vorbis)"
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -856,11 +1165,6 @@ msgstr "%(collection_title)s użytkownika <a href=\"%(user_url)s\">%(username)s<
msgid "Edit"
msgstr "Edytuj"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Usuń"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1219,22 @@ msgstr "media użytkownika <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■Przeglądanie mediów użytkownika <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Dodaj komentarz"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Dodaj komentarz"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "%(formatted_time)s temu"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr "PodglÄ…d komentarza"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Dodano"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "Utworzono"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1096,26 +1393,34 @@ msgstr "Znaczniki:"
msgid "Could not read the image file."
msgstr "Nie udało się odczytać pliku grafiki."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Ups!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Wystąpił błąd"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr "Niewłaściwe żądanie"
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Operacja niedozwolona"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "Misiaczku, nie możesz tego uczynić!</p><p>Próbowałeś wykonać działanie, do którego nie masz uprawnień. Czy naprawdę chciałeś skasować znowu wszystkie konta?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1152,10 +1457,9 @@ msgstr "Komentarz"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Możesz formatować przy pomocy składni <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a>."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1177,77 +1481,80 @@ msgstr "-- wybierz --"
msgid "Include a note"
msgstr "Dodaj notatkÄ™"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "komentarze do twojego wpisu"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "Komentowanie jest wyłączone."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Ups, twój komentarz nie zawierał treści."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Twój komentarz został opublikowany!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Sprawdź swoje wpisy i spróbuj ponownie."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Musisz wybrać lub dodać kolekcję"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" już obecne w kolekcji \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" dodano do kolekcji \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Media zostały usunięte."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Media nie zostały usunięte ponieważ nie potwierdziłeś, że jesteś pewien."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Za chwilę usuniesz media innego użytkownika. Zachowaj ostrożność."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Element został usunięty z kolekcji."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "Ten element nie został usunięty, ponieważ nie zaznaczono, że jesteś pewien."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Zamierzasz usunąć element z kolekcji innego użytkownika. Zachowaj ostrożność."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Usunięto kolekcję \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "Ta kolekcja nie została usunięta, ponieważ nie zaznaczono, że jesteś pewien."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Zamierzasz usunąć kolekcję innego użytkownika. Zachowaj ostrożność."
diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
index 5e83a7f2..72cae0d0 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 fecb844c..ca18fd9f 100644
--- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
@@ -7,13 +7,14 @@
# Rafael Ferreira <rafael.f.f1@gmail.com>, 2013
# osc <snd.noise@gmail.com>, 2011
# ufa <ufa@technotroll.org>, 2011
-# Canopus <viniciussm@rocketmail.com>, 2013
+# Canopus, 2013
+# Canopus, 2013
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/mediagoblin/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
@@ -23,249 +24,279 @@ msgstr ""
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Nome de Usuário"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Senha"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Endereço de email"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Desculpa, o registro está desativado neste momento."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Nome de usuário ou email"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Nome de usuário ou email inválido."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Este campo não aceita endereços de email."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Este campo requer um endereço de email."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Desculpa, o registro está desativado neste momento."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Desculpe, um usuário com este nome já existe."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Desculpe, um usuário com esse email já está cadastrado"
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
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:188
+#: mediagoblin/auth/views.py:167
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:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Você precisa entrar primeiro para sabermos para quem mandar o email!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Você já verificou seu email!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "O email de verificação foi enviado novamente."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Se esse endereço de email (sensível a maiúsculo/minúsculo!) estiver registrado, um email será enviado com instruções para alterar sua senha."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Não foi possível encontrar alguém com esse nome de usuário."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Um email foi enviado com instruções para trocar sua senha."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Agora você pode entrar usando sua nova senha."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr "Você precisa verificar seu email antes de trocar sua senha."
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Título"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Descrição desse trabalho"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Você pode usar\n<a href=\"http://daringfireball.net/projects/markdown/basics\">\nMarkdown</a> para formatação."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Etiquetas"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Separe as etiquetas com vírgulas."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Arquivo"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "O arquivo não pode estar vazio"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "A parte do título do endereço dessa mídia. Geralmente você não precisa mudar isso."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Licença"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Biografia"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Website"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Este endereço contém erros"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Me enviar um email quando outras pessoas comentarem em minhas mídias"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "Licença preferida"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Esta será sua licença padrão nos formulários de envio."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Me enviar um email quando outras pessoas comentarem em minhas mídias"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "O título não pode ficar vazio"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Descrição desta coleção"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "A parte do título do endereço dessa coleção. Geralmente você não precisa mudar isso."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Senha antiga"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Digite sua senha antiga para provar que esta conta é sua."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nova senha"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr "Novo endereço de email"
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Senha"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr "Digite sua senha para provar que esta conta é sua."
+
+#: mediagoblin/edit/views.py:73
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:91
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:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Você adicionou o anexo %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Você só pode editar o seu próprio perfil."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Você está editando um perfil de usuário. Tenha cuidado."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "As mudanças no perfil foram salvas"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "As mudanças na conta foram salvas"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Você precisa confirmar a exclusão da sua conta."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Você já tem uma coleção chamada \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "Já existe uma coleção com este arquivo para este usuário."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Você está editando a coleção de um outro usuário. Prossiga com cuidado."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Senha errada"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
-msgstr ""
+msgstr "Sua senha foi alterada com sucesso."
+
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr "Seu endereço de email foi verificado."
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
@@ -287,7 +318,7 @@ msgstr ""
#: mediagoblin/gmg_commands/assetlink.py:119
#, python-format
msgid "Skipping \"%s\"; already set up.\n"
-msgstr ""
+msgstr "Pulando \"%s\"; já configurado.\n"
#: mediagoblin/gmg_commands/assetlink.py:124
#, python-format
@@ -301,19 +332,62 @@ msgid ""
"domain."
msgstr "Cookie CSFR não está presente. Isso é provavelmente o resultado de um bloqueador de cookies ou algo do tipo.<br/>Tenha certeza de autorizar este domínio a configurar cookies."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Desculpe, não tenho suporte a este tipo de arquivo :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Conversão do vídeo falhou"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "comentou na sua publicação"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr "Você não irá receber notificações sobre comentários em %s."
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Nome de Usuário"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Endereço de email"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Nome de usuário ou email"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr "Mantenha-me Conectado"
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Localização"
@@ -377,7 +451,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr "Este campo é necessário para clientes públicos"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "O cliente {0} foi registrado!"
@@ -390,59 +464,209 @@ msgid "Your OAuth clients"
msgstr "Seus clientes OAuth"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Adicionar"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr "Desculpe, já existe uma conta associada a esse OpenID."
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr "OpenID"
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr "Desculpe, o servidor OpenID não pôde ser encontrado"
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr "Nenhum serviço OpenID encontrado para %s"
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr "Verificação de %s falhou: %s"
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr "Verificação cancelada"
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr "O endereço do seu OpenID foi salvo com sucesso."
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr "Esse OpenID não está associado a esta conta."
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr "OpenID removido com sucesso."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr "Adicionar um OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr "Deletar um OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Apagar"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Entrar"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Autenticação falhou"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr "Entre para criar uma conta!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr "Ou entre com uma senha!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr "Ou entre com OpenID!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr "Ou registre com OpenID!"
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr "Ou entre com Persona!"
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr "Ou registre com Persona!"
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Arquivo inválido para esse tipo de mídia"
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr "Falha ao copiar para armazenamento público."
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Arquivo"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Você deve fornecer um arquivo."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Eba! Enviado!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "Coleção \"%s\" adicionada!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Verifique seu email!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "sair"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Entrar"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "Conta de <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Mudar configurações da conta"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -450,16 +674,16 @@ msgstr "Mudar configurações da conta"
msgid "Media processing panel"
msgstr "Painel de processamento de mídia"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Sair"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Adicionar mídia"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Criar nova coleção"
@@ -506,6 +730,59 @@ msgstr "Últimos 10 envios bem sucedidos"
msgid "No processed entries, yet!"
msgstr "Ainda não há entradas processadas!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr "Autorização"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr "Autorizar"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr "Você está conectado como"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr "Você quer autorizar"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr "um aplicativo desconhecido"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr "para acessar sua conta?"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr "Aplicativos com acesso à sua conta podem:"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr "Alterar suas informações"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr "Autorização Finalizada"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr "Autorização Concluída"
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr "Copie e cole isto no seu cliente:"
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -538,19 +815,15 @@ msgid ""
"a happy goblin!"
msgstr "Olá %(username)s,\n\npara alterar sua senha do GNU MediaGoblin, abra a seguinte URL\nno seu navegador web:\n\n%(verification_url)s\n\nSe você acha que isso é um erro, desconsidere esse email e continue sendo um goblin feliz"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Autenticação falhou"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Ainda não tem conta?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Crie uma aqui!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Esqueceu sua senha?"
@@ -559,7 +832,7 @@ msgstr "Esqueceu sua senha?"
msgid "Create an account!"
msgstr "Criar uma conta!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Criar"
@@ -593,7 +866,7 @@ msgstr "Lançado sob a <a href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.
msgid "Explore"
msgstr "Explorar"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Olá, bem-vindo a este site MediaGoblin."
@@ -603,23 +876,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Este site roda o <a href=\"http://mediagoblin.org\">MediaGoblin</a>, um programa excelente para hospedar, gerenciar e compartilhar mídia."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Para adicionar sua própria mídia, publicar comentários e mais outras coisas, você pode entrar com sua conta MediaGoblin."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr " Ainda não tem uma conta? É facil!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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 ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr "\n>Crie uma conta neste site</a>\nou"
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr "\n<a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Configure MediaGoblin em seu próprio servidor</a>"
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -633,13 +911,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Editando os anexos de %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Anexos"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Adicionar anexo"
@@ -656,21 +934,28 @@ msgstr "Cancelar"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Salvar mudanças"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr ""
+msgid "Changing %(username)s's email"
+msgstr "Alterando email de %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
-msgstr ""
+msgstr "Salvar"
+
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "Alterando a senha de %(username)s"
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
@@ -699,14 +984,14 @@ msgstr "Editando %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "Alterando as configurações da conta de %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Deletar minha conta"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr "Email"
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -718,6 +1003,36 @@ msgstr "Editando %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Editando perfil de %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr "Olá,\n\nNós queríamos verificar que você é %(username)s. Se for esse o caso, então por favor clique no link abaixo para verificar seu novo endereço de email.\n\n%(verification_url)s\n\nSe você não for %(username)s ou se não fez um pedido de alteração do endereço de email, você pode ignorar\nesta mensagem."
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr "Novos comentários"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "%(formatted_time)s"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr "Marcar tudo como lido"
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -728,8 +1043,7 @@ msgstr "Etiquetas desta mídia: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Baixar"
@@ -753,7 +1067,7 @@ msgid ""
msgstr "Você pode obter um navegador moderno\n »capaz de reproduzir o áudio em <a href=\"http://getfirefox.com\">\n » http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Arquivo original"
@@ -762,6 +1076,10 @@ msgstr "Arquivo original"
msgid "WebM file (Vorbis codec)"
msgstr "Arquivo WebM (codec Vorbis)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Criado"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -773,47 +1091,39 @@ msgstr "Arquivo WebM (codec Vorbis)"
msgid "Image for %(media_title)s"
msgstr "Imagem para %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
-msgstr ""
+msgstr "Arquivo PDF"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "Alternar Rotação"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "Perspectiva"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "Frente"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "Cima"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Lado"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Baixar o modelo"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Formato de Arquivo"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Altura do Objeto"
@@ -832,8 +1142,8 @@ msgid ""
msgstr "Você pode obter um navegador moderno\n capaz de reproduzir este vídeo em <a href=\"http://getfirefox.com\">\n http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "Arquivo WebM (640p, VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr "Arquivo WebM (VP8/Vorbis)"
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -859,11 +1169,6 @@ msgstr "%(collection_title)s de <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "Editar"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Apagar"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -918,28 +1223,21 @@ msgstr "Mídia de <a href=\"%(user_url)s\"> %(username)s </a> "
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■Vendo mídia de <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Adicionar um comentário"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Adicionar este comentário"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
+msgstr "Adicionado há"
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
@@ -1049,7 +1347,7 @@ msgstr "(apagar)"
#: mediagoblin/templates/mediagoblin/utils/collections.html:21
msgid "Collected in"
-msgstr ""
+msgstr "Colecionado em"
#: mediagoblin/templates/mediagoblin/utils/collections.html:40
msgid "Add to a collection"
@@ -1099,26 +1397,34 @@ msgstr "Etiquetas"
msgid "Could not read the image file."
msgstr "Não foi possível ler o arquivo de imagem."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Oops"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Um erro ocorreu"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Operação não permitida"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "Me desculpe Dave, não posso deixar você fazer isso!</p><p>Você tentou executar uma função sem autorização. Por acaso estava novamente tentando deletar todas as contas de usuários?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1127,27 +1433,27 @@ msgstr "Parece que não há uma página com este endereço. Desculpe!</p><p>Se v
#: mediagoblin/tools/timesince.py:62
msgid "year"
-msgstr ""
+msgstr "ano"
#: mediagoblin/tools/timesince.py:63
msgid "month"
-msgstr ""
+msgstr "mês"
#: mediagoblin/tools/timesince.py:64
msgid "week"
-msgstr ""
+msgstr "semana"
#: mediagoblin/tools/timesince.py:65
msgid "day"
-msgstr ""
+msgstr "dia"
#: mediagoblin/tools/timesince.py:66
msgid "hour"
-msgstr ""
+msgstr "hora"
#: mediagoblin/tools/timesince.py:67
msgid "minute"
-msgstr ""
+msgstr "minuto"
#: mediagoblin/user_pages/forms.py:23
msgid "Comment"
@@ -1155,10 +1461,9 @@ msgstr "Comentário"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Você pode usar <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> para formatação."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr "Você pode usar <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">Markdown</a> para formatação."
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1180,77 +1485,80 @@ msgstr "-- Selecionar --"
msgid "Include a note"
msgstr "Incluir uma nota"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "comentou na sua publicação"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr "Você pode usar\n<a href=\"http://daringfireball.net/projects/markdown/basics\">\nMarkdown</a> para formatação de texto."
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
-msgstr ""
+msgstr "Desculpe, os comentários estão desabilitados."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Ops, seu comentário estava vazio."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Seu comentário foi postado!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Por favor, verifique suas entradas e tente novamente."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Você deve selecionar ou adicionar uma coleção"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" já está na coleção \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" adicionado à coleção \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Você deletou a mídia."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "A mídia não foi apagada porque você não marcou que tinha certeza."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
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."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Você deletou o item da coleção."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "O item não foi apagado porque você não marcou que tinha certeza."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Você está prestes a remover um item da coleção de um outro usuário. Prossiga com cuidado."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Você deletou a coleção \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "A coleção não foi apagada porque você não marcou que tinha certeza."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Você está prestes a deletar a coleção de um outro usuário. Prossiga com cuidado."
diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
index 8cfdf339..32504b9a 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 af2d94d6..00edc228 100644
--- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 20:40+0000\n"
-"Last-Translator: George Pop <gapop@hotmail.com>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Romanian (http://www.transifex.com/projects/p/mediagoblin/language/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,250 +20,280 @@ 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:26
-msgid "Username"
-msgstr "Nume de utilizator"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Parolă"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Adresa de e-mail"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Ne pare rău, dar înscrierile sunt dezactivate pe acest server."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Numele de utilizator sau adresa de e-mail"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Numele de utilizator sau adresa de e-mail"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Nume de utilizator sau adresă de e-mail nevalidă."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Această rubrică nu este pentru adrese de e-mail."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Această rubrică trebuie completată cu o adresă de e-mail."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Ne pare rău, dar înscrierile sunt dezactivate pe acest server."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
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:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
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:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
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 verificată. Poți să te autentifici, să îți completezi profilul și să trimiți imagini!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Cheie de verificare sau user ID incorect."
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
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:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Adresa ta de e-mail a fost deja verificată!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "E-mail-ul de verificare a fost retrimis."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Dacă adresa de e-mail este în baza noastră de date, atunci se va trimite imediat un mesaj cu instrucțiuni pentru schimbarea parolei. Țineți cont de litere mari / litere mici la introducerea adresei!"
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Nu există nimeni cu acest nume de utilizator."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "S-a trimis un e-mail cu instrucțiuni pentru schimbarea parolei."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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 verificată."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Acum te poți autentifica cu noua parolă."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titlu"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Descrierea acestui fișier"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Poți folosi\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> pentru formatare."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Cuvinte-cheie"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Desparte cuvintele-cheie prin virgulă."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Identificator"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "Identificatorul nu poate să lipsească"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Partea corespunzătoare titlului din adresa acestui fișier media. De regulă poate fi lăsată nemodificată."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Licența"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Biografie"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Sit Web"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Această adresă prezintă erori"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Trimite-mi un e-mail când alții comentează fișierele mele"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "Licența preferată"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Aceasta va fi licența implicită pe formularele de upload."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Trimite-mi un e-mail când alții comentează fișierele mele"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Titlul nu poate să fie gol"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Descriere pentru această colecție"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "Partea din adresa acestei colecții care corespunde titlului. De regulă nu e necesar să faci o modificare."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Vechea parolă"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Introdu vechea parolă pentru a demonstra că ești titularul acestui cont."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Noua parolă"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Parolă"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
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:91
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:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Ai anexat %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Nu poți modifica decât propriul tău profil."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Editezi profilul unui utilizator. Se recomandă prudență."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Modificările profilului au fost salvate"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Setările pentru acest cont au fost salvate"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Trebuie să confirmi ștergerea contului tău."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Ai deja o colecție numită \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "O colecție cu același slug există deja pentru acest utilizator."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Lucrezi pe colecția unui alt utilizator. Se recomandă prudență."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Parolă incorectă"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "Parola a fost schimbată cu succes"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "Tema nu poate fi atașată... nu există o temă selectată\n"
@@ -298,19 +328,62 @@ msgid ""
"domain."
msgstr "Lipsește cookie-ul CSRF. Probabil că blocați cookie-urile.<br/>Asigurați-vă că există permisiunea setării cookie-urilor pentru acest domeniu."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Scuze, nu recunosc acest tip de fișier :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr "unoconv nu poate fi executat; verificați log-ul"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Transcodarea video a eșuat"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "a făcut un comentariu la postarea ta"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Nume de utilizator"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Adresa de e-mail"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Numele de utilizator sau adresa de e-mail"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Locul"
@@ -374,7 +447,7 @@ msgstr "URI-ul de redirectare pentru aplicații, această rubrică\n
msgid "This field is required for public clients"
msgstr "Această rubrică este obligatorie pentru clienții publici"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Clientul {0} a fost înregistrat!"
@@ -387,59 +460,209 @@ msgid "Your OAuth clients"
msgstr "Clienții tăi OAuth"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Adaugă"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Șterge"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Autentificare"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Autentificare eșuată!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Formatul fișierului nu corespunde cu tipul de media selectat."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Fișier"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Trebuie să selectezi un fișier."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Ura! Trimis!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "Colecția \"%s\" a fost creată!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Verifică adresa de e-mail!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "Ieșire"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Autentificare"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "Contul lui <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Modifică setările contului"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +670,16 @@ msgstr "Modifică setările contului"
msgid "Media processing panel"
msgstr "Panou de procesare media"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Ieșire"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Trimite fișier"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Creează colecție nouă"
@@ -503,6 +726,59 @@ msgstr "Ultimele 10 upload-uri reușite"
msgid "No processed entries, yet!"
msgstr "Nu există încă niciun entry procesat!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,19 +811,15 @@ msgid ""
"a happy goblin!"
msgstr "Bună, %(username)s\n\nPentru a schimba parola ta la GNU MediaGoblin, accesează adresa următoare:\n\n%(verification_url)s\n\nDacă ai primit acest mesaj din greșeală, ignoră-l și fii mai departe un goblin fericit!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Autentificare eșuată!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Nu ai un cont?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Creează-l aici!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Ai uitat parola?"
@@ -556,7 +828,7 @@ msgstr "Ai uitat parola?"
msgid "Create an account!"
msgstr "Creează un cont!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Creează"
@@ -590,7 +862,7 @@ msgstr "Publicat sub licența <a href=\"http://www.fsf.org/licensing/licenses/ag
msgid "Explore"
msgstr "Explorează"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Salut, bine ai venit pe acest site MediaGoblin!"
@@ -600,23 +872,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Acest site folosește <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un software excepțional pentru găzduirea fișierelor media."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Pentru a adăuga fișierele tale și pentru a comenta te poți autentifica cu contul tău MediaGoblin."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Încă nu ai unul? E simplu!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">Creați un cont pe acest site</a>\n sau\n <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Instalați MediaGoblin pe serverul dvs.</a>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +907,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Editare anexe la %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Anexe"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Atașează"
@@ -653,22 +930,29 @@ msgstr "Anulare"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Salvează modificările"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "Se modifică parola pentru %(username)s"
+msgid "Changing %(username)s's email"
+msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "Salvează"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "Se modifică parola pentru %(username)s"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,14 +980,14 @@ msgstr "Editare %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "Se modifică setările contului pentru userul %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "Modifică parolă."
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Șterge contul meu"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -715,6 +999,36 @@ msgstr "Editare %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Editare profil %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "în urmă cu %(formatted_time)s"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,8 +1039,7 @@ msgstr "Fișier etichetat cu cuvintele-cheie: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Download"
@@ -750,7 +1063,7 @@ msgid ""
msgstr "Poți lua un browser modern \n\tcapabil să redea această înregistrare de la <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Fișierul original"
@@ -759,6 +1072,10 @@ msgstr "Fișierul original"
msgid "WebM file (Vorbis codec)"
msgstr "Fișier WebM (codec Vorbis)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Creat"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1087,39 @@ msgstr "Fișier WebM (codec Vorbis)"
msgid "Image for %(media_title)s"
msgstr "Imagine pentru %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "Fișier PDF"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "Rotire"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "Perspectivă"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "Din față"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "De sus"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Lateral"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Descarcă modelul"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Formatul fișierului"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Înălțimea obiectului"
@@ -829,8 +1138,8 @@ msgid ""
msgstr "Puteți obține un browser Web modern care poate reda această înregistrare de la <a href=\"http://getfirefox.com\">http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "Fișier WebM (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -856,11 +1165,6 @@ msgstr "%(collection_title)s de <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "Editare"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Șterge"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1219,22 @@ msgstr "Fișierele media ale lui <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "<p>■Fișierele media ale lui <a href=\"%(user_url)s\">%(username)s</a></p>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Adaugă un comentariu"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Trimite acest comentariu"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "în urmă cu %(formatted_time)s"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Adăugat"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "Creat"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1096,26 +1393,34 @@ msgstr "Etichetat cu cuvintele-cheie"
msgid "Could not read the image file."
msgstr "Fișierul cu imaginea nu a putut fi citit."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Hopa!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "S-a produs o eroare"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Operația nu este permisă"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "Îmi pare rău, Dave, nu te pot lăsa să faci asta!</p><p>Ai încercat să faci o operație nepermisă. Ai încercat iar să ștergi toate conturile utilizatorilor?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1152,10 +1457,9 @@ msgstr "Comentariu"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Poți folosi <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> pentru formatare."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1177,77 +1481,80 @@ msgstr "-- Selectează --"
msgid "Include a note"
msgstr "Adaugă o notiță"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "a făcut un comentariu la postarea ta"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "Comentariile sunt dezactivate."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Hopa, ai uitat să scrii comentariul."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Comentariul tău a fost trimis!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Verifică datele și încearcă din nou."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Trebuie să alegi sau să creezi o colecție"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" este deja în colecția \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" a fost adăugat la colecția \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Ai șters acest fișier"
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
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:296
+#: mediagoblin/user_pages/views.py:321
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ă prudență."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Ai șters acest articol din colecție."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "Articolul nu a fost șters pentru că nu ai confirmat că ești sigur(ă)."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Urmează să ștergi un articol din colecția unui alt utilizator. Se recomandă prudență."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Ai șters colecția \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "Colecția nu a fost ștearsă pentru că nu ai confirmat că ești sigur(ă)."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Urmează să ștergi colecția unui alt utilizator. Se recomandă prudență."
diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
index ed28ff43..8c537cc3 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 d0ff7bdd..a1c0e1d8 100644
--- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
@@ -5,13 +5,14 @@
# Translators:
# aleksejrs <deletesoftware@yandex.ru>, 2013
# aleksejrs <deletesoftware@yandex.ru>, 2011-2012
+# Yury Sakarinen, 2013
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-06-01 21:08+0000\n"
-"Last-Translator: aleksejrs <deletesoftware@yandex.ru>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/mediagoblin/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,250 +21,280 @@ 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:26
-msgid "Username"
-msgstr "Логин"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Пароль"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Извините, на Ñтом Ñайте региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð°."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
-msgstr ""
+msgstr "Ðеправильное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ñлектронной почты."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Это поле не Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Это поле — Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Извините, на Ñтом Ñайте региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð°."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Извините, пользователь Ñ Ñтим именем уже зарегиÑтрирован."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Сожалеем, но на Ñтот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты уже зарегиÑтрирована Ð´Ñ€ÑƒÐ³Ð°Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты потвержден. Ð’Ñ‹ теперь можете войти и начать редактировать Ñвой профиль и загружать новые изображениÑ!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Ðеверный ключ проверки или идентификатор пользователÑ"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Вам надо предÑтавитьÑÑ, чтобы мы знали, кому отправлÑть Ñообщение!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Ð’Ñ‹ уже потвердили Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
-msgstr "ПереÑлать Ñообщение Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ аккаунта."
+msgstr "Отправить заново Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подтверждение по е-мÑйл."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "ЕÑли Ñ Ñтим адреÑом Ñлектронной почты (Ñравниваемым чувÑтвительно к региÑтру Ñимволов!) еÑть ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, то на него отправлено Ñообщение Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñми о том, как Ñменить пароль."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Ðе найдено никого Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем пользователÑ."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Вам отправлено Ñлектронное пиÑьмо Ñ Ð¸Ð½ÑтрукциÑми по Ñмене паролÑ."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¾ неверно."
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Теперь вы можете войти, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ð°Ñˆ новый пароль."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Ðазвание"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "ОпиÑание Ñтого произведениÑ"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Ð”Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‚ÐºÐ¸ можете иÑпользовать Ñзык\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a>."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Метки"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "(через запÑтую)"
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñть адреÑа"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñть адреÑа необходима"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "ЧаÑть адреÑа Ñтого файла, Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð½Ð°Ñ Ð¾Ñ‚ его названиÑ. Её обычно не требуетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñть."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "ЛицензиÑ"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "БиографиÑ"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Сайт"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Этот Ð°Ð´Ñ€ÐµÑ Ñодержит ошибки"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "УведомлÑть Ð¼ÐµÐ½Ñ Ð¿Ð¾ e-mail о комментариÑÑ… к моим файлам"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "ÐŸÑ€ÐµÐ´Ð¿Ð¾Ñ‡Ð¸Ñ‚Ð°ÐµÐ¼Ð°Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Она будет лицензией по умолчанию Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… загрузок"
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "УведомлÑть Ð¼ÐµÐ½Ñ Ð¿Ð¾ e-mail о комментариÑÑ… к моим файлам"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Ðазвание не может быть пуÑтым"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "ОпиÑание Ñтой коллекции"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñть адреÑа Ñтой коллекции, оÑÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð° названии. Обычно не нужно её изменÑть."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Старый пароль"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Введите Ñвой Ñтарый пароль в качеÑтве доказательÑтва, что Ñто ваша ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Ðовый пароль"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr "Ðовый Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Пароль"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr "Введите Ñвой пароль в качеÑтве доказательÑтва, что Ñто ваша ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ."
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "У Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ¶Ðµ еÑть файл Ñ Ñ‚Ð°ÐºÐ¾Ð¹ отличительной чаÑтью адреÑа."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Ð’Ñ‹ редактируете файлы другого пользователÑ. Будьте оÑторожны."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Ð’Ñ‹ добавили ÑопутÑтвующий файл %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Ð’Ñ‹ можете редактировать только Ñвой ÑобÑтвенный профиль."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Ð’Ñ‹ редактируете профиль пользователÑ. Будьте оÑторожны."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ñохранены"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "ÐаÑтройки учётной запиÑи запиÑаны"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Вам нужно подтвердить, что вы хотите удалить Ñвою учётную запиÑÑŒ."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "У Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑть ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ «%s»!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "У Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ¶Ðµ еÑть ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ñ Ñ‚Ð°ÐºÐ¾Ð¹ отличительной чаÑтью адреÑа."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Ð’Ñ‹ редактируете коллекцию другого пользователÑ. Будьте оÑторожны."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Ðеправильный пароль"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "Ваш пароль Ñменён уÑпешно"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "Ðевозможно привÑзать тему… не выбрано ÑущеÑтвующей темы\n"
@@ -298,19 +329,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Увы, Ñ Ð½Ðµ поддерживаю Ñтот тип файлов :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Перекодировка видео не удалаÑÑŒ"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "оÑтавил комментарий к вашему файлу"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Ðа карте"
@@ -322,15 +396,15 @@ msgstr "ПоÑмотреть на <a href=\"%(osm_url)s\">OpenStreetMap</a>"
#: mediagoblin/plugins/oauth/forms.py:29
msgid "Allow"
-msgstr ""
+msgstr "Разрешить"
#: mediagoblin/plugins/oauth/forms.py:30
msgid "Deny"
-msgstr ""
+msgstr "Запретить"
#: mediagoblin/plugins/oauth/forms.py:34
msgid "Name"
-msgstr ""
+msgstr "ИмÑ"
#: mediagoblin/plugins/oauth/forms.py:35
msgid "The name of the OAuth client"
@@ -374,7 +448,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Клиент {0} зарегиÑтрирован!"
@@ -387,59 +461,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Добавить"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr "OpenID"
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr "Добавить OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr "Удалить OpenID"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Удалить"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Войти"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½ÐµÑƒÑпешна!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Ðеправильный формат файла."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Файл"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Вы должны загрузить файл."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Ура! Файл загружен!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Â«%s» добавлена!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "завершение ÑеанÑа"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Войти"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Изменить наÑтройки учётной запиÑи"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +671,16 @@ msgstr "Изменить наÑтройки учётной запиÑи"
msgid "Media processing panel"
msgstr "Панель обработки файлов"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Завершение ÑеанÑа"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Добавить файлы"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Создать новую коллекцию"
@@ -503,6 +727,59 @@ msgstr "ПоÑледние 10 удавшихÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº"
msgid "No processed entries, yet!"
msgstr "Выполненных задач пока нет!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr "ПоÑмотреть личную информацию (напр. профиль, файлы и Ñ‚.д.)"
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,28 +812,24 @@ msgid ""
"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:39
-msgid "Logging in failed!"
-msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½ÐµÑƒÑпешна!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
-msgstr "Ещё нету аккаунта?"
+msgstr "Ðет аккаунта?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Создайте здеÑÑŒ!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Забыли Ñвой пароль?"
#: mediagoblin/templates/mediagoblin/auth/register.html:28
#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create an account!"
-msgstr "Создать аккаунт!"
+msgstr "Создайте аккаунт!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Создать"
@@ -590,7 +863,7 @@ msgstr "Он опубликован на уÑловиÑÑ… <a href=\"http://www.f
msgid "Explore"
msgstr "Смотреть"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Привет! Добро пожаловать на наш MediaGoblin’овый Ñайт!"
@@ -600,22 +873,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Этот Ñайт работает на <a href=\"http://mediagoblin.org\">MediaGoblin</a>, необыкновенно замечательном ПО Ð´Ð»Ñ Ñ…Ð¾Ñтинга мультимедийных файлов."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Ð”Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑобÑтвенных файлов, ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ñ‚. п. вы можете предÑтавитьÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вашей MediaGoblin’овой учётной запиÑи."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "У Ð²Ð°Ñ ÐµÑ‘ ещё нет? Ðе проблема!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +908,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Добавление ÑопутÑтвующего файла Ð´Ð»Ñ %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "СопутÑтвующие файлы"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Добавить ÑопутÑтвующий файл"
@@ -653,22 +931,29 @@ msgstr "Отмена"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Сохранить изменениÑ"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "Смена Ð¿Ð°Ñ€Ð¾Ð»Ñ %(username)s"
+msgid "Changing %(username)s's email"
+msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "Сохранить"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "Смена Ð¿Ð°Ñ€Ð¾Ð»Ñ %(username)s"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,14 +981,14 @@ msgstr "Редактирование %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "ÐаÑтройка учётной запиÑи %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "Сменить пароль"
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Удалить мою учётную запиÑÑŒ"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr "Е-майл "
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -715,6 +1000,36 @@ msgstr "Редактирование %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Редактирование Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr "Ðовые комментарии"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "%(formatted_time)s назад"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr "Отметить вÑе, как прочтенные"
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,8 +1040,7 @@ msgstr "Файлы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Скачать"
@@ -750,7 +1064,7 @@ msgid ""
msgstr "Ð’Ñ‹ можете Ñкачать Ñовременный браузер, \n\tÑпоÑобный проиграть Ñто аудио, Ñ <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "ИÑходный файл"
@@ -759,6 +1073,10 @@ msgstr "ИÑходный файл"
msgid "WebM file (Vorbis codec)"
msgstr "WebMâ€Ñ„айл (кодек — Vorbis)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Создан"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1088,39 @@ msgstr "WebMâ€Ñ„айл (кодек — Vorbis)"
msgid "Image for %(media_title)s"
msgstr "Изображение «%(media_title)s»"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "PDF-файл"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "ПерÑпектива"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "Спереди"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "Сверху"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Сбоку"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Скачать модель"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Формат файла"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Ð’Ñ‹Ñота объекта"
@@ -829,8 +1139,8 @@ msgid ""
msgstr "Ð’Ñ‹ можете Ñкачать Ñовременный браузер, ÑпоÑобный воÑпроизводить Ñто видео, Ñ <a href=\"http://getfirefox.com\">\n http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "WebM-файл (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr "WebM файл (VP8/Vorbis)"
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -856,11 +1166,6 @@ msgstr "%(collection_title)s Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ <a href=\"%(user_url)s\">%
msgid "Edit"
msgstr "Изменить"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Удалить"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1220,22 @@ msgstr "Файлы Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ <a href=\"%(user_url)s\">%(username)
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■ПроÑмотр файлов Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Добавить комментарий"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Добавить Ñтот комментарий"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "%(formatted_time)s назад"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr "Предварительный проÑмотр комментариÑ"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Добавлен"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "Создан"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -946,7 +1244,7 @@ msgstr "Добавление «%(media_title)s» в коллекцию"
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:54
msgid "+"
-msgstr ""
+msgstr "+"
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:58
msgid "Add a new collection"
@@ -1096,26 +1394,34 @@ msgstr "Метки"
msgid "Could not read the image file."
msgstr "Ðе удалоÑÑŒ прочитать файл Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Ой!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Произошла ошибка"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr "Ðеверный запроÑ"
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ позволÑетÑÑ"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1124,23 +1430,23 @@ msgstr ""
#: mediagoblin/tools/timesince.py:62
msgid "year"
-msgstr ""
+msgstr "год"
#: mediagoblin/tools/timesince.py:63
msgid "month"
-msgstr ""
+msgstr "меÑÑц"
#: mediagoblin/tools/timesince.py:64
msgid "week"
-msgstr ""
+msgstr "неделÑ"
#: mediagoblin/tools/timesince.py:65
msgid "day"
-msgstr ""
+msgstr "день"
#: mediagoblin/tools/timesince.py:66
msgid "hour"
-msgstr ""
+msgstr "чаÑ"
#: mediagoblin/tools/timesince.py:67
msgid "minute"
@@ -1152,10 +1458,9 @@ msgstr "Комментировать"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Ð”Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‚ÐºÐ¸ можете иÑпользовать Ñзык <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a>."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1177,77 +1482,80 @@ msgstr "-- Выберите --"
msgid "Include a note"
msgstr "Примечание"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "оÑтавил комментарий к вашему файлу"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "Сожалеем: возможноÑть ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Ой, ваш комментарий был пуÑÑ‚."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Ваш комментарий размещён!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "ПожалуйÑта, проверьте введённое и попробуйте ещё раз."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Ðеобходимо выбрать или добавить коллекцию"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "«%s» — уже в коллекции «%s»"
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "«%s» добавлено в коллекцию «%s»"
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Вы удалили файл."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Файл не удалён, так как вы не подтвердили Ñвою уверенноÑть галочкой."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Ð’Ñ‹ на пороге ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° другого пользователÑ. Будьте оÑторожны."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Ð’Ñ‹ иÑключили файл из коллекции."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "Файл не иÑключён из коллекции, так как вы не подтвердили Ñвоё намерение отметкой."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Ð’Ñ‹ на пороге иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° из коллекции другого пользователÑ. Будьте оÑторожны."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Вы удалили коллекцию «%s»"
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð½Ðµ удалена, так как вы не подтвердили Ñвоё намерение отметкой."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Ð’Ñ‹ на пороге ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ð¸ другого пользователÑ. Будьте оÑторожны."
diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
index fd48a37f..de023128 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 e4d1bacc..fb5088c8 100644
--- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
@@ -3,19 +3,19 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# martin <zatroch.martin@gmail.com>, 2013
-# martin <zatroch.martin@gmail.com>, 2012-2013
+# martin, 2013
+# martin, 2012-2013
# Morten Juhl-Johansen Zölde-Fejér <morten@writtenandread.net>, 2012
# Olle Jonsson <olle.jonsson@gmail.com>, 2012
# ttrudslev <tanja.trudslev@gmail.com>, 2012
-# martin <zatroch.martin@gmail.com>, 2011-2012
+# martin, 2011-2012
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-28 07:47+0000\n"
-"Last-Translator: martin <zatroch.martin@gmail.com>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Slovak (http://www.transifex.com/projects/p/mediagoblin/language/sk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -24,250 +24,280 @@ msgstr ""
"Language: sk\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Používateľské meno"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Heslo"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Email adresse"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "PrepáÄ, registrácia na danej inÅ¡tancii nie je povolená."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Použivateľské meno alebo e-mail"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Používateľské meno alebo e-mailová adresa"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Nesprávne používateľské meno alebo e-mailová adresa."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Toto pole neakceptuje e-mailové adresy."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Toto pole vyžaduje e-mailovú adresu."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "PrepáÄ, registrácia na danej inÅ¡tancii nie je povolená."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "PrepáÄ, rovnaké používateľské meno už existuje."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "PrepáÄ, rovnaká e-mailová adresa už bola použitá na vytvorenie úÄtu."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Tvoja e-mailová adresa bola overená. Teraz sa môžeš prihlásiť, upravovať profil a vkladať výtvory!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Overovací kľúÄ, prípadne používateľské meno je nesprávne."
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Je potrebné prihlásiť sa, aby sme vedeli kam máme e-mail zaslať!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Už máš overenú e-mailovú adresu!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Opätovne zaslať overovací e-mail."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Pokiaľ daná e-mailová adresa (citlivá na veľkosť písma!) je registrovaná, e-mail z inštrukciami pre zmenu tvojho hesla bol zaslaný."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "Nemožno nájsť nikoho z daným používateľským menom."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "E-mailová správa z inštrukciami na zmenu tvojho hesla bola zaslaná."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "Nebolo možné zaslať e-mail na opätovné získanie zabudnutého hesla, nakoľko tvoje používateľské meno je neaktívne, prípadne e-mailová adresa nebola úspešne overená."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Už môžeš použiť nové heslo pri prihlasovaní."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titulok"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Popis výtvoru"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Môžeš využiť\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> pre formátovanie príspevku."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Štítky"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Oddeľ Å¡títky pomocou Äiarky."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Unikátna ÄasÅ¥ adresy"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "Unikátna ÄasÅ¥ adresy nesmie byÅ¥ prázdna"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Titulná ÄasÅ¥ adresy daného média. Zmena poľa nepovinná."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Licencia"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Webstránka"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Daná adresa obsahuje chybu"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "ZaÅ¡li mi e-mail keÄ ostatní okomentujú môj výtvor"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "Preferencia licencie"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Nasledovná licencia bude použitá ako východzia pre všetky tvoje výtvory."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "ZaÅ¡li mi e-mail keÄ ostatní okomentujú môj výtvor"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Titulok nesmie byť prázdny."
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Popis danej kolekcie"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "Titulná ÄasÅ¥ adresy danej kolekcie. Zmena poľa nepovinná."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Staré heslo"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Vlož svoje staré heslo na dôkaz toho, že vlastníš daný úÄet."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Nové heslo"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Heslo"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
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:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Upravuješ výtvory iného používateľa. Pristupuj zodpovedne. "
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Príloha %s pridaná!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Môžeš upravovať iba svoj vlastný profil."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Upravuješ profil iného používateľa. Pristupuj zodpovedne. "
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Zmeny v profile uložené"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Nastavenia úÄtu uložené"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "PotrebujeÅ¡ potvrdiÅ¥ odstránenie svojho úÄtu."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Už máš kolekciu nazvanú ako \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "Kolekcia s týmto štítkom už máš."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Upravuješ kolekciu iného používateľa. Pristupuj zodpovedne. "
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Nesprávne heslo"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "Tvoje heslo bolo úspešne zmenené"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "Nemožno pripojiť tému... téma nenastavená\n"
@@ -302,19 +332,62 @@ msgid ""
"domain."
msgstr "CSRF \"cookie\" neprítomný. Toto vidíš najskôr ako výsledok blokovania \"cookie\" súborov a pod.<br/>Uisti sa, že máš povolené ukladanie \"cookies\" pre danú doménu."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "PrepáÄ, nepodporujem tento typ súborov =("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr "beh unoconv zlyhal, preskúmajte log záznam"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Konvertovanie videa zlyhalo"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "okmentoval tvoj príspevok"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Používateľské meno"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Email adresse"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Použivateľské meno alebo e-mail"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Poloha"
@@ -378,7 +451,7 @@ msgstr "Presmerovacie URI pre aplikácie, toto pole\nje <strong>požadované</st
msgid "This field is required for public clients"
msgstr "Dané pole je požadované pre verejných klientov."
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Klient {0} bol registrovaný!"
@@ -391,59 +464,209 @@ msgid "Your OAuth clients"
msgstr "Tvoji autorizovaní OAuth klienti"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Pridať"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Odstrániť"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Prihlásiť sa"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Prihlásenie zlyhalo!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Nesprávny typ súboru pre dané médium."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Súbor"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Musíš poskytnúť súbor."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Skvelé! Pridané!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "Kolekcia \"%s\" pridaná!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Over si e-mailovú adresu!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "odhlásiť sa"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Prihlásiť sa"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "ÚÄet používateľa <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "ZmeniÅ¥ nastavenia úÄtu"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -451,16 +674,16 @@ msgstr "ZmeniÅ¥ nastavenia úÄtu"
msgid "Media processing panel"
msgstr "Sekcia spracovania výtvorov"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Odhlásiť sa"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Pridať výtvor"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Vytvoriť novú kolekciu"
@@ -507,6 +730,59 @@ msgstr "Posledných 10 úspešných nahratí"
msgid "No processed entries, yet!"
msgstr "Zatiaľ žiadne spracované položky!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -539,19 +815,15 @@ msgid ""
"a happy goblin!"
msgstr "Ahoj %(username)s,\n\npre zmenu svojho hesla k GNU MediaGoblin úÄtu, otvor nasledujúci odkaz vo svojom prehliadaÄi:\n\n%(verification_url)s\n\nPokiaľ 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:39
-msgid "Logging in failed!"
-msgstr "Prihlásenie zlyhalo!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "EÅ¡te stále nemáš úÄet?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Vytvor si jeden tu!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Zabudnuté heslo?"
@@ -560,7 +832,7 @@ msgstr "Zabudnuté heslo?"
msgid "Create an account!"
msgstr "Opret en konto!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Vytvoriť"
@@ -594,7 +866,7 @@ msgstr "Uvoľnené pod <a href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.
msgid "Explore"
msgstr "Preskúmať"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Ahoj, vitaj na tejto MediaGoblin stránke!"
@@ -604,23 +876,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "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/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Pre pridanie vlastných výtvorov, komentárov a viac.. sa prihlás zo svojim MediaGoblin úÄtom."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Har du ikke en endnu? Det er let!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">VytvoriÅ¥ úÄet na tejto stránke</a>\n alebo\n <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">NastaviÅ¥ MediaGoblin na vlastnom serveri</a>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -634,13 +911,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Úprava príloh pre %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Prílohy"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Pridať prílohu"
@@ -657,22 +934,29 @@ msgstr "Zrušiť"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Uložiť zmeny"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "Mením heslo používateľa %(username)s"
+msgid "Changing %(username)s's email"
+msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "Uložiť"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "Mením heslo používateľa %(username)s"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -700,14 +984,14 @@ msgstr "Úprava %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "Mením nastavenia úÄtu používateľa %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "Zmeniť svoje heslo."
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "OdstrániÅ¥ môj úÄet"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -719,6 +1003,36 @@ msgstr "Úprava %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Úprava profilu, ktorý vlastní %(username)s "
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "pred %(formatted_time)s "
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -729,8 +1043,7 @@ msgstr "Výtvory oznaÄené ako: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Stiahnuť"
@@ -754,7 +1067,7 @@ msgid ""
msgstr "MôžeÅ¡ získaÅ¥ moderný prehliadaÄ, ktorý\n\ttento zvuk hravo prehrá <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Originálny súbor"
@@ -763,6 +1076,10 @@ msgstr "Originálny súbor"
msgid "WebM file (Vorbis codec)"
msgstr "WebM súbor (Vorbis kodek)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "Vytvorené"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -774,47 +1091,39 @@ msgstr "WebM súbor (Vorbis kodek)"
msgid "Image for %(media_title)s"
msgstr "Obrázok pre %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "PDF súbor"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "Zapnúť rotáciu"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "Perspektíva"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "ÄŒelo"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "Vrch"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Strana"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Stiahnuť model"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Súborový formát"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Výška objektu"
@@ -833,8 +1142,8 @@ msgid ""
msgstr "MôžeÅ¡ získaÅ¥ moderný prehliadaÄ, ktorý\n\ttento video súbor hravo prehrá na <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "WebM súbor (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -860,11 +1169,6 @@ msgstr "%(collection_title)s od <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "Upraviť"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Odstrániť"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -919,29 +1223,22 @@ msgstr "Výtvory, ktoré vlastní <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "■Prehliadanie výtvorov od <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Pridať komentár"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Pridať tento komentár"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "pred %(formatted_time)s "
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Pridané"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "Vytvorené"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1100,26 +1397,34 @@ msgstr "OznaÄené ako"
msgid "Could not read the image file."
msgstr "Nemožno preÄítaÅ¥ súbor obrázka."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Hopla!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Vyskytla sa chyba"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Nepovolená operácia"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "PrepÃ¡Ä ÄŒloveÄe, toto nesmieÅ¡!</p><p>Práve si chcel vykonaÅ¥ funkciu, na ktorú nemáš oprávnenie. Opäť si sa pokúšal odstrániÅ¥ vÅ¡etky používateľské úÄty?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1156,10 +1461,9 @@ msgstr "Komentár"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Môžeš využiť <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> pre formátovanie príspevku."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1181,77 +1485,80 @@ msgstr "-- Vybrať --"
msgid "Include a note"
msgstr "Pridať poznámku"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "okmentoval tvoj príspevok"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "PrepáÄ, komentovanie je vypnuté."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Hopla, tvoj komentár bol prázdny."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Tvoj komentár bol pridaný!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Prosím skontroluj svoje položky a skús znova."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Musíš vybrať, prípadne pridať kolekciu"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" sa už nachádza v kolekcii \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s pridané do kolekcie \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Výtvor bol tebou odstránený."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
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:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Chystáš sa odstrániť výtvory niekoho iného. Pristupuj zodpovedne. "
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "Položka bola z kolekcie odstránená."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "Položka nebola odstránená, nakoľko políÄko potvrdenia nebolo oznaÄné."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Chystáš sa odstrániť položku z kolekcie iného používateľa. Pristupuj zodpovedne. "
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "Kolekcia \"%s\" bola úspešne odstránená."
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "Kolekcia nebola odstránená, nakoľko políÄko potrvdenia nebolo oznaÄené."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Chystáš sa odstrániť kolekciu iného používateľa. Pristupuj zodpovedne. "
diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
index 199e761c..113553fb 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 35635acf..1ad70dc0 100644
--- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Slovenian (http://www.transifex.com/projects/p/mediagoblin/language/sl/)\n"
"MIME-Version: 1.0\n"
@@ -19,250 +19,280 @@ 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:26
-msgid "Username"
-msgstr "Uporabniško ime"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Geslo"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "E-poštni naslov"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Oprostite, prijava za ta izvod ni omogoÄena."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr ""
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Oprostite, prijava za ta izvod ni omogoÄena."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Oprostite, uporabnik s tem imenom že obstaja."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Vaš e-poštni naslov je bil potrjen. Sedaj se lahko prijavite, uredite svoj profil in pošljete slike."
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Potrditveni kljuÄ ali uporabniÅ¡ka identifikacija je napaÄna"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr ""
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr ""
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Ponovno pošiljanje potrditvene e-pošte."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Naslov"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr ""
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Oznake"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Oznaka"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "Oznaka ne sme biti prazna"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Biografija"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Spletna stran"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr ""
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr ""
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Geslo"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
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:91
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:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Urejate uporabniški profil. Nadaljujte pazljivo."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr ""
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -297,19 +327,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Uporabniško ime"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "E-poštni naslov"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -373,7 +446,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -386,59 +459,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr ""
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Prijava"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Prijava ni uspela."
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Za vrsto vsebine je bila podana napaÄna datoteka."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Datoteka"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Podati morate datoteko."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Juhej! Poslano."
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Prijava"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -446,16 +669,16 @@ msgstr ""
msgid "Media processing panel"
msgstr "Podokno obdelovanja vsebine"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Dodaj vsebino"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -502,6 +725,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -534,19 +810,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Prijava ni uspela."
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Å e nimate raÄuna?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Ustvarite si ga."
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr ""
@@ -555,7 +827,7 @@ msgstr ""
msgid "Create an account!"
msgstr "Ustvarite raÄun."
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Ustvari"
@@ -589,7 +861,7 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
@@ -599,22 +871,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -629,13 +906,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -652,22 +929,29 @@ msgstr "PrekliÄi"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Shrani spremembe"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -695,12 +979,12 @@ msgstr "Urejanje %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -714,6 +998,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr "Urejanje profila – %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -724,8 +1038,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -749,7 +1062,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -758,6 +1071,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -769,47 +1086,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -828,7 +1137,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -855,11 +1164,6 @@ msgstr ""
msgid "Edit"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -914,29 +1218,22 @@ msgstr "Vsebina uporabnika <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1095,26 +1392,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Opa!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1151,9 +1456,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1176,77 +1480,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mo
index 0f113dcb..d7fc5203 100644
--- a/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po
index aabf18db..f20af6cf 100644
--- a/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sq/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Albanian (http://www.transifex.com/projects/p/mediagoblin/language/sq/)\n"
"MIME-Version: 1.0\n"
@@ -20,250 +20,280 @@ msgstr ""
"Language: sq\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Emër përdoruesi"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Fjalëkalim"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Adresë email"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Na njdeni, regjistrimi në këtë instancë të shërbimit është i çaktivizuar."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Emër përdoruesi ose email"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "Emër përdoruesi ose adresë email e pavlefshme."
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "Kjo fushë nuk është për adresa email."
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "Kjo fushë lyp një adresë email."
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Na njdeni, regjistrimi në këtë instancë të shërbimit është i çaktivizuar."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Na ndjeni, ka tashmë një përdorues me këtë emër."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Na ndjeni, ka tashmë një përdorues me këtë adresë email."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Adresa juaj email u verifikua. Tani mund të bëni hyrjen, të përpunoni profilin tuaj, dhe të parashtroni figura!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Kyçi i verifikimit ose id-ja e përdoruesit është e pasaktë"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Duhet të jeni i futur, që ta dimë kujt t'ia çojmë email-in!"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Thuajse e keni verifikuar adresën tuaj email!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Ridërgoni email-in tuaj të verifikimit."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "Nëse ajo adresë email (siç është shkruajtur!) është e regjistruar, është dërguar një email me udhëzime se si të ndryshoni fjalëkalimin tuaj."
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "S'u gjet dot dikush me atë emër përdoruesi."
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Është dërguar një email me udhëzime se si të ndryshoni fjalëkalimin tuaj."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr "Email-i i ricaktimit të fjalëkalimit nuk u dërgua dot, ngaqë emri juaj i përdoruesit nuk është aktivizuar ose adresa email e llogarisë suaj nuk është verifikuar."
-#: mediagoblin/auth/views.py:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Tani mun të hyni duke përdorur fjalëkalimin tuaj të ri."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titull"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Përshkrim i kësaj pune"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "Mund të përdorni\n <a href=\"http://daringfireball.net/projects/markdown/basics\">\n Markdown</a> për formatim."
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Etiketa"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Ndajini etiketat me presje."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Identifikues"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "Identifikuesi s'mund të jetë i zbrazët"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "Titulli i adresës së kësaj medie. Zakonisht nuk keni nevojë ta ndryshoni këtë."
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "Leje"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Jetëshkrim"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Site Web"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "Kjo adresë përmban gabime"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Dërgomë email kur të tjerët komentojnë te media ime"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "Parapëlqime licence"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "Kjo do të jetë licenca juaj parazgjedhje për forma ngarkimesh."
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Dërgomë email kur të tjerët komentojnë te media ime"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "Titulli s'mund të jetë i zbrazët"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "Përshkrim i këtij koleksioni"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "Pjesa titull e adresës së këtij koleksioni. Zakonisht nuk keni pse e ndryshoni këtë."
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Fjalëkalimi i vjetër"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "Jepni fjalëkalimin tuaj të vjetër që të provohet se këtë llogari e zotëroni ju."
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Fjalëkalimi i ri"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Fjalëkalim"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "Ka tashmë një zë me atë identifikues për këtë përdorues."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Po përpunoni media të një tjetër përdoruesi. Hapni sytë."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "Shtuat bashkangjitjen %s!"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "Mund të përpunoni vetëm profilin tuaj."
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Po përpunoni profilin e një përdoruesi. Hapni sytë."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Ndryshimet e profilit u ruajtën"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Rregullimet e llogarisë u ruajtën"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "Lypset të ripohoni fshirjen e llogarisë suaj."
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "Keni tashmë një koleksion të quajtur \"%s\"!"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "Ka tashmë një koleksion me atë identifikues për këtë përdorues."
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "Po përpunoni koleksionin e një tjetër përdoruesi. Hapni sytë."
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Fjalëkalim i gabuar"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "Nuk krijohet dot lidhje për te tema... nuk ka temë të caktuar\n"
@@ -298,19 +328,62 @@ msgid ""
"domain."
msgstr "Pa cookie CSRF të pranishme. Ka shumë të ngjarë që të jetë punë e një bllokuesi cookie-sh ose të tillë.<br/>Sigurohuni që të lejoni depozitim cookie-sh për këtë përkatësi."
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Na ndjeni, nuk e mbullojmë këtë lloj kartele :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "Ndërkodimi i videos dështoi"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "komentoi te postimi juaj"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Emër përdoruesi"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Adresë email"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "Vend"
@@ -374,7 +447,7 @@ msgstr "URI ridrejtimi për zbatimin, kjo fushë\n është <strong>e
msgid "This field is required for public clients"
msgstr "Kjo fushë është e domosdoshme për klientë publikë"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "Klienti {0} u regjistrua!"
@@ -387,59 +460,209 @@ msgid "Your OAuth clients"
msgstr "Klientët tuaj OAuth"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Shtoni"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Fshije"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Hyni"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Hyrja dështoi!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Kartelë e gabuar e dhënë për llojin e medias."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Kartelë"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Duhet të jepni një kartelë."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Yhaaaaaa! U parashtrua!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "U shtua koleksioni \"%s\"!"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Verifikoni email-in tuaj!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "dilni"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Hyni"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "Llogaria e <a href=\"%(user_url)s\">%(user_name)s</a>"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Ndryshoni rregullime llogarie"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +670,16 @@ msgstr "Ndryshoni rregullime llogarie"
msgid "Media processing panel"
msgstr "Paneli i përpunimit të medias"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Dilni"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Shtoni media"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "Krijoni koleksion të ri"
@@ -503,6 +726,59 @@ msgstr "10 ngarkimet e fundit të suksesshme"
msgid "No processed entries, yet!"
msgstr "Ende pa zëra të përpunuar!"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,19 +811,15 @@ msgid ""
"a happy goblin!"
msgstr "Njatjeta %(username)s,\n\nqë të ndryshoni fjalëkalimin tuaj për GNU MediaGoblin, hapeni URL-në vijuese në \nshfletuesin tuaj web:\n\n%(verification_url)s\n\nNëse mendoni se këtu ka gabim, thjesht shpërfilleni këtë email dhe vazhdoni të jeni\nnjë djallush i lumtur!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Hyrja dështoi!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Nuk keni ende një llogari?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Krijoni një këtu!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Harruat fjalëkalimin tuaj?"
@@ -556,7 +828,7 @@ msgstr "Harruat fjalëkalimin tuaj?"
msgid "Create an account!"
msgstr "Krijoni një llogari!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Krijoje"
@@ -590,7 +862,7 @@ msgstr "Hedhur në qarkullim sipas <a href=\"http://www.fsf.org/licensing/licens
msgid "Explore"
msgstr "Eksploroni"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Tungjatjeta juaj, mirë se vini te ky site MediaGoblin!"
@@ -600,22 +872,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "Ky site përdor <a href=\"http://mediagoblin.org\">MediaGoblin</a>, një program jashtëzakonisht i shkëlqyer për strehim mediash."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "Për të shtuar media tuajën, për të bërë komente, dhe të tjera, mund të hyni përmes llogarisë suaj MediaGoblin."
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Nuk keni ende një të tillë? Është e lehtë!"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +907,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "Po përpunohen bashkangjitjet për %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "Bashkangjitje"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "Shtoni bashkangjitje"
@@ -653,22 +930,29 @@ msgstr "Anuloje"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Ruaji ndryshimet"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,14 +980,14 @@ msgstr "Po përpunohet %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "Po ndryshohen rregullimet e llogarisë %(username)s"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Fshije llogarinë time"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -715,6 +999,36 @@ msgstr "Po përpunohet %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "Po përpunohet profili i %(username)s"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,8 +1039,7 @@ msgstr "Media e etiketuar me:: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "Shkarkojeni"
@@ -750,7 +1063,7 @@ msgid ""
msgstr "Një shfletues web modern që mund të luajë \n\taudion mund ta merrni te <a href=\"http://getfirefox.com\">\n\t http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Kartela origjinale"
@@ -759,6 +1072,10 @@ msgstr "Kartela origjinale"
msgid "WebM file (Vorbis codec)"
msgstr "Kartelë WebM (kodek Vorbis)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1087,39 @@ msgstr "Kartelë WebM (kodek Vorbis)"
msgid "Image for %(media_title)s"
msgstr "Figurë për %(media_title)s"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "Aktivizoni/Çaktivizoni Rrotullimin"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "Perspektivë"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "Ball"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "Krye"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "Anë"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "Shkarkojeni modelin"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Format Kartele"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "Lartësi Objekti"
@@ -829,8 +1138,8 @@ msgid ""
msgstr "Mund të merrni një shfletues web modern që \n është në gjendje ta shfaqë këtë video, te <a href=\"http://getfirefox.com\">\n http://getfirefox.com</a>!"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "Kartelë WebM (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -856,11 +1165,6 @@ msgstr "%(collection_title)s nga <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "Përpunoni"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Fshije"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1219,22 @@ msgstr "Media nga <a href=\"%(user_url)s\">%(username)s</a>"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "â– Po shfletoni media nga <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Shtoni një koment"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Shtoje këtë koment"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1096,26 +1393,34 @@ msgstr "Etiketuar me"
msgid "Could not read the image file."
msgstr "Nuk lexoi dot kartelën e figurës."
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Oooh!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "Ndodhi një gabim"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "Veprim i palejuar"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "Më ndjeni or trim, nuk ju lë dot ta bëni këtë!</p><p>Provuat të kryeni një funksion që nuk lejohet. Keni provuar prapë të fshini krejt llogaritë e përdoruesve?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1152,10 +1457,9 @@ msgstr "Koment"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "Për formatime mund të përdorni <a href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a>."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1177,77 +1481,80 @@ msgstr "-- Përzgjidhni --"
msgid "Include a note"
msgstr "Përfshini një shënim"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "komentoi te postimi juaj"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Hmmm, komenti juaj qe i zbrazët."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Komenti juaj u postua!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "Ju lutemi, kontrolloni zërat tuaj dhe riprovoni."
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "Duhet të përzgjidhni ose shtoni një koleksion"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "\"%s\" gjendet tashmë te koleksioni \"%s\""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "\"%s\" u shtua te koleksioni \"%s\""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "E fshitë median."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Media nuk u fshi ngaqë nuk i vutë shenjë pohimit se jeni i sigurt."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Ju ndan një hap nga fshirja e medias të një tjetër përdoruesi. Hapni sytë."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "E fshitë objektin prej koleksionit."
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "Objekti nuk u fshi ngaqë, nuk pohuat se jeni të sigurt për këtë."
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "Ju ndan një hap nga fshirja e një objekti prej koleksionit të një përdoruesi tjetër. Hapni sytë."
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "E fshitë koleksionin \"%s\""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "Koleksioni nuk u fshi ngaqë, nuk pohuat se jeni të sigurt për këtë."
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "Ju ndan një hap nga fshirja e koleksionit të një përdoruesi tjetër. Hapni sytë."
diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
index 5564d35d..b7cd984e 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 fcf8a666..1cb6b7ae 100644
--- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Serbian (http://www.transifex.com/projects/p/mediagoblin/language/sr/)\n"
"MIME-Version: 1.0\n"
@@ -18,250 +18,280 @@ 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:26
-msgid "Username"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr ""
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr ""
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr ""
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr ""
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr ""
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr ""
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr ""
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr ""
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr ""
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr ""
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr ""
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -296,19 +326,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -372,7 +445,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -385,59 +458,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr ""
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr ""
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -445,16 +668,16 @@ msgstr ""
msgid "Media processing panel"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -501,6 +724,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -533,19 +809,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr ""
@@ -554,7 +826,7 @@ msgstr ""
msgid "Create an account!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr ""
@@ -588,7 +860,7 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
@@ -598,22 +870,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -628,13 +905,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -651,22 +928,29 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -694,12 +978,12 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -713,6 +997,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -723,8 +1037,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -748,7 +1061,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -757,6 +1070,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -768,47 +1085,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -827,7 +1136,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -854,11 +1163,6 @@ msgstr ""
msgid "Edit"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -913,29 +1217,22 @@ msgstr ""
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1094,26 +1391,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr ""
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1150,9 +1455,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1175,77 +1479,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
index 3b961e60..3fec1005 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 659de21b..ac9302be 100644
--- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Swedish (http://www.transifex.com/projects/p/mediagoblin/language/sv/)\n"
"MIME-Version: 1.0\n"
@@ -20,250 +20,280 @@ msgstr ""
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Användarnamn"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Lösenord"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "E-postadress"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Vi beklagar, registreringen är avtängd på den här instansen."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr ""
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Vi beklagar, registreringen är avtängd på den här instansen."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "En användare med det användarnamnet finns redan."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Det finns redan en användare med den e-postadressen."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "Din e-postadress är verifierad. Du kan nu logga in, redigera din profil och ladda upp filer!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Verifieringsnyckeln eller användar-IDt är fel."
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "Du måste vara inloggad för att vi ska kunna skicka meddelandet till dig."
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Du har redan verifierat din e-postadress!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Skickade ett nytt verifierings-email."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "Beskrivning av verket"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Taggar"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "Sökvägsnamn"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "Sökvägsnamnet kan inte vara tomt"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "Presentation"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Hemsida"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Tidigare lösenord"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr ""
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Lösenord"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
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:91
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:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Var försiktig, du redigerar en annan användares profil."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Fel lösenord"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -298,19 +328,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Användarnamn"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "E-postadress"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -374,7 +447,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -387,59 +460,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr ""
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "Logga in"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Inloggning misslyckades!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Ogiltig fil för mediatypen."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Du måste ange en fil"
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Tjohoo! Upladdat!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "Verifiera din e-postadress"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "Logga in"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -447,16 +670,16 @@ msgstr ""
msgid "Media processing panel"
msgstr "Mediabehandlingspanel"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Lägg till media"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -503,6 +726,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -535,19 +811,15 @@ msgid ""
"a happy goblin!"
msgstr "Hej %(username)s,\n\nför att ändra ditt GNU MediaGoblin-lösenord, öppna följande länk i\ndin webbläsare:\n\n%(verification_url)s\n\nOm du misstänker att du fått detta epostmeddelanade av misstag, ignorera det och fortsätt vara ett glatt troll!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Inloggning misslyckades!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Har du inget konto än?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Skapa ett här!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Glömt ditt lösenord?"
@@ -556,7 +828,7 @@ msgstr "Glömt ditt lösenord?"
msgid "Create an account!"
msgstr "Skapa ett konto!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "Skapa"
@@ -590,7 +862,7 @@ msgstr ""
msgid "Explore"
msgstr "Utforska"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "Hej, välkommen till den här MediaGoblin-sidan!"
@@ -600,22 +872,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "Har du inte ett redan?"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -630,13 +907,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -653,22 +930,29 @@ msgstr "Avbryt"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "Spara ändringar"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -696,12 +980,12 @@ msgstr "Redigerar %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -715,6 +999,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr "Redigerar %(username)ss profil"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -725,8 +1039,7 @@ msgstr "Media taggat med: %(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -750,7 +1063,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -759,6 +1072,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -770,47 +1087,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -829,7 +1138,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -856,11 +1165,6 @@ msgstr ""
msgid "Edit"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -915,29 +1219,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a>s media"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1096,26 +1393,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Ojoj!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1152,9 +1457,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1177,77 +1481,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
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."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo
index 6e7ebd21..791028e4 100644
--- a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo
+++ 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
index b0bf1aa1..682d12f9 100644
--- a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po
@@ -3,13 +3,13 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# వీవెనౠ<veeven@gmail.com>, 2011
+# వీవెనౠవీరపనేని <veeven@gmail.com>, 2011
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Telugu (http://www.transifex.com/projects/p/mediagoblin/language/te/)\n"
"MIME-Version: 1.0\n"
@@ -19,250 +19,280 @@ msgstr ""
"Language: te\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "వాడà±à°•à°°à°¿ పేరà±"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "సంకేతపదం"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr ""
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr ""
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr ""
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr ""
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr ""
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "శీరà±à°·à°¿à°•"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr ""
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr ""
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr ""
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr ""
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "సంకేతపదం"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr ""
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -297,19 +327,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "వాడà±à°•à°°à°¿ పేరà±"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -373,7 +446,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -386,59 +459,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr ""
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "à°ªà±à°°à°µà±‡à°¶à°‚ విఫలమయà±à°¯à°¿à°‚ది!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr ""
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -446,16 +669,16 @@ msgstr ""
msgid "Media processing panel"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -502,6 +725,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -534,19 +810,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "à°ªà±à°°à°µà±‡à°¶à°‚ విఫలమయà±à°¯à°¿à°‚ది!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "మీకౠఇంకా ఖాతా లేదా?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "మీ సంకేతపదానà±à°¨à°¿ మరà±à°šà°¿à°ªà±‹à°¯à°¾à°°à°¾?"
@@ -555,7 +827,7 @@ msgstr "మీ సంకేతపదానà±à°¨à°¿ మరà±à°šà°¿à°ªà±‹à°¯à°¾à
msgid "Create an account!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr ""
@@ -589,7 +861,7 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
@@ -599,22 +871,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -629,13 +906,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -652,22 +929,29 @@ msgstr "à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "మారà±à°ªà±à°²à°¨à± à°­à°¦à±à°°à°ªà°°à°šà±"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -695,12 +979,12 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -714,6 +998,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -724,8 +1038,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -749,7 +1062,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -758,6 +1071,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -769,47 +1086,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -828,7 +1137,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -855,11 +1164,6 @@ msgstr ""
msgid "Edit"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -914,29 +1218,22 @@ msgstr ""
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1095,26 +1392,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr ""
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1151,9 +1456,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1176,77 +1480,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.mo
index 4341870b..589333e7 100644
--- a/mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.po
index 4155520f..0084cf03 100644
--- a/mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/tr_TR/LC_MESSAGES/mediagoblin.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-06-06 15:44+0000\n"
-"Last-Translator: Caner BAÅžARAN <basaran.caner@gmail.com>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/mediagoblin/language/tr_TR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,250 +19,280 @@ msgstr ""
"Language: tr_TR\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "Kullanıcı adı"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "Parola"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "E-posta adresi"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Üzgünüz, bu durumda kayıt devre dışıdır."
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "Kullanıcı adı veya E-posta"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "Kullanıcı adı ya da e-posta"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "Üzgünüz, bu durumda kayıt devre dışıdır."
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "Maalesef, bu isimde bir kullanıcı mevcut."
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "Üzgünüz, bu e-posta adresine sahip bir kullanıcı zaten var."
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "E-posta adresiniz doğrulandı. Şimdi giriş yapabilir, profilinizi düzenleyip ve yeni görüntüleri gönderebilirsiniz!"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "Doğrulama anahtarı veya kullanıcı kimliği yanlış"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr ""
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "Zaten e-posta adresinizi doğruladınız!"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "Doğrulama e-postasını tekrar yolla."
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "Parolanızı nasıl değiştireceğinizle ilgili adımları anlatan bir e-posta gönderildi."
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "Şimdi yeni parolanızı giriş için kullanabilirsiniz."
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "Başlık"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr ""
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "Etiketler"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "Etikerleri virgül ile ayırın."
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "Web sitesi"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "Medyama birisi yorum yazdığında bana e-posta at"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "Medyama birisi yorum yazdığında bana e-posta at"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
+msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "Eski parola"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "Yeni parola"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "Parola"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "Başka bir kullanıcının medyasını düzenlerken dikkatli davranın."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Başka bir kullanıcının profilini düzenlerken dikkatli davranın."
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "Profil deÄŸiÅŸiklikleri kaydedildi"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "Hesap ayarları kaydedildi"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "Yanlış parola"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "Parolanız başarılı bir şekilde değiştirildi"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -297,19 +327,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "Üzgünüz, bu tip dosyaları desteklemiyoruz :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "Kullanıcı adı"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "E-posta adresi"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "Kullanıcı adı veya E-posta"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -373,7 +446,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -386,76 +459,226 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "Ekle"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "Si"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "GiriÅŸ"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "Giriş başarısız!"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "Bu medya türü için geçersiz dosya türü."
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "Dosya"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "Bir dosya sağlamanız gerekir."
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "Hoooop! Gönderildi!"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "E-postanızı doğrulayın!"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "çıkış"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "GiriÅŸ"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "Hesap ayarlarını değiştir"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:26
msgid "Media processing panel"
-msgstr "Madya iÅŸlem paneli"
+msgstr "Medya iÅŸlem paneli"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "Çıkış"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "Medya ekle"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -502,6 +725,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -534,19 +810,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "Giriş başarısız!"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "Hala hesabınız yok mu?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "Åžimdi oluÅŸturun!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "Parolanı mı unuttun?"
@@ -555,7 +827,7 @@ msgstr "Parolanı mı unuttun?"
msgid "Create an account!"
msgstr "Hesap oluÅŸtur!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "OluÅŸtur"
@@ -589,7 +861,7 @@ msgstr ""
msgid "Explore"
msgstr "KeÅŸfet"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
@@ -599,22 +871,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
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>"
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -629,13 +906,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -652,22 +929,29 @@ msgstr "İptal"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "DeÄŸiÅŸiklikleri kaydet"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "Kaydet"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -695,14 +979,14 @@ msgstr "%(media_title)s düzenleme"
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "Parolanızı değiştirin."
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "Hesabımı sil"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -714,6 +998,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr "%(username)s profilini düzenleme"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "%(formatted_time)s önce"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -724,8 +1038,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "İndir"
@@ -749,7 +1062,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "Özgün dosya"
@@ -758,6 +1071,10 @@ msgstr "Özgün dosya"
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "OluÅŸturuldu"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -769,47 +1086,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "PDF dosya"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "Dosya Biçimi"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -828,7 +1137,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -855,11 +1164,6 @@ msgstr ""
msgid "Edit"
msgstr "Düzenle"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "Si"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -914,29 +1218,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a> medyası"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "Bir yorum ekle"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "Bu yorumu ekle"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "%(formatted_time)s önce"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "Eklendi"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "OluÅŸturuldu"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1095,26 +1392,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "Amaninnn boo!"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1151,9 +1456,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1176,77 +1480,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "Maalesef, yorum devre dışı."
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "Amaninnn boo, yorumunuz boÅŸtu."
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "Yorumunuz gönderildi!"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "Medyayı sildiniz."
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "Medya silinmedi çünkü emin olduğunuzu onaylamadınız."
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Başka bir kullanıcının medyasını silerken dikkatli davranın."
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/vi/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/vi/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..282a8095
--- /dev/null
+++ b/mediagoblin/i18n/vi/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/vi/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/vi/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..bfbdcd64
--- /dev/null
+++ b/mediagoblin/i18n/vi/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,1558 @@
+# Translations template for PROJECT.
+# Copyright (C) 2013 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"Language-Team: Vietnamese (http://www.transifex.com/projects/p/mediagoblin/language/vi/)\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: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr ""
+
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25
+msgid "Username or email"
+msgstr ""
+
+#: mediagoblin/auth/tools.py:41
+msgid "Invalid User name or email address."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:42
+msgid "This field does not take email addresses."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:43
+msgid "This field requires an email address."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:146
+msgid "Sorry, a user with that name already exists."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
+
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
+msgid ""
+"Your email address has been verified. You may now login, edit your profile, "
+"and submit images!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:167
+msgid "The verification key or user id is incorrect"
+msgstr ""
+
+#: mediagoblin/auth/views.py:185
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:193
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:203
+msgid "Resent your verification email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:237
+msgid ""
+"If that email address (case sensitive!) is registered an email has been sent"
+" with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:248
+msgid "Couldn't find someone with that username."
+msgstr ""
+
+#: mediagoblin/auth/views.py:251
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:258
+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:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
+msgid "You can now log in using your new password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:45
+msgid "Title"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
+msgid "Tags"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
+msgid "Slug"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
+msgid "The slug can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:42
+msgid ""
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
+#: mediagoblin/templates/mediagoblin/utils/license.html:20
+msgid "License"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:52
+msgid "Bio"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:58
+msgid "Website"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:60
+msgid "This address contains errors"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
+msgid "License preference"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:87
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:48
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:96
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:103
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:105
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:108
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
+msgid "An entry with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:91
+msgid "You are editing another user's media. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:161
+#, python-format
+msgid "You added the attachment %s!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:188
+msgid "You can only edit your own profile."
+msgstr ""
+
+#: mediagoblin/edit/views.py:194
+msgid "You are editing a user's profile. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:210
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:243
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:277
+msgid "You need to confirm the deletion of your account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:317
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:332
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:370
+msgid "Your password was changed successfully"
+msgstr ""
+
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:60
+msgid "Cannot link theme... no theme set\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:73
+msgid "No asset directory for this theme\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:76
+msgid "However, old link directory symlink found; removed.\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:112
+#, python-format
+msgid "Could not link \"%s\": %s exists and is not a symlink\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:119
+#, python-format
+msgid "Skipping \"%s\"; already set up.\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:124
+#, python-format
+msgid "Old link found for \"%s\"; removing.\n"
+msgstr ""
+
+#: mediagoblin/meddleware/csrf.py:134
+msgid ""
+"CSRF cookie not present. This is most likely the result of a cookie blocker "
+"or somesuch.<br/>Make sure to permit the settings of cookies for this "
+"domain."
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
+msgid "Sorry, I don't support that file type :("
+msgstr ""
+
+#: mediagoblin/media_types/pdf/processing.py:142
+msgid "unoconv failing to run, check log file"
+msgstr ""
+
+#: mediagoblin/media_types/video/processing.py:44
+msgid "Video transcoding failed"
+msgstr ""
+
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
+#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
+msgid "Location"
+msgstr ""
+
+#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:52
+#, python-format
+msgid "View on <a href=\"%(osm_url)s\">OpenStreetMap</a>"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:29
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:34
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:38
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:40
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:45
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:52
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:54
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:66
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:55
+msgid "The client {0} has been registered!"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/templates/oauth/client/connections.html:22
+msgid "OAuth client connections"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/templates/oauth/client/list.html:22
+msgid "Your OAuth clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
+#: mediagoblin/submit/forms.py:26
+msgid "File"
+msgstr ""
+
+#: mediagoblin/submit/views.py:52
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:101
+msgid "Woohoo! Submitted!"
+msgstr ""
+
+#: mediagoblin/submit/views.py:154
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:79
+msgid "Verify your email!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:86
+msgid "log out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:105
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:112
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
+#: mediagoblin/templates/mediagoblin/admin/panel.html:21
+#: mediagoblin/templates/mediagoblin/admin/panel.html:26
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:26
+msgid "Media processing panel"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:125
+msgid "Log out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:128
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
+msgid "Add media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:131
+#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
+msgid "Create new collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/error.html:24
+msgid "Image of goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:32
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:29
+msgid ""
+"Here you can track the state of media being processed on this instance."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:32
+msgid "Media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:58
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:56
+msgid "No media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:61
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:59
+msgid "These uploads failed to process:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:90
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:86
+msgid "No failed entries!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:92
+msgid "Last 10 successful uploads"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:112
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:107
+msgid "No processed entries, yet!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
+msgid "Set your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:39
+msgid "Set password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:23
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:31
+msgid "Recover password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:34
+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:44
+msgid "Don't have an account yet?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
+msgid "Create one here!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:28
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
+msgid "Create an account!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
+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/bits/base_footer.html:21
+#, python-format
+msgid ""
+"Powered by <a href=\"http://mediagoblin.org/\" title='Version "
+"%(version)s'>MediaGoblin</a>, a <a href=\"http://gnu.org/\">GNU</a> project."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/base_footer.html:24
+#, python-format
+msgid ""
+"Released under the <a "
+"href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.html\">AGPL</a>. <a "
+"href=\"%(source_link)s\">Source code</a> available."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:20
+msgid "Explore"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:24
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
+msgid ""
+"To add your own media, place comments, and more, you can log in with your "
+"MediaGoblin account."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
+msgid "Don't have one yet? It's easy!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/logo.html:23
+#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
+msgid "MediaGoblin logo"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:23
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:35
+#, python-format
+msgid "Editing attachments for %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
+msgid "Attachments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
+msgid "Add attachment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:61
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit.html:41
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:67
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:48
+msgid "Cancel"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
+#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
+msgid "Save changes"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
+#, python-format
+msgid "Changing %(username)s's email"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
+msgid "Save"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
+#, python-format
+msgid "Really delete user '%(user_name)s' and all related media/comments?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:35
+msgid "Yes, really delete my account"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:44
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:48
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit.html:35
+#, python-format
+msgid "Editing %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:28
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:34
+#, python-format
+msgid "Editing %(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
+#: 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/audio.html:56
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
+msgid "Download"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:38
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:44
+msgid ""
+"Sorry, this audio will not work because \n"
+"\tyour web browser does not support HTML5 \n"
+"\taudio."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:47
+msgid ""
+"You can get a modern web browser that \n"
+"\tcan play the audio at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
+msgid "Original file"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:63
+msgid "WebM file (Vorbis codec)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:99
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:105
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:65
+#, python-format
+msgid "Image for %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
+msgid "PDF file"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
+msgid "Perspective"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
+msgid "Front"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
+msgid "Top"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+msgid "Side"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
+msgid "WebGL"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
+msgid "Download model"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
+msgid "File Format"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
+msgid "Object Height"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:44
+msgid ""
+"Sorry, this video will not work because\n"
+" your web browser does not support HTML5 \n"
+" video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:47
+msgid ""
+"You can get a modern web browser that \n"
+" can play this video at <a href=\"http://getfirefox.com\">\n"
+" http://getfirefox.com</a>!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:23
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Add your media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:21
+#, python-format
+msgid "%(username)s's collections"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:28
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s collections"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
+#, python-format
+msgid ""
+"Hi %(username)s,\n"
+"%(comment_author)s commented on your post (%(comment_url)s) at %(instance_name)s\n"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:38
+#, python-format
+msgid ""
+"<a href=\"%(user_url)s\">%(username)s</a>'s media with tag <a "
+"href=\"%(tag_url)s\">%(tag)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:48
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:38
+#, python-format
+msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
+msgid "Add a comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
+msgid "Added"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
+#, python-format
+msgid "Add “%(media_title)s†to a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:54
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:58
+msgid "Add a new collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
+msgid ""
+"You can track the state of media being processed for your gallery here."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:89
+msgid "Your last 10 successful uploads"
+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:100
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:117
+msgid "Edit profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:105
+msgid "This user hasn't filled in their profile (yet)."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:124
+msgid "Browse collections"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:137
+#, python-format
+msgid "View all of %(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:150
+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:162
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:84
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:70
+msgid "There doesn't seem to be any media here yet..."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:49
+msgid "(remove)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:21
+msgid "Collected in"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:40
+msgid "Add to a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
+#: mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html:21
+msgid "feed icon"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
+#: mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html:23
+msgid "Atom feed"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/license.html:25
+msgid "All rights reserved"
+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:28
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:33
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:39
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:44
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "Tagged with"
+msgstr ""
+
+#: mediagoblin/tools/exif.py:83
+msgid "Could not read the image file."
+msgstr ""
+
+#: mediagoblin/tools/response.py:36
+msgid "Oops!"
+msgstr ""
+
+#: mediagoblin/tools/response.py:37
+msgid "An error occured"
+msgstr ""
+
+#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
+msgid "Operation not allowed"
+msgstr ""
+
+#: mediagoblin/tools/response.py:61
+msgid ""
+"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
+"function that you are not allowed to. Have you been trying to delete all "
+"user accounts again?"
+msgstr ""
+
+#: mediagoblin/tools/response.py:69
+msgid ""
+"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
+" the address is correct, maybe the page you're looking for has been moved or"
+" deleted."
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:62
+msgid "year"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:63
+msgid "month"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:64
+msgid "week"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:65
+msgid "day"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:66
+msgid "hour"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:67
+msgid "minute"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:23
+msgid "Comment"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:25
+msgid ""
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:31
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:39
+msgid "Collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:40
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:42
+msgid "Include a note"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:179
+msgid "Sorry, comments are disabled."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:184
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:190
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:225
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:265
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:276
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:282
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:302
+msgid "You deleted the media."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:314
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:321
+msgid "You are about to delete another user's media. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:395
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:399
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:407
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:440
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:447
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:455
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/vi_VN/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/vi_VN/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..dfd0a5af
--- /dev/null
+++ b/mediagoblin/i18n/vi_VN/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/vi_VN/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/vi_VN/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..3c94d3f5
--- /dev/null
+++ b/mediagoblin/i18n/vi_VN/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,1558 @@
+# Translations template for PROJECT.
+# Copyright (C) 2013 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/mediagoblin/language/vi_VN/)\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: vi_VN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr ""
+
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25
+msgid "Username or email"
+msgstr ""
+
+#: mediagoblin/auth/tools.py:41
+msgid "Invalid User name or email address."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:42
+msgid "This field does not take email addresses."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:43
+msgid "This field requires an email address."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:146
+msgid "Sorry, a user with that name already exists."
+msgstr ""
+
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
+
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
+msgid ""
+"Your email address has been verified. You may now login, edit your profile, "
+"and submit images!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:167
+msgid "The verification key or user id is incorrect"
+msgstr ""
+
+#: mediagoblin/auth/views.py:185
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:193
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:203
+msgid "Resent your verification email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:237
+msgid ""
+"If that email address (case sensitive!) is registered an email has been sent"
+" with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:248
+msgid "Couldn't find someone with that username."
+msgstr ""
+
+#: mediagoblin/auth/views.py:251
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:258
+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:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
+msgid "You can now log in using your new password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
+#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
+#: mediagoblin/user_pages/forms.py:45
+msgid "Title"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
+msgid "Tags"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
+msgid "Slug"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
+msgid "The slug can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:42
+msgid ""
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
+#: mediagoblin/templates/mediagoblin/utils/license.html:20
+msgid "License"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:52
+msgid "Bio"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:58
+msgid "Website"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:60
+msgid "This address contains errors"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
+msgid "License preference"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:87
+msgid "The title can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
+#: mediagoblin/user_pages/forms.py:48
+msgid "Description of this collection"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:96
+msgid ""
+"The title part of this collection's address. You usually don't need to "
+"change this."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:103
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:105
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:108
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
+msgid "An entry with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:91
+msgid "You are editing another user's media. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:161
+#, python-format
+msgid "You added the attachment %s!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:188
+msgid "You can only edit your own profile."
+msgstr ""
+
+#: mediagoblin/edit/views.py:194
+msgid "You are editing a user's profile. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:210
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:243
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:277
+msgid "You need to confirm the deletion of your account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
+#, python-format
+msgid "You already have a collection called \"%s\"!"
+msgstr ""
+
+#: mediagoblin/edit/views.py:317
+msgid "A collection with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:332
+msgid "You are editing another user's collection. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:370
+msgid "Your password was changed successfully"
+msgstr ""
+
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:60
+msgid "Cannot link theme... no theme set\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:73
+msgid "No asset directory for this theme\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:76
+msgid "However, old link directory symlink found; removed.\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:112
+#, python-format
+msgid "Could not link \"%s\": %s exists and is not a symlink\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:119
+#, python-format
+msgid "Skipping \"%s\"; already set up.\n"
+msgstr ""
+
+#: mediagoblin/gmg_commands/assetlink.py:124
+#, python-format
+msgid "Old link found for \"%s\"; removing.\n"
+msgstr ""
+
+#: mediagoblin/meddleware/csrf.py:134
+msgid ""
+"CSRF cookie not present. This is most likely the result of a cookie blocker "
+"or somesuch.<br/>Make sure to permit the settings of cookies for this "
+"domain."
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
+msgid "Sorry, I don't support that file type :("
+msgstr ""
+
+#: mediagoblin/media_types/pdf/processing.py:142
+msgid "unoconv failing to run, check log file"
+msgstr ""
+
+#: mediagoblin/media_types/video/processing.py:44
+msgid "Video transcoding failed"
+msgstr ""
+
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
+#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
+msgid "Location"
+msgstr ""
+
+#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:52
+#, python-format
+msgid "View on <a href=\"%(osm_url)s\">OpenStreetMap</a>"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:29
+msgid "Allow"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:30
+msgid "Deny"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:34
+msgid "Name"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:35
+msgid "The name of the OAuth client"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:36
+msgid "Description"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:38
+msgid ""
+"This will be visible to users allowing your\n"
+" application to authenticate as them."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:40
+msgid "Type"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:45
+msgid ""
+"<strong>Confidential</strong> - The client can\n"
+" make requests to the GNU MediaGoblin instance that can not be\n"
+" intercepted by the user agent (e.g. server-side client).<br />\n"
+" <strong>Public</strong> - The client can't make confidential\n"
+" requests to the GNU MediaGoblin instance (e.g. client-side\n"
+" JavaScript client)."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:52
+msgid "Redirect URI"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:54
+msgid ""
+"The redirect URI for the applications, this field\n"
+" is <strong>required</strong> for public clients."
+msgstr ""
+
+#: mediagoblin/plugins/oauth/forms.py:66
+msgid "This field is required for public clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/views.py:55
+msgid "The client {0} has been registered!"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/templates/oauth/client/connections.html:22
+msgid "OAuth client connections"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/templates/oauth/client/list.html:22
+msgid "Your OAuth clients"
+msgstr ""
+
+#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
+#: mediagoblin/templates/mediagoblin/submit/collection.html:30
+#: mediagoblin/templates/mediagoblin/submit/start.html:34
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
+#: mediagoblin/submit/forms.py:26
+msgid "File"
+msgstr ""
+
+#: mediagoblin/submit/views.py:52
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:101
+msgid "Woohoo! Submitted!"
+msgstr ""
+
+#: mediagoblin/submit/views.py:154
+#, python-format
+msgid "Collection \"%s\" added!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:79
+msgid "Verify your email!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:86
+msgid "log out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:105
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:112
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
+#: mediagoblin/templates/mediagoblin/admin/panel.html:21
+#: mediagoblin/templates/mediagoblin/admin/panel.html:26
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:26
+msgid "Media processing panel"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:125
+msgid "Log out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:128
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
+msgid "Add media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:131
+#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
+msgid "Create new collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/error.html:24
+msgid "Image of goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:32
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:29
+msgid ""
+"Here you can track the state of media being processed on this instance."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:32
+msgid "Media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:58
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:56
+msgid "No media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:61
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:59
+msgid "These uploads failed to process:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:90
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:86
+msgid "No failed entries!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:92
+msgid "Last 10 successful uploads"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/admin/panel.html:112
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:107
+msgid "No processed entries, yet!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
+msgid "Set your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:39
+msgid "Set password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:23
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:31
+msgid "Recover password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:34
+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:44
+msgid "Don't have an account yet?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
+msgid "Create one here!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:28
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
+msgid "Create an account!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
+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/bits/base_footer.html:21
+#, python-format
+msgid ""
+"Powered by <a href=\"http://mediagoblin.org/\" title='Version "
+"%(version)s'>MediaGoblin</a>, a <a href=\"http://gnu.org/\">GNU</a> project."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/base_footer.html:24
+#, python-format
+msgid ""
+"Released under the <a "
+"href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.html\">AGPL</a>. <a "
+"href=\"%(source_link)s\">Source code</a> available."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:20
+msgid "Explore"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:24
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
+msgid ""
+"To add your own media, place comments, and more, you can log in with your "
+"MediaGoblin account."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
+msgid "Don't have one yet? It's easy!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
+msgid ""
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/logo.html:23
+#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
+msgid "MediaGoblin logo"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:23
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:35
+#, python-format
+msgid "Editing attachments for %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
+msgid "Attachments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
+msgid "Add attachment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:61
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit.html:41
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:46
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:67
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:48
+msgid "Cancel"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
+#: mediagoblin/templates/mediagoblin/edit/edit.html:42
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
+msgid "Save changes"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
+#, python-format
+msgid "Changing %(username)s's email"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
+msgid "Save"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
+#, python-format
+msgid "Really delete user '%(user_name)s' and all related media/comments?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:35
+msgid "Yes, really delete my account"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/delete_account.html:44
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:48
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
+msgid "Delete permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit.html:35
+#, python-format
+msgid "Editing %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:28
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
+#, python-format
+msgid "Editing %(collection_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:23
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:34
+#, python-format
+msgid "Editing %(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/listings/collection.html:30
+#: mediagoblin/templates/mediagoblin/listings/collection.html:35
+#: 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/audio.html:56
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
+msgid "Download"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:38
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:44
+msgid ""
+"Sorry, this audio will not work because \n"
+"\tyour web browser does not support HTML5 \n"
+"\taudio."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:47
+msgid ""
+"You can get a modern web browser that \n"
+"\tcan play the audio at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
+msgid "Original file"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/audio.html:63
+msgid "WebM file (Vorbis codec)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:99
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:105
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:65
+#, python-format
+msgid "Image for %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
+msgid "PDF file"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
+msgid "Perspective"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
+msgid "Front"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
+msgid "Top"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+msgid "Side"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
+msgid "WebGL"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
+msgid "Download model"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
+msgid "File Format"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
+msgid "Object Height"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:44
+msgid ""
+"Sorry, this video will not work because\n"
+" your web browser does not support HTML5 \n"
+" video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:47
+msgid ""
+"You can get a modern web browser that \n"
+" can play this video at <a href=\"http://getfirefox.com\">\n"
+" http://getfirefox.com</a>!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/collection.html:26
+msgid "Add a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:23
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Add your media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:30
+#, python-format
+msgid "%(collection_title)s (%(username)s's collection)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:39
+#, python-format
+msgid "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:52
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:31
+#, python-format
+msgid "Really remove %(media_title)s from %(collection_title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_item_confirm_remove.html:54
+msgid "Remove"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:21
+#, python-format
+msgid "%(username)s's collections"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:28
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s collections"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/comment_email.txt:19
+#, python-format
+msgid ""
+"Hi %(username)s,\n"
+"%(comment_author)s commented on your post (%(comment_url)s) at %(instance_name)s\n"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:38
+#, python-format
+msgid ""
+"<a href=\"%(user_url)s\">%(username)s</a>'s media with tag <a "
+"href=\"%(tag_url)s\">%(tag)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:48
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:38
+#, python-format
+msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
+msgid "Add a comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
+msgid "Added"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
+#, python-format
+msgid "Add “%(media_title)s†to a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:54
+msgid "+"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:58
+msgid "Add a new collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:29
+msgid ""
+"You can track the state of media being processed for your gallery here."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:89
+msgid "Your last 10 successful uploads"
+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:100
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:117
+msgid "Edit profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:105
+msgid "This user hasn't filled in their profile (yet)."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:124
+msgid "Browse collections"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:137
+#, python-format
+msgid "View all of %(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:150
+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:162
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:84
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:70
+msgid "There doesn't seem to be any media here yet..."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collection_gallery.html:49
+msgid "(remove)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:21
+msgid "Collected in"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/collections.html:40
+msgid "Add to a collection"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
+#: mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html:21
+msgid "feed icon"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
+#: mediagoblin/themes/airy/templates/mediagoblin/utils/feed_link.html:23
+msgid "Atom feed"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/license.html:25
+msgid "All rights reserved"
+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:28
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:33
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:39
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:44
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "Tagged with"
+msgstr ""
+
+#: mediagoblin/tools/exif.py:83
+msgid "Could not read the image file."
+msgstr ""
+
+#: mediagoblin/tools/response.py:36
+msgid "Oops!"
+msgstr ""
+
+#: mediagoblin/tools/response.py:37
+msgid "An error occured"
+msgstr ""
+
+#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
+msgid "Operation not allowed"
+msgstr ""
+
+#: mediagoblin/tools/response.py:61
+msgid ""
+"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
+"function that you are not allowed to. Have you been trying to delete all "
+"user accounts again?"
+msgstr ""
+
+#: mediagoblin/tools/response.py:69
+msgid ""
+"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
+" the address is correct, maybe the page you're looking for has been moved or"
+" deleted."
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:62
+msgid "year"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:63
+msgid "month"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:64
+msgid "week"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:65
+msgid "day"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:66
+msgid "hour"
+msgstr ""
+
+#: mediagoblin/tools/timesince.py:67
+msgid "minute"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:23
+msgid "Comment"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:25
+msgid ""
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:31
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:35
+msgid "I am sure I want to remove this item from the collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:39
+msgid "Collection"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:40
+msgid "-- Select --"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:42
+msgid "Include a note"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:179
+msgid "Sorry, comments are disabled."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:184
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:190
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:225
+msgid "Please check your entries and try again."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:265
+msgid "You have to select or add a collection"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:276
+#, python-format
+msgid "\"%s\" already in collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:282
+#, python-format
+msgid "\"%s\" added to collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:302
+msgid "You deleted the media."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:314
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:321
+msgid "You are about to delete another user's media. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:395
+msgid "You deleted the item from the collection."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:399
+msgid "The item was not removed because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:407
+msgid ""
+"You are about to delete an item from another user's collection. Proceed with"
+" caution."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:440
+#, python-format
+msgid "You deleted the collection \"%s\""
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:447
+msgid ""
+"The collection was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:455
+msgid ""
+"You are about to delete another user's collection. Proceed with caution."
+msgstr ""
diff --git a/mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.mo
index 1ed5a4f1..7c1bcda8 100644
--- a/mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.po
index 4bb714fe..b5122636 100644
--- a/mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/zh_CN/LC_MESSAGES/mediagoblin.po
@@ -12,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-06-16 11:06+0000\n"
-"Last-Translator: m13253 <m13253@hotmail.com>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/mediagoblin/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,250 +23,280 @@ msgstr ""
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "用户å"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "密ç "
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "电å­é‚®ä»¶åœ°å€"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "æŠ±æ­‰ï¼Œæœ¬ç«™å·²æš‚åœæ³¨å†Œã€‚"
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "ç”¨æˆ·åæˆ–电å­é‚®ä»¶"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "ç”¨æˆ·åæˆ–电å­é‚®ä»¶"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "æ— æ•ˆç”¨æˆ·åæˆ–电å­é‚®ä»¶åœ°å€ã€‚"
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "此字段ä¸èƒ½å¡«å†™ç”µå­é‚®ä»¶åœ°å€ã€‚"
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "此字段需填写电å­é‚®ä»¶åœ°å€ã€‚"
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "æŠ±æ­‰ï¼Œæœ¬ç«™å·²æš‚åœæ³¨å†Œã€‚"
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "抱歉,该用户å已存在。"
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "抱歉,已有用户用该电å­é‚®ä»¶æ³¨å†Œã€‚"
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "您的电å­é‚®ä»¶åœ°å€å·²è®¤è¯ã€‚您现在å¯ä»¥ç™»å½•ã€ä¿®æ”¹ä¸ªäººèµ„料并上传图片了ï¼"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "验è¯ç é”™è¯¯æˆ–用户 ID 错误"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "您必须登录以便让我们知é“将电å­é‚®ä»¶å‘ç»™è°"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "您已ç»è®¤è¯è¿‡ç”µå­é‚®ä»¶åœ°å€äº†ï¼"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "é‡å‘认è¯é‚®ä»¶ã€‚"
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "若该邮件地å€ï¼ˆåŒºåˆ†å¤§å°å†™ï¼‰å·²è¢«æ³¨å†Œï¼Œåˆ™å¯†ç ä¿®æ”¹è¯´æ˜Žå·²é€šè¿‡ç”µå­é‚®ä»¶é€è¾¾ã€‚"
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "找ä¸åˆ°æœ‰è¯¥ç”¨æˆ·å的人。"
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "密ç ä¿®æ”¹è¯´æ˜Žå·²é€šè¿‡ç”µå­é‚®ä»¶é€è¾¾ã€‚"
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "您现在å¯ä»¥ç”¨æ–°çš„å¯†ç æ¥ç™»å½•了ï¼"
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "标题"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "该作å“çš„æè¿°"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "您å¯ä»¥ç”¨ <a href=\"http://wowubuntu.com/markdown/\">Markdown</a> æ¥æŽ’ç‰ˆã€‚"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "标签"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "用逗å·åˆ†é𔿠‡ç­¾ã€‚"
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "简称"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "简称ä¸èƒ½ä¸ºç©º"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "该媒体网å€çš„æ ‡é¢˜éƒ¨ä»½ã€‚通常ä¸éœ€è¦ä¿®æ”¹ã€‚"
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "许å¯è¯"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "个性签å"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "网站"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "本网å€å‡ºé”™äº†"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "当有人对我的媒体评论时给我电å­é‚®ä»¶"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "许å¯è¯å好"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "这将是您上传界é¢çš„默认许å¯è¯ã€‚"
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "当有人对我的媒体评论时给我电å­é‚®ä»¶"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "标题ä¸èƒ½æ˜¯ç©ºçš„"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "这个åˆé›†çš„æè¿°"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "æ­¤åˆé›†ç½‘å€çš„æ ‡é¢˜éƒ¨ä»½ï¼Œé€šå¸¸ä¸éœ€è¦ä¿®æ”¹ã€‚"
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "旧的密ç "
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "è¾“å…¥æ‚¨çš„æ—§å¯†ç æ¥è¯æ˜Žæ‚¨æ‹¥æœ‰è¿™ä¸ªè´¦æˆ·ã€‚"
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "新密ç "
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "密ç "
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "这个简称已ç»è¢«åˆ«äººç”¨äº†"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "您正在修改别人的媒体,请å°å¿ƒæ“作。"
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "您加上了附件“%sâ€ï¼"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "您åªèƒ½ä¿®æ”¹è‡ªå·±çš„个人资料"
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "您正在修改别人的个人资料,请å°å¿ƒæ“作。"
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "个人资料已修改"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "账户设置已ä¿å­˜"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "您需è¦ç¡®è®¤åˆ é™¤æ‚¨çš„账户。"
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "æ‚¨å·²ç»æœ‰ä¸€ä¸ªç§°åšâ€œ%sâ€çš„åˆé›†äº†ï¼"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "è¯¥ç”¨æˆ·å·²ç»æœ‰ä½¿ç”¨è¯¥ç®€ç§°çš„åˆé›†äº†ã€‚"
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "您正在修改别人的åˆé›†ï¼Œè¯·å°å¿ƒæ“作。"
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "密ç é”™è¯¯"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "您的密ç å·²æˆåŠŸä¿®æ”¹"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "无法链接到主题……未设置主题\n"
@@ -301,19 +331,62 @@ msgid ""
"domain."
msgstr "CSRF cookie ä¸å­˜åœ¨ã€‚很å¯èƒ½æ˜¯ç”±ç±»ä¼¼ cookie å±è”½å™¨é€ æˆçš„。<br />请å…许本域åçš„ cookie 设定。"
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "æŠ±æ­‰ï¼Œæˆ‘ä¸æ”¯æŒè¿™æ ·çš„æ–‡ä»¶æ ¼å¼ :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr "无法è¿è¡Œ unoconv,请检查日志"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "视频转ç å¤±è´¥"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "在您的内容张贴评论"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "用户å"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "电å­é‚®ä»¶åœ°å€"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "ç”¨æˆ·åæˆ–电å­é‚®ä»¶"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "ä½ç½®"
@@ -377,7 +450,7 @@ msgstr "此应用程åºçš„é‡å®šå‘ URI,本字段在公开类型的 OAuth clie
msgid "This field is required for public clients"
msgstr "本字段在公开类型的 OAuth client 为必填"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "OAuth client {0} 注册完æˆï¼"
@@ -390,59 +463,209 @@ msgid "Your OAuth clients"
msgstr "您的 OAuth client"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "增加"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "删除"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "登录"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "登录失败ï¼"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "æä¾›æ–‡ä»¶çš„媒体类型错误。"
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "文件"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "您必须æä¾›ä¸€ä¸ªæ–‡ä»¶"
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "啊哈ï¼å·²æäº¤ï¼"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "åˆé›†â€œ%sâ€å·²æ–°å¢žï¼"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "确认您的电å­é‚®ä»¶ï¼"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "登出"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "登录"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "<a href=\"%(user_url)s\">%(user_name)s</a> 的账户"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "更改账户设置"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -450,16 +673,16 @@ msgstr "更改账户设置"
msgid "Media processing panel"
msgstr "媒体处ç†é¢æ¿"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "登出"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "新增媒体"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "新增åˆé›†"
@@ -506,6 +729,59 @@ msgstr "最近 10 次æˆåŠŸä¸Šä¼ çš„çºªå½•"
msgid "No processed entries, yet!"
msgstr "现在还没有处ç†çš„纪录ï¼"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -538,19 +814,15 @@ msgid ""
"a happy goblin!"
msgstr "%(username)s 您好:\n\nè¦ä¿®æ”¹ GNU MediaGoblin 的密ç ï¼Œè¯·åœ¨æ‚¨çš„æµè§ˆå™¨ä¸­æ‰“å¼€ä¸‹é¢çš„网å€ï¼š\n\n%(verification_url)s\n\n如果您认为这个是个误会,请忽略此å°ä¿¡ä»¶ï¼Œç»§ç»­å½“个快ä¹çš„哥布林ï¼"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "登录失败ï¼"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "还没有账户å—?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "在这里建立一个å§ï¼"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "忘了密ç å—?"
@@ -559,7 +831,7 @@ msgstr "忘了密ç å—?"
msgid "Create an account!"
msgstr "建立一个账户ï¼"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "建立"
@@ -593,7 +865,7 @@ msgstr "以 <a href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.html\">AGPL
msgid "Explore"
msgstr "探索"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "å˜¿ï¼æ¬¢è¿Žæ¥åˆ° MediaGoblin ç«™ï¼ "
@@ -603,23 +875,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "本站使用 <a href=\"http://mediagoblin.org\">MediaGoblin</a>——与众ä¸åŒçš„媒体分享网站。"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "您å¯ä»¥ç™»å½•您的 MediaGoblin 账户以上传媒体ã€å¼ è´´è¯„论等等。"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "没有账户å—?开账户很简å•ï¼"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">åœ¨æœ¬ç«™åˆ›å»ºå¸æˆ·</a>\n 或者\n <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">在您自己的æœåŠ¡å™¨ä¸Šæ­å»º MediaGoblin</a>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -633,13 +910,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "编辑 %(media_title)s 的附件"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "附件"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "新增附件"
@@ -656,22 +933,29 @@ msgstr "å–æ¶ˆ"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "ä¿å­˜æ›´æ”¹"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "修改 %(username)s 的密ç "
+msgid "Changing %(username)s's email"
+msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "ä¿å­˜"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "修改 %(username)s 的密ç "
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -699,14 +983,14 @@ msgstr "编辑 %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "æ­£åœ¨æ”¹å˜ %(username)s 的账户设置"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "修改您的密ç ã€‚"
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "åˆ é™¤æˆ‘çš„å¸æˆ·"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -718,6 +1002,36 @@ msgstr "编辑 %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "编辑 %(username)s 的个人资料"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "%(formatted_time)så‰"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -728,8 +1042,7 @@ msgstr "此媒体被标记为:%(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "下载"
@@ -753,7 +1066,7 @@ msgid ""
msgstr "您å¯ä»¥åœ¨ <a href=\"http://getfirefox.com\">http://getfirefox.com</a> å–å¾—å¯ä»¥æ’­æ”¾æ­¤å£°éŸ³çš„æµè§ˆå™¨ï¼"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "æºæ–‡ä»¶"
@@ -762,6 +1075,10 @@ msgstr "æºæ–‡ä»¶"
msgid "WebM file (Vorbis codec)"
msgstr "WebM 文件(Vorbis ç¼–ç ï¼‰"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "已创建"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -773,49 +1090,41 @@ msgstr "WebM 文件(Vorbis ç¼–ç ï¼‰"
msgid "Image for %(media_title)s"
msgstr "%(media_title)s 的照片"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "PDF 文件"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "åˆ‡æ¢æ—‹è½¬"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "é€è§†"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "æ­£é¢"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "é¡¶é¢"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "ä¾§é¢"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "下载模型"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "文件格å¼"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
-msgstr "对象高度"
+msgstr "物体高度"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:44
msgid ""
@@ -832,8 +1141,8 @@ msgid ""
msgstr "您å¯ä»¥åœ¨ <a href=\"http://getfirefox.com\">http://getfirefox.com</a> å–å¾—å¯ä»¥æ’­æ”¾æ­¤è§†é¢‘çš„æµè§ˆå™¨ï¼"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "WebM 文件(640p;VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -859,11 +1168,6 @@ msgstr "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "编辑"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "删除"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -918,29 +1222,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a> 的媒体"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "â– æµè§ˆ <a href=\"%(user_url)s\">%(username)s</a> 的媒体"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "新增评论"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "增加评论"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "%(formatted_time)så‰"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "已增加"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "已创建"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1099,26 +1396,34 @@ msgstr "标签"
msgid "Could not read the image file."
msgstr "无法读å–图片文件。"
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "糟糕ï¼"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "å‘生错误"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "æ“作ä¸å…许"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "对ä¸èµ·è€å…„,我ä¸èƒ½è®©ä½ è¿™æ ·åšï¼</p><p>æ‚¨æ­£åœ¨è¯•ç€æ“作ä¸å…è®¸æ‚¨ä½¿ç”¨çš„åŠŸèƒ½ã€‚æ‚¨éš¾é“æƒ³æ‰“算删除所有用户账户å—?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1155,10 +1460,9 @@ msgstr "评论"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "您å¯ä»¥ç”¨ <a href=\"http://wowubuntu.com/markdown/\">Markdown</a> æ¥æŽ’ç‰ˆã€‚"
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1180,77 +1484,80 @@ msgstr "— 请选择 —"
msgid "Include a note"
msgstr "加注"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "在您的内容张贴评论"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "抱歉,ä¸å¼€æ”¾è¯„论。"
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "啊,您的评论是空的。"
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "您的评论已ç»å¼ è´´å®Œæˆï¼"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "请检查项目并é‡è¯•。"
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "您需è¦é€‰æ‹©æˆ–是新增一个åˆé›†"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "“%sâ€å·²ç»åœ¨â€œ%sâ€åˆé›†"
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "“%sâ€åŠ å…¥â€œ%sâ€åˆé›†"
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "您已ç»åˆ é™¤æ­¤åª’体。"
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "由于您没有勾选确认,该媒体没有被移除。"
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "您正在删除别人的媒体,请å°å¿ƒæ“作。"
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "您已ç»ä»Žè¯¥åˆé›†ä¸­åˆ é™¤è¯¥é¡¹ç›®ã€‚"
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "由于您没有勾选确认,该项目没有被移除。"
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "您正在从别人的åˆé›†ä¸­åˆ é™¤é¡¹ç›®ï¼Œè¯·å°å¿ƒæ“作。"
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "您已ç»åˆ é™¤â€œ%sâ€åˆé›†ã€‚"
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "由于您没有勾选确认,该åˆé›†æ²¡æœ‰è¢«ç§»é™¤ã€‚"
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "您正在删除别人的åˆé›†ï¼Œè¯·å°å¿ƒæ“作。"
diff --git a/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mo
index c234ff00..888052fb 100644
--- a/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po
index a7ee8db6..51759424 100644
--- a/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/zh_TW.Big5/LC_MESSAGES/mediagoblin.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-05-27 18:54+0000\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Chinese (Taiwan) (Big5) (http://www.transifex.com/projects/p/mediagoblin/language/zh_TW.Big5/)\n"
"MIME-Version: 1.0\n"
@@ -18,250 +18,280 @@ msgstr ""
"Language: zh_TW.Big5\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr ""
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr ""
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr ""
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr ""
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr ""
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr ""
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr ""
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr ""
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr ""
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr ""
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr ""
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr ""
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr ""
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr ""
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr ""
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr ""
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr ""
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr ""
-#: mediagoblin/edit/forms.py:63
-msgid "License preference"
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
msgstr ""
#: mediagoblin/edit/forms.py:69
-msgid "This will be your default license on upload forms."
+msgid "License preference"
msgstr ""
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
+#: mediagoblin/edit/forms.py:75
+msgid "This will be your default license on upload forms."
msgstr ""
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr ""
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr ""
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr ""
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr ""
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr ""
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr ""
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr ""
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr ""
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr ""
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr ""
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr ""
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr ""
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr ""
@@ -296,19 +326,62 @@ msgid ""
"domain."
msgstr ""
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr ""
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr ""
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr ""
@@ -372,7 +445,7 @@ msgstr ""
msgid "This field is required for public clients"
msgstr ""
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr ""
@@ -385,59 +458,209 @@ msgid "Your OAuth clients"
msgstr ""
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr ""
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr ""
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr ""
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -445,16 +668,16 @@ msgstr ""
msgid "Media processing panel"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr ""
@@ -501,6 +724,59 @@ msgstr ""
msgid "No processed entries, yet!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -533,19 +809,15 @@ msgid ""
"a happy goblin!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr ""
@@ -554,7 +826,7 @@ msgstr ""
msgid "Create an account!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr ""
@@ -588,7 +860,7 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
@@ -598,22 +870,27 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
@@ -628,13 +905,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr ""
@@ -651,22 +928,29 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
+msgid "Changing %(username)s's email"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -694,12 +978,12 @@ msgstr ""
msgid "Changing %(username)s's account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
+msgid "Delete my account"
msgstr ""
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
-msgid "Delete my account"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
@@ -713,6 +997,36 @@ msgstr ""
msgid "Editing %(username)s's profile"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -723,8 +1037,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr ""
@@ -748,7 +1061,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr ""
@@ -757,6 +1070,10 @@ msgstr ""
msgid "WebM file (Vorbis codec)"
msgstr ""
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -768,47 +1085,39 @@ msgstr ""
msgid "Image for %(media_title)s"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr ""
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr ""
@@ -827,7 +1136,7 @@ msgid ""
msgstr ""
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
@@ -854,11 +1163,6 @@ msgstr ""
msgid "Edit"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -913,29 +1217,22 @@ msgstr ""
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr ""
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1094,26 +1391,34 @@ msgstr ""
msgid "Could not read the image file."
msgstr ""
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr ""
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr ""
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr ""
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr ""
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1150,9 +1455,8 @@ msgstr ""
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
msgstr ""
#: mediagoblin/user_pages/forms.py:31
@@ -1175,77 +1479,80 @@ msgstr ""
msgid "Include a note"
msgstr ""
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr ""
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr ""
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr ""
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr ""
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr ""
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr ""
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr ""
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr ""
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. 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 4b7a2398..5e8ec911 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 05ecd4b5..586f3766 100644
--- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
@@ -12,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://issues.mediagoblin.org/\n"
-"POT-Creation-Date: 2013-05-27 13:54-0500\n"
-"PO-Revision-Date: 2013-06-16 01:40+0000\n"
-"Last-Translator: m13253 <m13253@hotmail.com>\n"
+"POT-Creation-Date: 2013-09-04 16:02-0500\n"
+"PO-Revision-Date: 2013-09-04 21:03+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/mediagoblin/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,250 +23,280 @@ msgstr ""
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: mediagoblin/auth/forms.py:26
-msgid "Username"
-msgstr "使用者å稱"
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
-#: mediagoblin/tests/test_util.py:110
-msgid "Password"
-msgstr "密碼"
-
-#: mediagoblin/auth/forms.py:34
-msgid "Email address"
-msgstr "Email ä½å€"
+#: mediagoblin/decorators.py:252
+msgid "Sorry, registration is disabled on this instance."
+msgstr "抱歉,本站已經暫åœè¨»å†Šã€‚"
-#: mediagoblin/auth/forms.py:41
-msgid "Username or Email"
-msgstr "使用者å稱或 email"
+#: mediagoblin/decorators.py:268 mediagoblin/plugins/openid/views.py:202
+#: mediagoblin/plugins/persona/views.py:77
+msgid "Sorry, authentication is disabled on this instance."
+msgstr ""
-#: mediagoblin/auth/forms.py:52
+#: mediagoblin/auth/forms.py:25
msgid "Username or email"
msgstr "使用者å稱或 email"
-#: mediagoblin/auth/tools.py:31
+#: mediagoblin/auth/tools.py:41
msgid "Invalid User name or email address."
msgstr "無效的使用者å稱或 email ä½ç½®ã€‚"
-#: mediagoblin/auth/tools.py:32
+#: mediagoblin/auth/tools.py:42
msgid "This field does not take email addresses."
msgstr "本欄ä½ä¸æŽ¥å— email ä½ç½®ã€‚"
-#: mediagoblin/auth/tools.py:33
+#: mediagoblin/auth/tools.py:43
msgid "This field requires an email address."
msgstr "本欄ä½éœ€è¦ email ä½ç½®ã€‚"
-#: mediagoblin/auth/views.py:54
-msgid "Sorry, registration is disabled on this instance."
-msgstr "抱歉,本站已經暫åœè¨»å†Šã€‚"
-
-#: mediagoblin/auth/views.py:68
+#: mediagoblin/auth/tools.py:146
msgid "Sorry, a user with that name already exists."
msgstr "抱歉,這個使用者å稱已經存在。"
-#: mediagoblin/auth/views.py:72
+#: mediagoblin/auth/tools.py:150 mediagoblin/edit/views.py:442
msgid "Sorry, a user with that email address already exists."
msgstr "抱歉,此 email ä½ç½®å·²ç¶“被註冊了。"
-#: mediagoblin/auth/views.py:182
+#: mediagoblin/auth/views.py:145 mediagoblin/auth/views.py:293
+#: mediagoblin/edit/views.py:398 mediagoblin/edit/views.py:419
+msgid "The verification key or user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:161
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "您的 email ä½å€å·²è¢«èªè­‰ã€‚您已經å¯ä»¥ç™»å…¥ï¼Œç·¨è¼¯æ‚¨çš„個人檔案並上傳圖片ï¼"
-#: mediagoblin/auth/views.py:188
+#: mediagoblin/auth/views.py:167
msgid "The verification key or user id is incorrect"
msgstr "èªè­‰ç¢¼æˆ–是使用者 ID 錯誤"
-#: mediagoblin/auth/views.py:206
+#: mediagoblin/auth/views.py:185
msgid "You must be logged in so we know who to send the email to!"
msgstr "您必須登入,我們æ‰çŸ¥é“ä¿¡è¦é€çµ¦èª°ï¼"
-#: mediagoblin/auth/views.py:214
+#: mediagoblin/auth/views.py:193
msgid "You've already verified your email address!"
msgstr "您的電å­éƒµä»¶å·²ç¶“確èªäº†ï¼"
-#: mediagoblin/auth/views.py:227
+#: mediagoblin/auth/views.py:203
msgid "Resent your verification email."
msgstr "é‡é€èªè­‰ä¿¡ã€‚"
-#: mediagoblin/auth/views.py:258
+#: mediagoblin/auth/views.py:237
msgid ""
"If that email address (case sensitive!) is registered an email has been sent"
" with instructions on how to change your password."
msgstr "如果那 email ä½ç½® (請注æ„大å°å¯«) 已經註冊,寫有修改密碼步驟的 email 已經é€å‡ºã€‚"
-#: mediagoblin/auth/views.py:269
+#: mediagoblin/auth/views.py:248
msgid "Couldn't find someone with that username."
msgstr "找ä¸åˆ°ç›¸é—œçš„使用者å稱。"
-#: mediagoblin/auth/views.py:272
+#: mediagoblin/auth/views.py:251
msgid ""
"An email has been sent with instructions on how to change your password."
msgstr "修改密碼的指示已經由電å­éƒµä»¶å¯„é€åˆ°æ‚¨çš„信箱。"
-#: mediagoblin/auth/views.py:279
+#: mediagoblin/auth/views.py:258
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:336
+#: mediagoblin/auth/views.py:306
+msgid "The user id is incorrect."
+msgstr ""
+
+#: mediagoblin/auth/views.py:323
msgid "You can now log in using your new password."
msgstr "您ç¾åœ¨å¯ä»¥ç”¨æ–°çš„密碼登入了ï¼"
-#: mediagoblin/edit/forms.py:25 mediagoblin/edit/forms.py:82
+#: mediagoblin/auth/views.py:334
+msgid "You need to verify your email before you can reset your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:340
+msgid ""
+"You are no longer an active user. Please contact the system admin to "
+"reactivate your account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/edit/forms.py:86
#: mediagoblin/submit/forms.py:28 mediagoblin/submit/forms.py:47
#: mediagoblin/user_pages/forms.py:45
msgid "Title"
msgstr "標題"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:31
msgid "Description of this work"
msgstr "這個作å“çš„æè¿°"
-#: mediagoblin/edit/forms.py:29 mediagoblin/edit/forms.py:52
-#: mediagoblin/edit/forms.py:86 mediagoblin/submit/forms.py:32
-#: mediagoblin/submit/forms.py:51 mediagoblin/user_pages/forms.py:49
+#: mediagoblin/edit/forms.py:31 mediagoblin/edit/forms.py:54
+#: mediagoblin/edit/forms.py:90 mediagoblin/submit/forms.py:32
+#: mediagoblin/submit/forms.py:51
msgid ""
"You can use\n"
" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
" Markdown</a> for formatting."
msgstr "您å¯ä»¥ç”¨ <a href=\"http://markdown.tw\">Markdown</a> 來排版。"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:36
+#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:36
msgid "Tags"
msgstr "標籤"
-#: mediagoblin/edit/forms.py:35 mediagoblin/submit/forms.py:38
+#: mediagoblin/edit/forms.py:37 mediagoblin/submit/forms.py:38
msgid "Separate tags by commas."
msgstr "用逗號分隔標籤。"
-#: mediagoblin/edit/forms.py:38 mediagoblin/edit/forms.py:90
+#: mediagoblin/edit/forms.py:40 mediagoblin/edit/forms.py:94
msgid "Slug"
msgstr "簡稱"
-#: mediagoblin/edit/forms.py:39 mediagoblin/edit/forms.py:91
+#: mediagoblin/edit/forms.py:41 mediagoblin/edit/forms.py:95
msgid "The slug can't be empty"
msgstr "簡稱ä¸èƒ½ç‚ºç©ºç™½"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid ""
"The title part of this media's address. You usually don't need to change "
"this."
msgstr "此媒體網å€çš„æ¨™é¡Œéƒ¨ä»½ã€‚通常ä¸éœ€è¦ä¿®æ”¹ã€‚"
-#: mediagoblin/edit/forms.py:44 mediagoblin/submit/forms.py:41
+#: mediagoblin/edit/forms.py:46 mediagoblin/submit/forms.py:41
#: mediagoblin/templates/mediagoblin/utils/license.html:20
msgid "License"
msgstr "授權"
-#: mediagoblin/edit/forms.py:50
+#: mediagoblin/edit/forms.py:52
msgid "Bio"
msgstr "自我介紹"
-#: mediagoblin/edit/forms.py:56
+#: mediagoblin/edit/forms.py:58
msgid "Website"
msgstr "網站"
-#: mediagoblin/edit/forms.py:58
+#: mediagoblin/edit/forms.py:60
msgid "This address contains errors"
msgstr "本網å€å‡ºéŒ¯äº†"
-#: mediagoblin/edit/forms.py:63
+#: mediagoblin/edit/forms.py:65
+msgid "Email me when others comment on my media"
+msgstr "ç•¶æœ‰äººå°æˆ‘的媒體留言時寄信給我"
+
+#: mediagoblin/edit/forms.py:67
+msgid "Enable insite notifications about events."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:69
msgid "License preference"
msgstr "授權å好"
-#: mediagoblin/edit/forms.py:69
+#: mediagoblin/edit/forms.py:75
msgid "This will be your default license on upload forms."
msgstr "在上傳é é¢ï¼Œé€™å°‡æœƒæ˜¯æ‚¨é è¨­çš„æŽˆæ¬Šæ¨¡å¼ã€‚"
-#: mediagoblin/edit/forms.py:71
-msgid "Email me when others comment on my media"
-msgstr "ç•¶æœ‰äººå°æˆ‘的媒體留言時寄信給我"
-
-#: mediagoblin/edit/forms.py:83
+#: mediagoblin/edit/forms.py:87
msgid "The title can't be empty"
msgstr "標題ä¸èƒ½æ˜¯ç©ºçš„"
-#: mediagoblin/edit/forms.py:85 mediagoblin/submit/forms.py:50
+#: mediagoblin/edit/forms.py:89 mediagoblin/submit/forms.py:50
#: mediagoblin/user_pages/forms.py:48
msgid "Description of this collection"
msgstr "這個è’è—çš„æè¿°"
-#: mediagoblin/edit/forms.py:92
+#: mediagoblin/edit/forms.py:96
msgid ""
"The title part of this collection's address. You usually don't need to "
"change this."
msgstr "æ­¤è’è—ç¶²å€çš„æ¨™é¡Œéƒ¨ä»½ï¼Œé€šå¸¸ä¸éœ€è¦ä¿®æ”¹ã€‚"
-#: mediagoblin/edit/forms.py:99
+#: mediagoblin/edit/forms.py:103
msgid "Old password"
msgstr "舊的密碼"
-#: mediagoblin/edit/forms.py:101
+#: mediagoblin/edit/forms.py:105
msgid "Enter your old password to prove you own this account."
msgstr "è¼¸å…¥æ‚¨çš„èˆŠå¯†ç¢¼ä¾†è­‰æ˜Žæ‚¨æ“æœ‰é€™å€‹å¸³è™Ÿã€‚"
-#: mediagoblin/edit/forms.py:104
+#: mediagoblin/edit/forms.py:108
msgid "New password"
msgstr "新密碼"
-#: mediagoblin/edit/views.py:67
+#: mediagoblin/edit/forms.py:116
+msgid "New email address"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:120 mediagoblin/plugins/basic_auth/forms.py:28
+#: mediagoblin/plugins/basic_auth/forms.py:43
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:63
+#: mediagoblin/tests/test_util.py:110
+msgid "Password"
+msgstr "密碼"
+
+#: mediagoblin/edit/forms.py:122
+msgid "Enter your password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/views.py:73
msgid "An entry with that slug already exists for this user."
msgstr "這個簡稱已經被其他人用了"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:91
msgid "You are editing another user's media. Proceed with caution."
msgstr "您正在修改別人的媒體,請å°å¿ƒæ“作。"
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:161
#, python-format
msgid "You added the attachment %s!"
msgstr "您加上了附件「%sã€ï¼"
-#: mediagoblin/edit/views.py:182
+#: mediagoblin/edit/views.py:188
msgid "You can only edit your own profile."
msgstr "您åªèƒ½ä¿®æ”¹æ‚¨è‡ªå·±çš„個人檔案。"
-#: mediagoblin/edit/views.py:188
+#: mediagoblin/edit/views.py:194
msgid "You are editing a user's profile. Proceed with caution."
msgstr "您正在修改別人的個人檔案,請å°å¿ƒæ“作。"
-#: mediagoblin/edit/views.py:204
+#: mediagoblin/edit/views.py:210
msgid "Profile changes saved"
msgstr "個人檔案修改已儲存"
-#: mediagoblin/edit/views.py:240
+#: mediagoblin/edit/views.py:243
msgid "Account settings saved"
msgstr "帳號設定已儲存"
-#: mediagoblin/edit/views.py:274
+#: mediagoblin/edit/views.py:277
msgid "You need to confirm the deletion of your account."
msgstr "您必須è¦ç¢ºèªæ˜¯å¦åˆªé™¤æ‚¨çš„帳號。"
-#: mediagoblin/edit/views.py:310 mediagoblin/submit/views.py:138
-#: mediagoblin/user_pages/views.py:222
+#: mediagoblin/edit/views.py:313 mediagoblin/submit/views.py:148
+#: mediagoblin/user_pages/views.py:242
#, python-format
msgid "You already have a collection called \"%s\"!"
msgstr "您已經有一個稱åšã€Œ%sã€çš„è’è—了ï¼"
-#: mediagoblin/edit/views.py:314
+#: mediagoblin/edit/views.py:317
msgid "A collection with that slug already exists for this user."
msgstr "這個使用者已經有使用該簡稱的è’è—了。"
-#: mediagoblin/edit/views.py:329
+#: mediagoblin/edit/views.py:332
msgid "You are editing another user's collection. Proceed with caution."
msgstr "您正在修改別人的è’è—,請å°å¿ƒæ“作。"
-#: mediagoblin/edit/views.py:348
+#: mediagoblin/edit/views.py:355 mediagoblin/edit/views.py:448
msgid "Wrong password"
msgstr "密碼錯誤"
-#: mediagoblin/edit/views.py:363
+#: mediagoblin/edit/views.py:370
msgid "Your password was changed successfully"
msgstr "您的密碼已經æˆåŠŸä¿®æ”¹"
+#: mediagoblin/edit/views.py:413
+msgid "Your email address has been verified."
+msgstr ""
+
#: mediagoblin/gmg_commands/assetlink.py:60
msgid "Cannot link theme... no theme set\n"
msgstr "無法連çµä½ˆæ™¯â€¦æ²’有此佈景\n"
@@ -301,19 +331,62 @@ msgid ""
"domain."
msgstr "è·¨ç¶²ç«™å­˜å– (CSRF) çš„ cookie ä¸å­˜åœ¨ï¼Œæœ‰å¯èƒ½æ˜¯ cookie 阻擋程å¼ä¹‹é¡žçš„程å¼å°Žè‡´çš„。<br/>è«‹å…許此網域的 cookie 設定。"
-#: mediagoblin/media_types/__init__.py:111
-#: mediagoblin/media_types/__init__.py:155
+#: mediagoblin/media_types/__init__.py:78
+#: mediagoblin/media_types/__init__.py:100
msgid "Sorry, I don't support that file type :("
msgstr "æŠ±æ­‰ï¼Œæˆ‘ä¸æ”¯æ´é€™æ¨£çš„æª”æ¡ˆæ ¼å¼ :("
-#: mediagoblin/media_types/pdf/processing.py:136
+#: mediagoblin/media_types/pdf/processing.py:142
msgid "unoconv failing to run, check log file"
msgstr "unoconv 無法執行,請檢查紀錄檔"
-#: mediagoblin/media_types/video/processing.py:37
+#: mediagoblin/media_types/video/processing.py:44
msgid "Video transcoding failed"
msgstr "å½±åƒè½‰ç¢¼å¤±æ•—"
+#: mediagoblin/notifications/tools.py:54 mediagoblin/user_pages/lib.py:58
+msgid "commented on your post"
+msgstr "在您的內容張貼留言"
+
+#: mediagoblin/notifications/views.py:35
+#, python-format
+msgid "Subscribed to comments on %s!"
+msgstr ""
+
+#: mediagoblin/notifications/views.py:48
+#, python-format
+msgid "You will not receive notifications for comments on %s."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:239
+msgid "Must provide an oauth_token."
+msgstr ""
+
+#: mediagoblin/oauth/views.py:244 mediagoblin/oauth/views.py:294
+msgid "No request token found."
+msgstr ""
+
+#: mediagoblin/plugins/basic_auth/forms.py:24
+#: mediagoblin/plugins/openid/forms.py:27
+#: mediagoblin/plugins/persona/forms.py:24
+msgid "Username"
+msgstr "使用者å稱"
+
+#: mediagoblin/plugins/basic_auth/forms.py:32
+#: mediagoblin/plugins/openid/forms.py:31
+#: mediagoblin/plugins/persona/forms.py:28
+#: mediagoblin/plugins/persona/forms.py:39
+msgid "Email address"
+msgstr "Email ä½å€"
+
+#: mediagoblin/plugins/basic_auth/forms.py:39
+msgid "Username or Email"
+msgstr "使用者å稱或 email"
+
+#: mediagoblin/plugins/basic_auth/forms.py:46
+msgid "Stay logged in"
+msgstr ""
+
#: mediagoblin/plugins/geolocation/templates/mediagoblin/plugins/geolocation/map.html:24
msgid "Location"
msgstr "ä½ç½®"
@@ -377,7 +450,7 @@ msgstr "此應用程å¼çš„é‡å®šå‘ URI,本欄ä½åœ¨å…¬é–‹é¡žåž‹çš„ OAuth 用æ
msgid "This field is required for public clients"
msgstr "本欄ä½åœ¨å…¬é–‹é¡žåž‹çš„用戶程å¼ç‚ºå¿…å¡«"
-#: mediagoblin/plugins/oauth/views.py:56
+#: mediagoblin/plugins/oauth/views.py:55
msgid "The client {0} has been registered!"
msgstr "OAuth ç”¨æˆ¶ç¨‹å¼ {0} 註冊完æˆï¼"
@@ -390,59 +463,209 @@ msgid "Your OAuth clients"
msgstr "您的 OAuth 用戶程å¼"
#: mediagoblin/plugins/oauth/templates/oauth/client/register.html:29
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:39
#: mediagoblin/templates/mediagoblin/submit/collection.html:30
#: mediagoblin/templates/mediagoblin/submit/start.html:34
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:68
msgid "Add"
msgstr "增加"
-#: mediagoblin/processing/__init__.py:193
+#: mediagoblin/plugins/openid/__init__.py:97
+#: mediagoblin/plugins/openid/views.py:268
+#: mediagoblin/plugins/openid/views.py:297
+msgid "Sorry, an account is already registered to that OpenID."
+msgstr ""
+
+#: mediagoblin/plugins/openid/forms.py:38
+msgid "OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:48
+msgid "Sorry, the OpenID server could not be found"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:61
+#, python-format
+msgid "No OpenID service was found for %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:106
+#, python-format
+msgid "Verification of %s failed: %s"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:117
+msgid "Verification cancelled"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:314
+msgid "Your OpenID url was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:338
+#: mediagoblin/plugins/openid/views.py:393
+msgid "You can't delete your only OpenID URL unless you have a password set"
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:343
+#: mediagoblin/plugins/openid/views.py:402
+msgid "That OpenID is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/openid/views.py:385
+msgid "OpenID was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:31
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:34
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:23
+msgid "Add an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/add.html:34
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:23
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:31
+msgid "Delete an OpenID"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/delete.html:39
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "Delete"
+msgstr "刪除"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html:21
+msgid "OpenID's"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:28
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:36
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:57
+#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/auth/login.html:28
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+#: mediagoblin/templates/mediagoblin/auth/login.html:58
+msgid "Log in"
+msgstr "登入"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:39
+#: mediagoblin/templates/mediagoblin/auth/login.html:39
+msgid "Logging in failed!"
+msgstr "登入失敗ï¼"
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:44
+msgid "Log in to create an account!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login.html:51
+msgid "Or login with a password!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/login_link.html:23
+msgid "Or login with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/register_link.html:23
+msgid "Or register with OpenID!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/__init__.py:90
+msgid "Sorry, an account is already registered to that Persona email."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:138
+msgid "The Persona email address was successfully removed."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:144
+msgid ""
+"You can't delete your only Persona email address unless you have a password "
+"set."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:149
+msgid "That Persona email address is not registered to this account."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:176
+msgid ""
+"Sorry, an account is already registered with that Persona email address."
+msgstr ""
+
+#: mediagoblin/plugins/persona/views.py:192
+msgid "Your Persona email address was saved successfully."
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:31
+msgid "Delete a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit.html:34
+msgid "Add a Persona email address"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html:22
+msgid "Edit your Persona email addresses"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/login_link.html:22
+msgid "Or login with Persona!"
+msgstr ""
+
+#: mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/register_link.html:22
+msgid "Or register with Persona!"
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:413
msgid "Invalid file given for media type."
msgstr "指定錯誤的媒體類別ï¼"
+#: mediagoblin/processing/__init__.py:420
+msgid "Copying to public storage failed."
+msgstr ""
+
+#: mediagoblin/processing/__init__.py:428
+msgid "An acceptable processing file was not found"
+msgstr ""
+
#: mediagoblin/submit/forms.py:26
msgid "File"
msgstr "檔案"
-#: mediagoblin/submit/views.py:49
+#: mediagoblin/submit/views.py:52
msgid "You must provide a file."
msgstr "您必須æä¾›ä¸€å€‹æª”案"
-#: mediagoblin/submit/views.py:93
+#: mediagoblin/submit/views.py:101
msgid "Woohoo! Submitted!"
msgstr "啊哈ï¼PO 上去啦ï¼"
-#: mediagoblin/submit/views.py:144
+#: mediagoblin/submit/views.py:154
#, python-format
msgid "Collection \"%s\" added!"
msgstr "è’è—「%sã€æ–°å¢žå®Œæˆï¼"
-#: mediagoblin/templates/mediagoblin/base.html:67
+#: mediagoblin/templates/mediagoblin/base.html:79
msgid "Verify your email!"
msgstr "ç¢ºèªæ‚¨çš„é›»å­éƒµä»¶"
-#: mediagoblin/templates/mediagoblin/base.html:68
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid "log out"
msgstr "登出"
-#: mediagoblin/templates/mediagoblin/base.html:73
-#: mediagoblin/templates/mediagoblin/auth/login.html:28
-#: mediagoblin/templates/mediagoblin/auth/login.html:36
-#: mediagoblin/templates/mediagoblin/auth/login.html:54
-msgid "Log in"
-msgstr "登入"
-
-#: mediagoblin/templates/mediagoblin/base.html:82
+#: mediagoblin/templates/mediagoblin/base.html:105
#, python-format
msgid "<a href=\"%(user_url)s\">%(user_name)s</a>'s account"
msgstr "<a href=\"%(user_url)s\">%(user_name)s</a> 的帳號"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:112
msgid "Change account settings"
msgstr "更改帳號設定"
-#: mediagoblin/templates/mediagoblin/base.html:93
-#: mediagoblin/templates/mediagoblin/base.html:108
+#: mediagoblin/templates/mediagoblin/base.html:116
+#: mediagoblin/templates/mediagoblin/base.html:137
#: mediagoblin/templates/mediagoblin/admin/panel.html:21
#: mediagoblin/templates/mediagoblin/admin/panel.html:26
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:21
@@ -450,16 +673,16 @@ msgstr "更改帳號設定"
msgid "Media processing panel"
msgstr "媒體處ç†é¢æ¿"
-#: mediagoblin/templates/mediagoblin/base.html:96
+#: mediagoblin/templates/mediagoblin/base.html:125
msgid "Log out"
msgstr "登出"
-#: mediagoblin/templates/mediagoblin/base.html:99
+#: mediagoblin/templates/mediagoblin/base.html:128
#: mediagoblin/templates/mediagoblin/user_pages/user.html:156
msgid "Add media"
msgstr "新增媒體"
-#: mediagoblin/templates/mediagoblin/base.html:102
+#: mediagoblin/templates/mediagoblin/base.html:131
#: mediagoblin/templates/mediagoblin/user_pages/collection_list.html:41
msgid "Create new collection"
msgstr "新增新的è’è—"
@@ -506,6 +729,59 @@ msgstr "最近 10 次æˆåŠŸä¸Šå‚³çš„ç´€éŒ„"
msgid "No processed entries, yet!"
msgstr "ç¾åœ¨é‚„沒有處ç†çš„紀錄ï¼"
+#: mediagoblin/templates/mediagoblin/api/authorize.html:21
+msgid "Authorization"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:26
+#: mediagoblin/templates/mediagoblin/api/authorize.html:53
+msgid "Authorize"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:29
+msgid "You are logged in as"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:33
+msgid "Do you want to authorize "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:37
+msgid "an unknown application"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:39
+msgid " to access your account? "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:41
+msgid "Applications with access to your account can: "
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:43
+msgid "Post new media as you"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:44
+msgid "See your information (e.g profile, media, etc...)"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/authorize.html:45
+msgid "Change your information"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:21
+msgid "Authorization Finished"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:26
+msgid "Authorization Complete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/api/oob.html:28
+msgid "Copy and paste this into your client:"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:28
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:36
msgid "Set your new password"
@@ -538,19 +814,15 @@ msgid ""
"a happy goblin!"
msgstr "%(username)s 您好:\n\nè¦ä¿®æ”¹ GNU MediaGoblin 的密碼,請在您的ç€è¦½å™¨ä¸­æ‰“開下é¢çš„ç¶²å€ï¼š\n\n%(verification_url)s\n\n如果您èªç‚ºé€™å€‹æ˜¯å€‹èª¤æœƒï¼Œè«‹å¿½ç•¥æ­¤å°ä¿¡ä»¶ï¼Œç¹¼çºŒç•¶å€‹å¿«æ¨‚的哥布林ï¼"
-#: mediagoblin/templates/mediagoblin/auth/login.html:39
-msgid "Logging in failed!"
-msgstr "登入失敗ï¼"
-
#: mediagoblin/templates/mediagoblin/auth/login.html:44
msgid "Don't have an account yet?"
msgstr "還沒有帳號嗎?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:45
+#: mediagoblin/templates/mediagoblin/auth/login.html:46
msgid "Create one here!"
msgstr "在這裡建立一個å§ï¼"
-#: mediagoblin/templates/mediagoblin/auth/login.html:51
+#: mediagoblin/templates/mediagoblin/auth/login.html:54
msgid "Forgot your password?"
msgstr "忘了密碼嗎?"
@@ -559,7 +831,7 @@ msgstr "忘了密碼嗎?"
msgid "Create an account!"
msgstr "建立一個帳號ï¼"
-#: mediagoblin/templates/mediagoblin/auth/register.html:40
+#: mediagoblin/templates/mediagoblin/auth/register.html:41
msgid "Create"
msgstr "建立"
@@ -593,7 +865,7 @@ msgstr "以 <a href=\"http://www.fsf.org/licensing/licenses/agpl-3.0.html\">AGPL
msgid "Explore"
msgstr "探索"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:22
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:23
msgid "Hi there, welcome to this MediaGoblin site!"
msgstr "å˜¿ï¼æ­¡è¿Žä¾†åˆ° MediaGoblin ç«™å°ï¼ "
@@ -603,23 +875,28 @@ msgid ""
"extraordinarily great piece of media hosting software."
msgstr "本站使用 <a href=\"http://mediagoblin.org\">MediaGoblin</a> — 與眾ä¸åŒçš„媒體分享網站。"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:25
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:26
msgid ""
"To add your own media, place comments, and more, you can log in with your "
"MediaGoblin account."
msgstr "您å¯ä»¥ç™»å…¥æ‚¨çš„ MediaGoblin 帳號以進行上傳媒體ã€å¼µè²¼è©•論等等。"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:27
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
msgid "Don't have one yet? It's easy!"
msgstr "沒有帳號嗎?開帳號很簡單ï¼"
-#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:28
-#, python-format
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:35
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 "<a class=\"button_action_highlight\" href=\"%(register_url)s\">在本站建立您的帳號</a>\n 或是\n <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">在您自己的伺æœå™¨ä¸Šå®‰è£ MediaGoblin</a>"
+"\n"
+" >Create an account at this site</a>\n"
+" or"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/bits/frontpage_welcome.html:41
+msgid ""
+"\n"
+" <a class=\"button_action\" href=\"http://mediagoblin.readthedocs.org/\">Set up MediaGoblin on your own server</a>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/bits/logo.html:23
#: mediagoblin/themes/airy/templates/mediagoblin/bits/logo.html:23
@@ -633,13 +910,13 @@ msgid "Editing attachments for %(media_title)s"
msgstr "編輯 %(media_title)s 的附件"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:44
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:182
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:198
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:178
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:194
msgid "Attachments"
msgstr "附件"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:57
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:204
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:200
msgid "Add attachment"
msgstr "新增附件"
@@ -656,22 +933,29 @@ msgstr "å–æ¶ˆ"
#: mediagoblin/templates/mediagoblin/edit/attachments.html:63
#: mediagoblin/templates/mediagoblin/edit/edit.html:42
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:55
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:33
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:40
msgid "Save changes"
msgstr "儲存變更"
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
-#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:23
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:33
#, python-format
-msgid "Changing %(username)s's password"
-msgstr "更改 %(username)s 的密碼"
+msgid "Changing %(username)s's email"
+msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/change_email.html:40
#: mediagoblin/templates/mediagoblin/edit/change_pass.html:45
msgid "Save"
msgstr "儲存"
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:28
+#: mediagoblin/templates/mediagoblin/edit/change_pass.html:38
+#, python-format
+msgid "Changing %(username)s's password"
+msgstr "更改 %(username)s 的密碼"
+
#: mediagoblin/templates/mediagoblin/edit/delete_account.html:28
#, python-format
msgid "Really delete user '%(user_name)s' and all related media/comments?"
@@ -699,14 +983,14 @@ msgstr "編輯 %(media_title)s"
msgid "Changing %(username)s's account settings"
msgstr "正在改變 %(username)s 的帳號設定"
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:46
-msgid "Change your password."
-msgstr "更改您的密碼。"
-
-#: mediagoblin/templates/mediagoblin/edit/edit_account.html:62
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:53
msgid "Delete my account"
msgstr "刪除我的帳號"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:58
+msgid "Email"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_collection.html:29
#, python-format
msgid "Editing %(collection_title)s"
@@ -718,6 +1002,36 @@ msgstr "編輯 %(collection_title)s"
msgid "Editing %(username)s's profile"
msgstr "編輯 %(username)s 的個人檔案"
+#: mediagoblin/templates/mediagoblin/edit/verification.txt:19
+#, python-format
+msgid ""
+"Hi,\n"
+"\n"
+"We wanted to verify that you are %(username)s. If this is the case, then \n"
+"please follow the link below to verify your new email address.\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you are not %(username)s or didn't request an email change, you can ignore\n"
+"this email."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:4
+msgid "New comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:24
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:39
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:139
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:159
+#, python-format
+msgid "%(formatted_time)s ago"
+msgstr "%(formatted_time)s å‰"
+
+#: mediagoblin/templates/mediagoblin/fragments/header_notifications.html:41
+msgid "Mark all read"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/listings/collection.html:30
#: mediagoblin/templates/mediagoblin/listings/collection.html:35
#: mediagoblin/templates/mediagoblin/listings/tag.html:30
@@ -728,8 +1042,7 @@ msgstr "這個媒體具有以下標籤:%(tag_name)s"
#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:56
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:65
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:136
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:67
#: mediagoblin/templates/mediagoblin/media_displays/video.html:55
msgid "Download"
msgstr "下載"
@@ -753,7 +1066,7 @@ msgid ""
msgstr "您å¯ä»¥åœ¨ <a href=\"http://getfirefox.com\">http://getfirefox.com</a> å–å¾—å¯ä»¥æ’­æ”¾æ­¤è²éŸ³çš„ç€è¦½å™¨ï¼"
#: mediagoblin/templates/mediagoblin/media_displays/audio.html:60
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:71
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:73
#: mediagoblin/templates/mediagoblin/media_displays/video.html:61
msgid "Original file"
msgstr "原始檔案"
@@ -762,6 +1075,10 @@ msgstr "原始檔案"
msgid "WebM file (Vorbis codec)"
msgstr "WebM 檔案 (Vorbis 編碼)"
+#: mediagoblin/templates/mediagoblin/media_displays/image.html:36
+msgid "Created"
+msgstr "建立於"
+
#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:59
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:87
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:93
@@ -773,47 +1090,39 @@ msgstr "WebM 檔案 (Vorbis 編碼)"
msgid "Image for %(media_title)s"
msgstr " %(media_title)s 的照片"
-#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:79
+#: mediagoblin/templates/mediagoblin/media_displays/pdf.html:81
msgid "PDF file"
msgstr "PDF 檔"
#: mediagoblin/templates/mediagoblin/media_displays/stl.html:112
-msgid "Toggle Rotate"
-msgstr "åˆ‡æ›æ—‹è½‰"
-
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:113
msgid "Perspective"
msgstr "é€è¦–"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:116
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:117
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:115
msgid "Front"
msgstr "æ­£é¢"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:120
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:118
msgid "Top"
msgstr "é ‚é¢"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:124
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:125
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:121
msgid "Side"
msgstr "å´é¢"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:130
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:131
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:126
msgid "WebGL"
msgstr "WebGL"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:138
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:132
msgid "Download model"
msgstr "下載模型"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:146
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:140
msgid "File Format"
msgstr "檔案格å¼"
-#: mediagoblin/templates/mediagoblin/media_displays/stl.html:148
+#: mediagoblin/templates/mediagoblin/media_displays/stl.html:142
msgid "Object Height"
msgstr "物件高度"
@@ -832,8 +1141,8 @@ msgid ""
msgstr "您å¯ä»¥åœ¨ <a href=\"http://getfirefox.com\">http://getfirefox.com</a> å–å¾—å¯ä»¥æ’­æ”¾æ­¤å½±ç‰‡çš„先進ç€è¦½å™¨ã€‚"
#: mediagoblin/templates/mediagoblin/media_displays/video.html:69
-msgid "WebM file (640p; VP8/Vorbis)"
-msgstr "WebM 檔案 (640p; VP8/Vorbis)"
+msgid "WebM file (VP8/Vorbis)"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/collection.html:26
msgid "Add a collection"
@@ -859,11 +1168,6 @@ msgstr "%(collection_title)s by <a href=\"%(user_url)s\">%(username)s</a>"
msgid "Edit"
msgstr "編輯"
-#: mediagoblin/templates/mediagoblin/user_pages/collection.html:56
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
-msgid "Delete"
-msgstr "刪除"
-
#: mediagoblin/templates/mediagoblin/user_pages/collection_confirm_delete.html:30
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -918,29 +1222,22 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a> 的媒體"
msgid "â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a>"
msgstr "â– ç€è¦½ <a href=\"%(user_url)s\">%(username)s</a> 的媒體"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:95
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:97
msgid "Add a comment"
msgstr "新增留言"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:108
msgid "Add this comment"
msgstr "增加留言"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:132
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:152
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:164
-#, python-format
-msgid "%(formatted_time)s ago"
-msgstr "%(formatted_time)s å‰"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:112
+msgid "Comment Preview"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:150
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:157
msgid "Added"
msgstr "新增於"
-#: mediagoblin/templates/mediagoblin/user_pages/media.html:161
-msgid "Created"
-msgstr "建立於"
-
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:28
#: mediagoblin/templates/mediagoblin/user_pages/media_collect.html:40
#, python-format
@@ -1099,26 +1396,34 @@ msgstr "標籤"
msgid "Could not read the image file."
msgstr "無法讀å–圖片檔案。"
-#: mediagoblin/tools/response.py:35
+#: mediagoblin/tools/response.py:36
msgid "Oops!"
msgstr "糟糕ï¼"
-#: mediagoblin/tools/response.py:36
+#: mediagoblin/tools/response.py:37
msgid "An error occured"
msgstr "發生錯誤"
#: mediagoblin/tools/response.py:51
+msgid "Bad Request"
+msgstr ""
+
+#: mediagoblin/tools/response.py:53
+msgid "The request sent to the server is invalid, please double check it"
+msgstr ""
+
+#: mediagoblin/tools/response.py:60
msgid "Operation not allowed"
msgstr "æ“作ä¸å…許"
-#: mediagoblin/tools/response.py:52
+#: mediagoblin/tools/response.py:61
msgid ""
"Sorry Dave, I can't let you do that!</p><p>You have tried to perform a "
"function that you are not allowed to. Have you been trying to delete all "
"user accounts again?"
msgstr "Dave å°ä¸èµ·ï¼Œæˆ‘ä¸èƒ½è®“你這樣åšï¼</p><p>您正在試著æ“作ä¸å…許您使用的功能。您打算刪除所有使用者的帳號嗎?"
-#: mediagoblin/tools/response.py:60
+#: mediagoblin/tools/response.py:69
msgid ""
"There doesn't seem to be a page at this address. Sorry!</p><p>If you're sure"
" the address is correct, maybe the page you're looking for has been moved or"
@@ -1155,10 +1460,9 @@ msgstr "留言"
#: mediagoblin/user_pages/forms.py:25
msgid ""
-"You can use <a "
-"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
-" formatting."
-msgstr "您å¯ä»¥ç”¨ <a href=\"http://markdown.tw\">Markdown</a> 來排版。"
+"You can use <a href=\"http://daringfireball.net/projects/markdown/basics\" "
+"target=\"_blank\">Markdown</a> for formatting."
+msgstr ""
#: mediagoblin/user_pages/forms.py:31
msgid "I am sure I want to delete this"
@@ -1180,77 +1484,80 @@ msgstr "— è«‹é¸æ“‡ —"
msgid "Include a note"
msgstr "加註"
-#: mediagoblin/user_pages/lib.py:58
-msgid "commented on your post"
-msgstr "在您的內容張貼留言"
+#: mediagoblin/user_pages/forms.py:49
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\" target=\"_blank\">\n"
+" Markdown</a> for formatting."
+msgstr ""
-#: mediagoblin/user_pages/views.py:169
+#: mediagoblin/user_pages/views.py:179
msgid "Sorry, comments are disabled."
msgstr "抱歉,留言被關閉。"
-#: mediagoblin/user_pages/views.py:174
+#: mediagoblin/user_pages/views.py:184
msgid "Oops, your comment was empty."
msgstr "啊,您的留言是空的。"
-#: mediagoblin/user_pages/views.py:180
+#: mediagoblin/user_pages/views.py:190
msgid "Your comment has been posted!"
msgstr "您的留言已經張貼完æˆï¼"
-#: mediagoblin/user_pages/views.py:205
+#: mediagoblin/user_pages/views.py:225
msgid "Please check your entries and try again."
msgstr "請檢查項目並é‡è©¦ã€‚"
-#: mediagoblin/user_pages/views.py:245
+#: mediagoblin/user_pages/views.py:265
msgid "You have to select or add a collection"
msgstr "您需è¦é¸æ“‡æˆ–是新增一個è’è—"
-#: mediagoblin/user_pages/views.py:256
+#: mediagoblin/user_pages/views.py:276
#, python-format
msgid "\"%s\" already in collection \"%s\""
msgstr "「%sã€å·²ç¶“在「%sã€è’è—"
-#: mediagoblin/user_pages/views.py:262
+#: mediagoblin/user_pages/views.py:282
#, python-format
msgid "\"%s\" added to collection \"%s\""
msgstr "「%sã€åŠ å…¥ã€Œ%sã€è’è—"
-#: mediagoblin/user_pages/views.py:282
+#: mediagoblin/user_pages/views.py:302
msgid "You deleted the media."
msgstr "您已經刪除此媒體。"
-#: mediagoblin/user_pages/views.py:289
+#: mediagoblin/user_pages/views.py:314
msgid "The media was not deleted because you didn't check that you were sure."
msgstr "由於您沒有勾é¸ç¢ºèªï¼Œè©²åª’體沒有被移除。"
-#: mediagoblin/user_pages/views.py:296
+#: mediagoblin/user_pages/views.py:321
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "您正在刪除別人的媒體,請å°å¿ƒæ“作。"
-#: mediagoblin/user_pages/views.py:370
+#: mediagoblin/user_pages/views.py:395
msgid "You deleted the item from the collection."
msgstr "您已經從該è’è—中刪除該項目。"
-#: mediagoblin/user_pages/views.py:374
+#: mediagoblin/user_pages/views.py:399
msgid "The item was not removed because you didn't check that you were sure."
msgstr "由於您沒有勾é¸ç¢ºèªï¼Œè©²é …目沒有被移除。"
-#: mediagoblin/user_pages/views.py:382
+#: mediagoblin/user_pages/views.py:407
msgid ""
"You are about to delete an item from another user's collection. Proceed with"
" caution."
msgstr "您正在從別人的è’è—中刪除項目,請å°å¿ƒæ“作。"
-#: mediagoblin/user_pages/views.py:415
+#: mediagoblin/user_pages/views.py:440
#, python-format
msgid "You deleted the collection \"%s\""
msgstr "您已經刪除「%sã€è’è—。"
-#: mediagoblin/user_pages/views.py:422
+#: mediagoblin/user_pages/views.py:447
msgid ""
"The collection was not deleted because you didn't check that you were sure."
msgstr "由於您沒有勾é¸ç¢ºèªï¼Œè©²è’è—æ²’有被移除。"
-#: mediagoblin/user_pages/views.py:430
+#: mediagoblin/user_pages/views.py:455
msgid ""
"You are about to delete another user's collection. Proceed with caution."
msgstr "您正在刪除別人的è’è—,請å°å¿ƒæ“作。"
diff --git a/mediagoblin/media_types/ascii/__init__.py b/mediagoblin/media_types/ascii/__init__.py
index 4baf8dd3..1ee44988 100644
--- a/mediagoblin/media_types/ascii/__init__.py
+++ b/mediagoblin/media_types/ascii/__init__.py
@@ -15,21 +15,15 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from mediagoblin.media_types import MediaManagerBase
-from mediagoblin.media_types.ascii.processing import process_ascii, \
+from mediagoblin.media_types.ascii.processing import AsciiProcessingManager, \
sniff_handler
-from mediagoblin.tools import pluginapi
ACCEPTED_EXTENSIONS = ["txt", "asc", "nfo"]
MEDIA_TYPE = 'mediagoblin.media_types.ascii'
-def setup_plugin():
- config = pluginapi.get_config(MEDIA_TYPE)
-
-
class ASCIIMediaManager(MediaManagerBase):
human_readable = "ASCII"
- processor = staticmethod(process_ascii)
display_template = "mediagoblin/media_displays/ascii.html"
default_thumb = "images/media_thumbs/ascii.jpg"
@@ -40,8 +34,8 @@ def get_media_type_and_manager(ext):
hooks = {
- 'setup': setup_plugin,
'get_media_type_and_manager': get_media_type_and_manager,
('media_manager', MEDIA_TYPE): lambda: ASCIIMediaManager,
+ ('reprocess_manager', MEDIA_TYPE): lambda: AsciiProcessingManager,
'sniff_handler': sniff_handler,
}
diff --git a/mediagoblin/media_types/ascii/config_spec.ini b/mediagoblin/media_types/ascii/config_spec.ini
new file mode 100644
index 00000000..24b05053
--- /dev/null
+++ b/mediagoblin/media_types/ascii/config_spec.ini
@@ -0,0 +1,4 @@
+[plugin_spec]
+thumbnail_font = string(default=None)
+
+
diff --git a/mediagoblin/media_types/ascii/processing.py b/mediagoblin/media_types/ascii/processing.py
index aca784e8..b3c2a298 100644
--- a/mediagoblin/media_types/ascii/processing.py
+++ b/mediagoblin/media_types/ascii/processing.py
@@ -13,6 +13,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/>.
+import argparse
import chardet
import os
try:
@@ -22,7 +23,11 @@ except ImportError:
import logging
from mediagoblin import mg_globals as mgg
-from mediagoblin.processing import create_pub_filepath
+from mediagoblin.processing import (
+ create_pub_filepath, FilenameBuilder,
+ MediaProcessor, ProcessingManager,
+ get_process_filename, copy_original,
+ store_public, request_from_args)
from mediagoblin.media_types.ascii import asciitoimage
_log = logging.getLogger(__name__)
@@ -43,106 +48,228 @@ def sniff_handler(media_file, **kw):
return None
-def process_ascii(proc_state):
- """Code to process a txt file. Will be run by celery.
-
- A Workbench() represents a local tempory dir. It is automatically
- cleaned up when this function exits.
+class CommonAsciiProcessor(MediaProcessor):
+ """
+ Provides a base for various ascii processing steps
"""
- entry = proc_state.entry
- workbench = proc_state.workbench
- ascii_config = mgg.global_config['media_type:mediagoblin.media_types.ascii']
- # Conversions subdirectory to avoid collisions
- conversions_subdir = os.path.join(
- workbench.dir, 'conversions')
- os.mkdir(conversions_subdir)
+ acceptable_files = ['original', 'unicode']
+
+ def common_setup(self):
+ self.ascii_config = mgg.global_config['plugins'][
+ 'mediagoblin.media_types.ascii']
+
+ # Conversions subdirectory to avoid collisions
+ self.conversions_subdir = os.path.join(
+ self.workbench.dir, 'conversions')
+ os.mkdir(self.conversions_subdir)
- queued_filepath = entry.queued_media_file
- queued_filename = workbench.localized_file(
- mgg.queue_store, queued_filepath,
- 'source')
+ # Pull down and set up the processing file
+ self.process_filename = get_process_filename(
+ self.entry, self.workbench, self.acceptable_files)
+ self.name_builder = FilenameBuilder(self.process_filename)
- queued_file = file(queued_filename, 'rb')
+ self.charset = None
- with queued_file:
- queued_file_charset = chardet.detect(queued_file.read())
+ def copy_original(self):
+ copy_original(
+ self.entry, self.process_filename,
+ self.name_builder.fill('{basename}{ext}'))
+
+ def _detect_charset(self, orig_file):
+ d_charset = chardet.detect(orig_file.read())
# Only select a non-utf-8 charset if chardet is *really* sure
- # Tested with "Feli\x0109an superjaron", which was detecte
- if queued_file_charset['confidence'] < 0.9:
- interpreted_charset = 'utf-8'
+ # Tested with "Feli\x0109an superjaron", which was detected
+ if d_charset['confidence'] < 0.9:
+ self.charset = 'utf-8'
else:
- interpreted_charset = queued_file_charset['encoding']
+ self.charset = d_charset['encoding']
_log.info('Charset detected: {0}\nWill interpret as: {1}'.format(
- queued_file_charset,
- interpreted_charset))
+ d_charset,
+ self.charset))
+
+ # Rewind the file
+ orig_file.seek(0)
+
+ def store_unicode_file(self):
+ with file(self.process_filename, 'rb') as orig_file:
+ self._detect_charset(orig_file)
+ unicode_filepath = create_pub_filepath(self.entry,
+ 'ascii-portable.txt')
- queued_file.seek(0) # Rewind the queued file
+ with mgg.public_store.get_file(unicode_filepath, 'wb') \
+ as unicode_file:
+ # Decode the original file from its detected charset (or UTF8)
+ # Encode the unicode instance to ASCII and replace any
+ # non-ASCII with an HTML entity (&#
+ unicode_file.write(
+ unicode(orig_file.read().decode(
+ self.charset)).encode(
+ 'ascii',
+ 'xmlcharrefreplace'))
- thumb_filepath = create_pub_filepath(
- entry, 'thumbnail.png')
+ self.entry.media_files['unicode'] = unicode_filepath
- tmp_thumb_filename = os.path.join(
- conversions_subdir, thumb_filepath[-1])
+ def generate_thumb(self, font=None, thumb_size=None):
+ with file(self.process_filename, 'rb') as orig_file:
+ # If no font kwarg, check config
+ if not font:
+ font = self.ascii_config.get('thumbnail_font', None)
+ if not thumb_size:
+ thumb_size = (mgg.global_config['media:thumb']['max_width'],
+ mgg.global_config['media:thumb']['max_height'])
- ascii_converter_args = {}
+ if self._skip_resizing(font, thumb_size):
+ return
- if ascii_config['thumbnail_font']:
- ascii_converter_args.update(
- {'font': ascii_config['thumbnail_font']})
+ tmp_thumb = os.path.join(
+ self.conversions_subdir,
+ self.name_builder.fill('{basename}.thumbnail.png'))
- converter = asciitoimage.AsciiToImage(
- **ascii_converter_args)
+ ascii_converter_args = {}
- thumb = converter._create_image(
- queued_file.read())
+ # If there is a font from either the config or kwarg, update
+ # ascii_converter_args
+ if font:
+ ascii_converter_args.update(
+ {'font': self.ascii_config['thumbnail_font']})
- with file(tmp_thumb_filename, 'w') as thumb_file:
- thumb.thumbnail(
- (mgg.global_config['media:thumb']['max_width'],
- mgg.global_config['media:thumb']['max_height']),
- Image.ANTIALIAS)
- thumb.save(thumb_file)
+ converter = asciitoimage.AsciiToImage(
+ **ascii_converter_args)
- _log.debug('Copying local file to public storage')
- mgg.public_store.copy_local_to_storage(
- tmp_thumb_filename, thumb_filepath)
+ thumb = converter._create_image(
+ orig_file.read())
- queued_file.seek(0)
+ with file(tmp_thumb, 'w') as thumb_file:
+ thumb.thumbnail(
+ thumb_size,
+ Image.ANTIALIAS)
+ thumb.save(thumb_file)
- original_filepath = create_pub_filepath(entry, queued_filepath[-1])
+ thumb_info = {'font': font,
+ 'width': thumb_size[0],
+ 'height': thumb_size[1]}
- with mgg.public_store.get_file(original_filepath, 'wb') \
- as original_file:
- original_file.write(queued_file.read())
+ self.entry.set_file_metadata('thumb', **thumb_info)
- queued_file.seek(0) # Rewind *again*
+ _log.debug('Copying local file to public storage')
+ store_public(self.entry, 'thumb', tmp_thumb,
+ self.name_builder.fill('{basename}.thumbnail.jpg'))
- unicode_filepath = create_pub_filepath(entry, 'ascii-portable.txt')
+ def _skip_resizing(self, font, thumb_size):
+ thumb_info = self.entry.get_file_metadata('thumb')
- with mgg.public_store.get_file(unicode_filepath, 'wb') \
- as unicode_file:
- # Decode the original file from its detected charset (or UTF8)
- # Encode the unicode instance to ASCII and replace any non-ASCII
- # with an HTML entity (&#
- unicode_file.write(
- unicode(queued_file.read().decode(
- interpreted_charset)).encode(
- 'ascii',
- 'xmlcharrefreplace'))
+ if not thumb_info:
+ return False
- # Remove queued media file from storage and database.
- # queued_filepath is in the task_id directory which should
- # be removed too, but fail if the directory is not empty to be on
- # the super-safe side.
- mgg.queue_store.delete_file(queued_filepath) # rm file
- mgg.queue_store.delete_dir(queued_filepath[:-1]) # rm dir
- entry.queued_media_file = []
+ skip = True
- 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
+ if thumb_info.get('font') != font:
+ skip = False
+ elif thumb_info.get('width') != thumb_size[0]:
+ skip = False
+ elif thumb_info.get('height') != thumb_size[1]:
+ skip = False
- entry.save()
+ return skip
+
+
+class InitialProcessor(CommonAsciiProcessor):
+ """
+ Initial processing step for new ascii media
+ """
+ name = "initial"
+ description = "Initial processing"
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ if not state:
+ state = entry.state
+ return state in (
+ "unprocessed", "failed")
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--thumb_size',
+ nargs=2,
+ metavar=('max_width', 'max_width'),
+ type=int)
+
+ parser.add_argument(
+ '--font',
+ help='the thumbnail font')
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['thumb_size', 'font'])
+
+ def process(self, thumb_size=None, font=None):
+ self.common_setup()
+ self.store_unicode_file()
+ self.generate_thumb(thumb_size=thumb_size, font=font)
+ self.copy_original()
+ self.delete_queue_file()
+
+
+class Resizer(CommonAsciiProcessor):
+ """
+ Resizing process steps for processed media
+ """
+ name = 'resize'
+ description = 'Resize thumbnail'
+ thumb_size = 'thumb_size'
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ """
+ Determine if this media type is eligible for processing
+ """
+ if not state:
+ state = entry.state
+ return state in 'processed'
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--thumb_size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ # Needed for gmg reprocess thumbs to work
+ parser.add_argument(
+ 'file',
+ nargs='?',
+ default='thumb',
+ choices=['thumb'])
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['thumb_size', 'file'])
+
+ def process(self, thumb_size=None, file=None):
+ self.common_setup()
+ self.generate_thumb(thumb_size=thumb_size)
+
+
+class AsciiProcessingManager(ProcessingManager):
+ def __init__(self):
+ super(self.__class__, self).__init__()
+ self.add_processor(InitialProcessor)
+ self.add_processor(Resizer)
diff --git a/mediagoblin/media_types/audio/__init__.py b/mediagoblin/media_types/audio/__init__.py
index c7ed8d2d..6ad473c8 100644
--- a/mediagoblin/media_types/audio/__init__.py
+++ b/mediagoblin/media_types/audio/__init__.py
@@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from mediagoblin.media_types import MediaManagerBase
-from mediagoblin.media_types.audio.processing import process_audio, \
+from mediagoblin.media_types.audio.processing import AudioProcessingManager, \
sniff_handler
from mediagoblin.tools import pluginapi
@@ -32,8 +32,8 @@ def setup_plugin():
class AudioMediaManager(MediaManagerBase):
human_readable = "Audio"
- processor = staticmethod(process_audio)
display_template = "mediagoblin/media_displays/audio.html"
+ default_thumb = "images/media_thumbs/image.png"
def get_media_type_and_manager(ext):
@@ -45,4 +45,5 @@ hooks = {
'get_media_type_and_manager': get_media_type_and_manager,
'sniff_handler': sniff_handler,
('media_manager', MEDIA_TYPE): lambda: AudioMediaManager,
+ ('reprocess_manager', MEDIA_TYPE): lambda: AudioProcessingManager,
}
diff --git a/mediagoblin/media_types/audio/config_spec.ini b/mediagoblin/media_types/audio/config_spec.ini
new file mode 100644
index 00000000..743deaa4
--- /dev/null
+++ b/mediagoblin/media_types/audio/config_spec.ini
@@ -0,0 +1,8 @@
+[plugin_spec]
+keep_original = boolean(default=True)
+# vorbisenc quality
+quality = float(default=0.3)
+create_spectrogram = boolean(default=True)
+spectrogram_fft_size = integer(default=4096)
+
+
diff --git a/mediagoblin/media_types/audio/processing.py b/mediagoblin/media_types/audio/processing.py
index 22383bc1..883d3ffc 100644
--- a/mediagoblin/media_types/audio/processing.py
+++ b/mediagoblin/media_types/audio/processing.py
@@ -14,16 +14,19 @@
# 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 argparse
import logging
-from tempfile import NamedTemporaryFile
import os
from mediagoblin import mg_globals as mgg
-from mediagoblin.processing import (create_pub_filepath, BadMediaFail,
- FilenameBuilder, ProgressCallback)
+from mediagoblin.processing import (
+ BadMediaFail, FilenameBuilder,
+ ProgressCallback, MediaProcessor, ProcessingManager,
+ request_from_args, get_process_filename,
+ store_public, copy_original)
-from mediagoblin.media_types.audio.transcoders import (AudioTranscoder,
- AudioThumbnailer)
+from mediagoblin.media_types.audio.transcoders import (
+ AudioTranscoder, AudioThumbnailer)
_log = logging.getLogger(__name__)
@@ -39,121 +42,343 @@ def sniff_handler(media_file, **kw):
_log.debug('Audio discovery raised BadMediaFail')
return None
- if data.is_audio == True and data.is_video == False:
+ if data.is_audio is True and data.is_video is False:
return MEDIA_TYPE
return None
-def process_audio(proc_state):
- """Code to process uploaded audio. Will be run by celery.
-
- A Workbench() represents a local tempory dir. It is automatically
- cleaned up when this function exits.
+class CommonAudioProcessor(MediaProcessor):
+ """
+ Provides a base for various audio processing steps
"""
- entry = proc_state.entry
- workbench = proc_state.workbench
- audio_config = mgg.global_config['media_type:mediagoblin.media_types.audio']
-
- queued_filepath = entry.queued_media_file
- queued_filename = workbench.localized_file(
- mgg.queue_store, queued_filepath,
- 'source')
- name_builder = FilenameBuilder(queued_filename)
-
- webm_audio_filepath = create_pub_filepath(
- entry,
- '{original}.webm'.format(
- original=os.path.splitext(
- queued_filepath[-1])[0]))
-
- if audio_config['keep_original']:
- with open(queued_filename, 'rb') as queued_file:
- original_filepath = create_pub_filepath(
- entry, name_builder.fill('{basename}{ext}'))
-
- with mgg.public_store.get_file(original_filepath, 'wb') as \
- original_file:
- _log.debug('Saving original...')
- original_file.write(queued_file.read())
-
- entry.media_files['original'] = original_filepath
-
- transcoder = AudioTranscoder()
-
- with NamedTemporaryFile(dir=workbench.dir) as webm_audio_tmp:
- progress_callback = ProgressCallback(entry)
-
- transcoder.transcode(
- queued_filename,
- webm_audio_tmp.name,
- quality=audio_config['quality'],
+ acceptable_files = ['original', 'best_quality', 'webm_audio']
+
+ def common_setup(self):
+ """
+ Setup the workbench directory and pull down the original file, add
+ the audio_config, transcoder, thumbnailer and spectrogram_tmp path
+ """
+ self.audio_config = mgg \
+ .global_config['plugins']['mediagoblin.media_types.audio']
+
+ # Pull down and set up the processing file
+ self.process_filename = get_process_filename(
+ self.entry, self.workbench, self.acceptable_files)
+ self.name_builder = FilenameBuilder(self.process_filename)
+
+ self.transcoder = AudioTranscoder()
+ self.thumbnailer = AudioThumbnailer()
+
+ def copy_original(self):
+ if self.audio_config['keep_original']:
+ copy_original(
+ self.entry, self.process_filename,
+ self.name_builder.fill('{basename}{ext}'))
+
+ def _keep_best(self):
+ """
+ If there is no original, keep the best file that we have
+ """
+ if not self.entry.media_files.get('best_quality'):
+ # Save the best quality file if no original?
+ if not self.entry.media_files.get('original') and \
+ self.entry.media_files.get('webm_audio'):
+ self.entry.media_files['best_quality'] = self.entry \
+ .media_files['webm_audio']
+
+ def _skip_processing(self, keyname, **kwargs):
+ file_metadata = self.entry.get_file_metadata(keyname)
+ skip = True
+
+ if not file_metadata:
+ return False
+
+ if keyname == 'webm_audio':
+ if kwargs.get('quality') != file_metadata.get('quality'):
+ skip = False
+ elif keyname == 'spectrogram':
+ if kwargs.get('max_width') != file_metadata.get('max_width'):
+ skip = False
+ elif kwargs.get('fft_size') != file_metadata.get('fft_size'):
+ skip = False
+ elif keyname == 'thumb':
+ if kwargs.get('size') != file_metadata.get('size'):
+ skip = False
+
+ return skip
+
+ def transcode(self, quality=None):
+ if not quality:
+ quality = self.audio_config['quality']
+
+ if self._skip_processing('webm_audio', quality=quality):
+ return
+
+ progress_callback = ProgressCallback(self.entry)
+ webm_audio_tmp = os.path.join(self.workbench.dir,
+ self.name_builder.fill(
+ '{basename}{ext}'))
+
+ self.transcoder.transcode(
+ self.process_filename,
+ webm_audio_tmp,
+ quality=quality,
progress_callback=progress_callback)
- transcoder.discover(webm_audio_tmp.name)
+ self.transcoder.discover(webm_audio_tmp)
+
+ self._keep_best()
_log.debug('Saving medium...')
- mgg.public_store.get_file(webm_audio_filepath, 'wb').write(
- webm_audio_tmp.read())
-
- entry.media_files['webm_audio'] = webm_audio_filepath
-
- # entry.media_data_init(length=int(data.audiolength))
-
- if audio_config['create_spectrogram']:
- spectrogram_filepath = create_pub_filepath(
- entry,
- '{original}-spectrogram.jpg'.format(
- original=os.path.splitext(
- queued_filepath[-1])[0]))
-
- with NamedTemporaryFile(dir=workbench.dir, suffix='.ogg') as wav_tmp:
- _log.info('Creating OGG source for spectrogram')
- transcoder.transcode(
- queued_filename,
- wav_tmp.name,
- mux_string='vorbisenc quality={0} ! oggmux'.format(
- audio_config['quality']))
-
- thumbnailer = AudioThumbnailer()
-
- with NamedTemporaryFile(dir=workbench.dir, suffix='.jpg') as spectrogram_tmp:
- thumbnailer.spectrogram(
- wav_tmp.name,
- spectrogram_tmp.name,
- width=mgg.global_config['media:medium']['max_width'],
- fft_size=audio_config['spectrogram_fft_size'])
-
- _log.debug('Saving spectrogram...')
- mgg.public_store.get_file(spectrogram_filepath, 'wb').write(
- spectrogram_tmp.read())
-
- entry.media_files['spectrogram'] = spectrogram_filepath
-
- with NamedTemporaryFile(dir=workbench.dir, suffix='.jpg') as thumb_tmp:
- thumbnailer.thumbnail_spectrogram(
- spectrogram_tmp.name,
- thumb_tmp.name,
- (mgg.global_config['media:thumb']['max_width'],
- mgg.global_config['media:thumb']['max_height']))
-
- thumb_filepath = create_pub_filepath(
- entry,
- '{original}-thumbnail.jpg'.format(
- original=os.path.splitext(
- queued_filepath[-1])[0]))
-
- mgg.public_store.get_file(thumb_filepath, 'wb').write(
- thumb_tmp.read())
-
- entry.media_files['thumb'] = thumb_filepath
- else:
- entry.media_files['thumb'] = ['fake', 'thumb', 'path.jpg']
-
- # Remove queued media file from storage and database.
- # queued_filepath is in the task_id directory which should
- # be removed too, but fail if the directory is not empty to be on
- # the super-safe side.
- mgg.queue_store.delete_file(queued_filepath) # rm file
- mgg.queue_store.delete_dir(queued_filepath[:-1]) # rm dir
- entry.queued_media_file = []
+ store_public(self.entry, 'webm_audio', webm_audio_tmp,
+ self.name_builder.fill('{basename}.medium.webm'))
+
+ self.entry.set_file_metadata('webm_audio', **{'quality': quality})
+
+ def create_spectrogram(self, max_width=None, fft_size=None):
+ if not max_width:
+ max_width = mgg.global_config['media:medium']['max_width']
+ if not fft_size:
+ fft_size = self.audio_config['spectrogram_fft_size']
+
+ if self._skip_processing('spectrogram', max_width=max_width,
+ fft_size=fft_size):
+ return
+
+ wav_tmp = os.path.join(self.workbench.dir, self.name_builder.fill(
+ '{basename}.ogg'))
+
+ _log.info('Creating OGG source for spectrogram')
+ self.transcoder.transcode(
+ self.process_filename,
+ wav_tmp,
+ mux_string='vorbisenc quality={0} ! oggmux'.format(
+ self.audio_config['quality']))
+
+ spectrogram_tmp = os.path.join(self.workbench.dir,
+ self.name_builder.fill(
+ '{basename}-spectrogram.jpg'))
+
+ self.thumbnailer.spectrogram(
+ wav_tmp,
+ spectrogram_tmp,
+ width=max_width,
+ fft_size=fft_size)
+
+ _log.debug('Saving spectrogram...')
+ store_public(self.entry, 'spectrogram', spectrogram_tmp,
+ self.name_builder.fill('{basename}.spectrogram.jpg'))
+
+ file_metadata = {'max_width': max_width,
+ 'fft_size': fft_size}
+ self.entry.set_file_metadata('spectrogram', **file_metadata)
+
+ def generate_thumb(self, size=None):
+ if not size:
+ max_width = mgg.global_config['media:thumb']['max_width']
+ max_height = mgg.global_config['media:thumb']['max_height']
+ size = (max_width, max_height)
+
+ if self._skip_processing('thumb', size=size):
+ return
+
+ thumb_tmp = os.path.join(self.workbench.dir, self.name_builder.fill(
+ '{basename}-thumbnail.jpg'))
+
+ # We need the spectrogram to create a thumbnail
+ spectrogram = self.entry.media_files.get('spectrogram')
+ if not spectrogram:
+ _log.info('No spectrogram found, we will create one.')
+ self.create_spectrogram()
+ spectrogram = self.entry.media_files['spectrogram']
+
+ spectrogram_filepath = mgg.public_store.get_local_path(spectrogram)
+
+ self.thumbnailer.thumbnail_spectrogram(
+ spectrogram_filepath,
+ thumb_tmp,
+ tuple(size))
+
+ store_public(self.entry, 'thumb', thumb_tmp,
+ self.name_builder.fill('{basename}.thumbnail.jpg'))
+
+ self.entry.set_file_metadata('thumb', **{'size': size})
+
+
+class InitialProcessor(CommonAudioProcessor):
+ """
+ Initial processing steps for new audio
+ """
+ name = "initial"
+ description = "Initial processing"
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ """
+ Determine if this media type is eligible for processing
+ """
+ if not state:
+ state = entry.state
+ return state in (
+ "unprocessed", "failed")
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--quality',
+ type=float,
+ help='vorbisenc quality. Range: -0.1..1')
+
+ parser.add_argument(
+ '--fft_size',
+ type=int,
+ help='spectrogram fft size')
+
+ parser.add_argument(
+ '--thumb_size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int,
+ help='minimum size is 100 x 100')
+
+ parser.add_argument(
+ '--medium_width',
+ type=int,
+ help='The width of the spectogram')
+
+ parser.add_argument(
+ '--create_spectrogram',
+ action='store_true',
+ help='Create spectogram and thumbnail, will default to config')
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['create_spectrogram', 'quality', 'fft_size',
+ 'thumb_size', 'medium_width'])
+
+ def process(self, quality=None, fft_size=None, thumb_size=None,
+ create_spectrogram=None, medium_width=None):
+ self.common_setup()
+
+ if not create_spectrogram:
+ create_spectrogram = self.audio_config['create_spectrogram']
+
+ self.transcode(quality=quality)
+ self.copy_original()
+
+ if create_spectrogram:
+ self.create_spectrogram(max_width=medium_width, fft_size=fft_size)
+ self.generate_thumb(size=thumb_size)
+ self.delete_queue_file()
+
+
+class Resizer(CommonAudioProcessor):
+ """
+ Thumbnail and spectogram resizing process steps for processed audio
+ """
+ name = 'resize'
+ description = 'Resize thumbnail or spectogram'
+ thumb_size = 'thumb_size'
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ """
+ Determine if this media entry is eligible for processing
+ """
+ if not state:
+ state = entry.state
+ return state in 'processed'
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--fft_size',
+ type=int,
+ help='spectrogram fft size')
+
+ parser.add_argument(
+ '--thumb_size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int,
+ help='minimum size is 100 x 100')
+
+ parser.add_argument(
+ '--medium_width',
+ type=int,
+ help='The width of the spectogram')
+
+ parser.add_argument(
+ 'file',
+ choices=['thumb', 'spectrogram'])
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['thumb_size', 'file', 'fft_size', 'medium_width'])
+
+ def process(self, file, thumb_size=None, fft_size=None,
+ medium_width=None):
+ self.common_setup()
+
+ if file == 'thumb':
+ self.generate_thumb(size=thumb_size)
+ elif file == 'spectrogram':
+ self.create_spectrogram(max_width=medium_width, fft_size=fft_size)
+
+
+class Transcoder(CommonAudioProcessor):
+ """
+ Transcoding processing steps for processed audio
+ """
+ name = 'transcode'
+ description = 'Re-transcode audio'
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ if not state:
+ state = entry.state
+ return state in 'processed'
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--quality',
+ help='vorbisenc quality. Range: -0.1..1')
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['quality'])
+
+ def process(self, quality=None):
+ self.common_setup()
+ self.transcode(quality=quality)
+
+
+class AudioProcessingManager(ProcessingManager):
+ def __init__(self):
+ super(self.__class__, self).__init__()
+ self.add_processor(InitialProcessor)
+ self.add_processor(Resizer)
+ self.add_processor(Transcoder)
diff --git a/mediagoblin/media_types/audio/transcoders.py b/mediagoblin/media_types/audio/transcoders.py
index 84e6af7e..150dad8e 100644
--- a/mediagoblin/media_types/audio/transcoders.py
+++ b/mediagoblin/media_types/audio/transcoders.py
@@ -122,8 +122,7 @@ class AudioThumbnailer(object):
int(start_x), 0,
int(stop_x), int(im_h)))
- if th.size[0] > th_w or th.size[1] > th_h:
- th.thumbnail(thumb_size, Image.ANTIALIAS)
+ th.thumbnail(thumb_size, Image.ANTIALIAS)
th.save(dst)
diff --git a/mediagoblin/media_types/image/__init__.py b/mediagoblin/media_types/image/__init__.py
index 1bb9c6f3..06e0f08f 100644
--- a/mediagoblin/media_types/image/__init__.py
+++ b/mediagoblin/media_types/image/__init__.py
@@ -14,24 +14,22 @@
# 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 datetime
+import logging
from mediagoblin.media_types import MediaManagerBase
-from mediagoblin.media_types.image.processing import process_image, \
- sniff_handler
-from mediagoblin.tools import pluginapi
+from mediagoblin.media_types.image.processing import sniff_handler, \
+ ImageProcessingManager
-ACCEPTED_EXTENSIONS = ["jpg", "jpeg", "png", "gif", "tiff"]
-MEDIA_TYPE = 'mediagoblin.media_types.image'
+_log = logging.getLogger(__name__)
-def setup_plugin():
- config = pluginapi.get_config('mediagoblin.media_types.image')
+ACCEPTED_EXTENSIONS = ["jpg", "jpeg", "png", "gif", "tiff"]
+MEDIA_TYPE = 'mediagoblin.media_types.image'
class ImageMediaManager(MediaManagerBase):
human_readable = "Image"
- processor = staticmethod(process_image)
display_template = "mediagoblin/media_displays/image.html"
default_thumb = "images/media_thumbs/image.png"
@@ -65,8 +63,8 @@ def get_media_type_and_manager(ext):
hooks = {
- 'setup': setup_plugin,
'get_media_type_and_manager': get_media_type_and_manager,
'sniff_handler': sniff_handler,
('media_manager', MEDIA_TYPE): lambda: ImageMediaManager,
+ ('reprocess_manager', MEDIA_TYPE): lambda: ImageProcessingManager,
}
diff --git a/mediagoblin/media_types/image/config_spec.ini b/mediagoblin/media_types/image/config_spec.ini
new file mode 100644
index 00000000..08111df2
--- /dev/null
+++ b/mediagoblin/media_types/image/config_spec.ini
@@ -0,0 +1,7 @@
+[plugin_spec]
+# One of BICUBIC, BILINEAR, NEAREST, ANTIALIAS
+resize_filter = string(default="ANTIALIAS")
+#level of compression used when resizing images
+quality = integer(default=90)
+
+
diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py
index baf2ac7e..a0ad2ce8 100644
--- a/mediagoblin/media_types/image/processing.py
+++ b/mediagoblin/media_types/image/processing.py
@@ -20,9 +20,14 @@ except ImportError:
import Image
import os
import logging
+import argparse
from mediagoblin import mg_globals as mgg
-from mediagoblin.processing import BadMediaFail, FilenameBuilder
+from mediagoblin.processing import (
+ BadMediaFail, FilenameBuilder,
+ MediaProcessor, ProcessingManager,
+ request_from_args, get_process_filename,
+ store_public, copy_original)
from mediagoblin.tools.exif import exif_fix_image_orientation, \
extract_exif, clean_exif, get_gps_data, get_useful, \
exif_image_needs_rotation
@@ -38,8 +43,8 @@ PIL_FILTERS = {
MEDIA_TYPE = 'mediagoblin.media_types.image'
-def resize_image(proc_state, resized, keyname, target_name, new_size,
- exif_tags, workdir):
+def resize_image(entry, resized, keyname, target_name, new_size,
+ exif_tags, workdir, quality, filter):
"""
Store a resized version of an image and return its pathname.
@@ -51,17 +56,16 @@ def resize_image(proc_state, resized, keyname, target_name, new_size,
exif_tags -- EXIF data for the original image
workdir -- directory path for storing converted image files
new_size -- 2-tuple size for the resized image
+ quality -- level of compression used when resizing images
+ filter -- One of BICUBIC, BILINEAR, NEAREST, ANTIALIAS
"""
- config = mgg.global_config['media_type:mediagoblin.media_types.image']
-
resized = exif_fix_image_orientation(resized, exif_tags) # Fix orientation
- filter_config = config['resize_filter']
try:
- resize_filter = PIL_FILTERS[filter_config.upper()]
+ resize_filter = PIL_FILTERS[filter.upper()]
except KeyError:
raise Exception('Filter "{0}" not found, choose one of {1}'.format(
- unicode(filter_config),
+ unicode(filter),
u', '.join(PIL_FILTERS.keys())))
resized.thumbnail(new_size, resize_filter)
@@ -69,32 +73,77 @@ def resize_image(proc_state, resized, keyname, target_name, new_size,
# Copy the new file to the conversion subdir, then remotely.
tmp_resized_filename = os.path.join(workdir, target_name)
with file(tmp_resized_filename, 'w') as resized_file:
- resized.save(resized_file, quality=config['quality'])
- proc_state.store_public(keyname, tmp_resized_filename, target_name)
-
+ resized.save(resized_file, quality=quality)
+ store_public(entry, keyname, tmp_resized_filename, target_name)
+
+ # store the thumb/medium info
+ image_info = {'width': new_size[0],
+ 'height': new_size[1],
+ 'quality': quality,
+ 'filter': filter}
+
+ entry.set_file_metadata(keyname, **image_info)
+
+
+def resize_tool(entry,
+ force, keyname, orig_file, target_name,
+ conversions_subdir, exif_tags, quality, filter, new_size=None):
+ # Use the default size if new_size was not given
+ if not new_size:
+ max_width = mgg.global_config['media:' + keyname]['max_width']
+ max_height = mgg.global_config['media:' + keyname]['max_height']
+ new_size = (max_width, max_height)
+
+ # If thumb or medium is already the same quality and size, then don't
+ # reprocess
+ if _skip_resizing(entry, keyname, new_size, quality, filter):
+ _log.info('{0} of same size and quality already in use, skipping '
+ 'resizing of media {1}.'.format(keyname, entry.id))
+ return
-def resize_tool(proc_state, force, keyname, target_name,
- conversions_subdir, exif_tags):
- # filename -- the filename of the original image being resized
- filename = proc_state.get_queued_filename()
- max_width = mgg.global_config['media:' + keyname]['max_width']
- max_height = mgg.global_config['media:' + keyname]['max_height']
# If the size of the original file exceeds the specified size for the desized
# file, a target_name file is created and later associated with the media
# entry.
# Also created if the file needs rotation, or if forced.
try:
- im = Image.open(filename)
+ im = Image.open(orig_file)
except IOError:
raise BadMediaFail()
if force \
- or im.size[0] > max_width \
- or im.size[1] > max_height \
+ or im.size[0] > new_size[0]\
+ or im.size[1] > new_size[1]\
or exif_image_needs_rotation(exif_tags):
resize_image(
- proc_state, im, unicode(keyname), target_name,
- (max_width, max_height),
- exif_tags, conversions_subdir)
+ entry, im, unicode(keyname), target_name,
+ tuple(new_size),
+ exif_tags, conversions_subdir,
+ quality, filter)
+
+
+def _skip_resizing(entry, keyname, size, quality, filter):
+ """
+ Determines wither the saved thumb or medium is of the same quality and size
+ """
+ image_info = entry.get_file_metadata(keyname)
+
+ if not image_info:
+ return False
+
+ skip = True
+
+ if image_info.get('width') != size[0]:
+ skip = False
+
+ elif image_info.get('height') != size[1]:
+ skip = False
+
+ elif image_info.get('filter') != filter:
+ skip = False
+
+ elif image_info.get('quality') != quality:
+ skip = False
+
+ return skip
SUPPORTED_FILETYPES = ['png', 'gif', 'jpg', 'jpeg', 'tiff']
@@ -119,53 +168,210 @@ def sniff_handler(media_file, **kw):
return None
-def process_image(proc_state):
- """Code to process an image. Will be run by celery.
-
- A Workbench() represents a local tempory dir. It is automatically
- cleaned up when this function exits.
+class CommonImageProcessor(MediaProcessor):
"""
- entry = proc_state.entry
- workbench = proc_state.workbench
-
- # Conversions subdirectory to avoid collisions
- conversions_subdir = os.path.join(
- workbench.dir, 'conversions')
- os.mkdir(conversions_subdir)
-
- queued_filename = proc_state.get_queued_filename()
- name_builder = FilenameBuilder(queued_filename)
-
- # EXIF extraction
- exif_tags = extract_exif(queued_filename)
- gps_data = get_gps_data(exif_tags)
-
- # Always create a small thumbnail
- resize_tool(proc_state, True, 'thumb',
- name_builder.fill('{basename}.thumbnail{ext}'),
- conversions_subdir, exif_tags)
-
- # Possibly create a medium
- resize_tool(proc_state, False, 'medium',
- name_builder.fill('{basename}.medium{ext}'),
- conversions_subdir, exif_tags)
-
- # Copy our queued local workbench to its final destination
- proc_state.copy_original(name_builder.fill('{basename}{ext}'))
-
- # Remove queued media file from storage and database
- proc_state.delete_queue_file()
-
- # Insert exif data into database
- exif_all = clean_exif(exif_tags)
-
- if len(exif_all):
- entry.media_data_init(exif_all=exif_all)
-
- if len(gps_data):
- for key in list(gps_data.keys()):
- gps_data['gps_' + key] = gps_data.pop(key)
- entry.media_data_init(**gps_data)
+ Provides a base for various media processing steps
+ """
+ # list of acceptable file keys in order of prefrence for reprocessing
+ acceptable_files = ['original', 'medium']
+
+ def common_setup(self):
+ """
+ Set up the workbench directory and pull down the original file
+ """
+ self.image_config = mgg.global_config['plugins'][
+ 'mediagoblin.media_types.image']
+
+ ## @@: Should this be two functions?
+ # Conversions subdirectory to avoid collisions
+ self.conversions_subdir = os.path.join(
+ self.workbench.dir, 'conversions')
+ os.mkdir(self.conversions_subdir)
+
+ # Pull down and set up the processing file
+ self.process_filename = get_process_filename(
+ self.entry, self.workbench, self.acceptable_files)
+ self.name_builder = FilenameBuilder(self.process_filename)
+
+ # Exif extraction
+ self.exif_tags = extract_exif(self.process_filename)
+
+ def generate_medium_if_applicable(self, size=None, quality=None,
+ filter=None):
+ if not quality:
+ quality = self.image_config['quality']
+ if not filter:
+ filter = self.image_config['resize_filter']
+
+ resize_tool(self.entry, False, 'medium', self.process_filename,
+ self.name_builder.fill('{basename}.medium{ext}'),
+ self.conversions_subdir, self.exif_tags, quality,
+ filter, size)
+
+ def generate_thumb(self, size=None, quality=None, filter=None):
+ if not quality:
+ quality = self.image_config['quality']
+ if not filter:
+ filter = self.image_config['resize_filter']
+
+ resize_tool(self.entry, True, 'thumb', self.process_filename,
+ self.name_builder.fill('{basename}.thumbnail{ext}'),
+ self.conversions_subdir, self.exif_tags, quality,
+ filter, size)
+
+ def copy_original(self):
+ copy_original(
+ self.entry, self.process_filename,
+ self.name_builder.fill('{basename}{ext}'))
+
+ def extract_metadata(self):
+ # Is there any GPS data
+ gps_data = get_gps_data(self.exif_tags)
+
+ # Insert exif data into database
+ exif_all = clean_exif(self.exif_tags)
+
+ if len(exif_all):
+ self.entry.media_data_init(exif_all=exif_all)
+
+ if len(gps_data):
+ for key in list(gps_data.keys()):
+ gps_data['gps_' + key] = gps_data.pop(key)
+ self.entry.media_data_init(**gps_data)
+
+
+class InitialProcessor(CommonImageProcessor):
+ """
+ Initial processing step for new images
+ """
+ name = "initial"
+ description = "Initial processing"
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ """
+ Determine if this media type is eligible for processing
+ """
+ if not state:
+ state = entry.state
+ return state in (
+ "unprocessed", "failed")
+
+ ###############################
+ # Command line interface things
+ ###############################
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ parser.add_argument(
+ '--thumb-size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ parser.add_argument(
+ '--filter',
+ choices=['BICUBIC', 'BILINEAR', 'NEAREST', 'ANTIALIAS'])
+
+ parser.add_argument(
+ '--quality',
+ type=int,
+ help='level of compression used when resizing images')
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['size', 'thumb_size', 'filter', 'quality'])
+
+ def process(self, size=None, thumb_size=None, quality=None, filter=None):
+ self.common_setup()
+ self.generate_medium_if_applicable(size=size, filter=filter,
+ quality=quality)
+ self.generate_thumb(size=thumb_size, filter=filter, quality=quality)
+ self.copy_original()
+ self.extract_metadata()
+ self.delete_queue_file()
+
+
+class Resizer(CommonImageProcessor):
+ """
+ Resizing process steps for processed media
+ """
+ name = 'resize'
+ description = 'Resize image'
+ thumb_size = 'size'
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ """
+ Determine if this media type is eligible for processing
+ """
+ if not state:
+ state = entry.state
+ return state in 'processed'
+
+ ###############################
+ # Command line interface things
+ ###############################
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ parser.add_argument(
+ '--filter',
+ choices=['BICUBIC', 'BILINEAR', 'NEAREST', 'ANTIALIAS'])
+
+ parser.add_argument(
+ '--quality',
+ type=int,
+ help='level of compression used when resizing images')
+
+ parser.add_argument(
+ 'file',
+ choices=['medium', 'thumb'])
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['size', 'file', 'quality', 'filter'])
+
+ def process(self, file, size=None, filter=None, quality=None):
+ self.common_setup()
+ if file == 'medium':
+ self.generate_medium_if_applicable(size=size, filter=filter,
+ quality=quality)
+ elif file == 'thumb':
+ self.generate_thumb(size=size, filter=filter, quality=quality)
+
+
+class ImageProcessingManager(ProcessingManager):
+ def __init__(self):
+ super(self.__class__, self).__init__()
+ self.add_processor(InitialProcessor)
+ self.add_processor(Resizer)
if __name__ == '__main__':
diff --git a/mediagoblin/media_types/pdf/__init__.py b/mediagoblin/media_types/pdf/__init__.py
index 67509ddc..de70389e 100644
--- a/mediagoblin/media_types/pdf/__init__.py
+++ b/mediagoblin/media_types/pdf/__init__.py
@@ -15,21 +15,16 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from mediagoblin.media_types import MediaManagerBase
-from mediagoblin.media_types.pdf.processing import process_pdf, \
+from mediagoblin.media_types.pdf.processing import PdfProcessingManager, \
sniff_handler
-from mediagoblin.tools import pluginapi
+
ACCEPTED_EXTENSIONS = ['pdf']
MEDIA_TYPE = 'mediagoblin.media_types.pdf'
-def setup_plugin():
- config = pluginapi.get_config(MEDIA_TYPE)
-
-
class PDFMediaManager(MediaManagerBase):
human_readable = "PDF"
- processor = staticmethod(process_pdf)
display_template = "mediagoblin/media_displays/pdf.html"
default_thumb = "images/media_thumbs/pdf.jpg"
@@ -40,8 +35,8 @@ def get_media_type_and_manager(ext):
hooks = {
- 'setup': setup_plugin,
'get_media_type_and_manager': get_media_type_and_manager,
'sniff_handler': sniff_handler,
('media_manager', MEDIA_TYPE): lambda: PDFMediaManager,
+ ('reprocess_manager', MEDIA_TYPE): lambda: PdfProcessingManager,
}
diff --git a/mediagoblin/media_types/pdf/config_spec.ini b/mediagoblin/media_types/pdf/config_spec.ini
new file mode 100644
index 00000000..c8a12cba
--- /dev/null
+++ b/mediagoblin/media_types/pdf/config_spec.ini
@@ -0,0 +1,5 @@
+[plugin_spec]
+pdf_js = boolean(default=True)
+
+
+
diff --git a/mediagoblin/media_types/pdf/processing.py b/mediagoblin/media_types/pdf/processing.py
index f35b4376..b60495eb 100644
--- a/mediagoblin/media_types/pdf/processing.py
+++ b/mediagoblin/media_types/pdf/processing.py
@@ -13,14 +13,18 @@
#
# 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 argparse
import os
import logging
import dateutil.parser
from subprocess import PIPE, Popen
from mediagoblin import mg_globals as mgg
-from mediagoblin.processing import (create_pub_filepath,
- FilenameBuilder, BadMediaFail)
+from mediagoblin.processing import (
+ FilenameBuilder, BadMediaFail,
+ MediaProcessor, ProcessingManager,
+ request_from_args, get_process_filename,
+ store_public, copy_original)
from mediagoblin.tools.translate import fake_ugettext_passthrough as _
_log = logging.getLogger(__name__)
@@ -230,51 +234,233 @@ def pdf_info(original):
return ret_dict
-def process_pdf(proc_state):
- """Code to process a pdf file. Will be run by celery.
- A Workbench() represents a local tempory dir. It is automatically
- cleaned up when this function exits.
+class CommonPdfProcessor(MediaProcessor):
"""
- entry = proc_state.entry
- workbench = proc_state.workbench
-
- queued_filename = proc_state.get_queued_filename()
- name_builder = FilenameBuilder(queued_filename)
-
- # Copy our queued local workbench to its final destination
- original_dest = name_builder.fill('{basename}{ext}')
- proc_state.copy_original(original_dest)
-
- # Create a pdf if this is a different doc, store pdf for viewer
- ext = queued_filename.rsplit('.', 1)[-1].lower()
- if ext == 'pdf':
- pdf_filename = queued_filename
- else:
- pdf_filename = queued_filename.rsplit('.', 1)[0] + '.pdf'
+ Provides a base for various pdf processing steps
+ """
+ acceptable_files = ['original', 'pdf']
+
+ def common_setup(self):
+ """
+ Set up common pdf processing steps
+ """
+ # Pull down and set up the processing file
+ self.process_filename = get_process_filename(
+ self.entry, self.workbench, self.acceptable_files)
+ self.name_builder = FilenameBuilder(self.process_filename)
+
+ self._set_pdf_filename()
+
+ def _set_pdf_filename(self):
+ if self.name_builder.ext == '.pdf':
+ self.pdf_filename = self.process_filename
+ elif self.entry.media_files.get('pdf'):
+ self.pdf_filename = self.workbench.localized_file(
+ mgg.public_store, self.entry.media_files['pdf'])
+ else:
+ self.pdf_filename = self._generate_pdf()
+
+ def _skip_processing(self, keyname, **kwargs):
+ file_metadata = self.entry.get_file_metadata(keyname)
+ skip = True
+
+ if not file_metadata:
+ return False
+
+ if keyname == 'thumb':
+ if kwargs.get('thumb_size') != file_metadata.get('thumb_size'):
+ skip = False
+ elif keyname == 'medium':
+ if kwargs.get('size') != file_metadata.get('size'):
+ skip = False
+
+ return skip
+
+ def copy_original(self):
+ copy_original(
+ self.entry, self.process_filename,
+ self.name_builder.fill('{basename}{ext}'))
+
+ def generate_thumb(self, thumb_size=None):
+ if not thumb_size:
+ thumb_size = (mgg.global_config['media:thumb']['max_width'],
+ mgg.global_config['media:thumb']['max_height'])
+
+ if self._skip_processing('thumb', thumb_size=thumb_size):
+ return
+
+ # Note: pdftocairo adds '.png', so don't include an ext
+ thumb_filename = os.path.join(self.workbench.dir,
+ self.name_builder.fill(
+ '{basename}.thumbnail'))
+
+ executable = where('pdftocairo')
+ args = [executable, '-scale-to', str(min(thumb_size)),
+ '-singlefile', '-png', self.pdf_filename, thumb_filename]
+
+ _log.debug('calling {0}'.format(repr(' '.join(args))))
+ Popen(executable=executable, args=args).wait()
+
+ # since pdftocairo added '.png', we need to include it with the
+ # filename
+ store_public(self.entry, 'thumb', thumb_filename + '.png',
+ self.name_builder.fill('{basename}.thumbnail.png'))
+
+ self.entry.set_file_metadata('thumb', thumb_size=thumb_size)
+
+ def _generate_pdf(self):
+ """
+ Store the pdf. If the file is not a pdf, make it a pdf
+ """
+ tmp_pdf = self.process_filename
+
unoconv = where('unoconv')
Popen(executable=unoconv,
- args=[unoconv, '-v', '-f', 'pdf', queued_filename]).wait()
- if not os.path.exists(pdf_filename):
+ args=[unoconv, '-v', '-f', 'pdf', self.process_filename]).wait()
+
+ if not os.path.exists(tmp_pdf):
_log.debug('unoconv failed to convert file to pdf')
raise BadMediaFail()
- proc_state.store_public(keyname=u'pdf', local_file=pdf_filename)
-
- pdf_info_dict = pdf_info(pdf_filename)
-
- for name, width, height in [
- (u'thumb', mgg.global_config['media:thumb']['max_width'],
- mgg.global_config['media:thumb']['max_height']),
- (u'medium', mgg.global_config['media:medium']['max_width'],
- mgg.global_config['media:medium']['max_height']),
- ]:
- filename = name_builder.fill('{basename}.%s.png' % name)
- path = workbench.joinpath(filename)
- create_pdf_thumb(pdf_filename, path, width, height)
- assert(os.path.exists(path))
- proc_state.store_public(keyname=name, local_file=path)
-
- proc_state.delete_queue_file()
-
- entry.media_data_init(**pdf_info_dict)
- entry.save()
+
+ store_public(self.entry, 'pdf', tmp_pdf,
+ self.name_builder.fill('{basename}.pdf'))
+
+ return self.workbench.localized_file(
+ mgg.public_store, self.entry.media_files['pdf'])
+
+ def extract_pdf_info(self):
+ pdf_info_dict = pdf_info(self.pdf_filename)
+ self.entry.media_data_init(**pdf_info_dict)
+
+ def generate_medium(self, size=None):
+ if not size:
+ size = (mgg.global_config['media:medium']['max_width'],
+ mgg.global_config['media:medium']['max_height'])
+
+ if self._skip_processing('medium', size=size):
+ return
+
+ # Note: pdftocairo adds '.png', so don't include an ext
+ filename = os.path.join(self.workbench.dir,
+ self.name_builder.fill('{basename}.medium'))
+
+ executable = where('pdftocairo')
+ args = [executable, '-scale-to', str(min(size)),
+ '-singlefile', '-png', self.pdf_filename, filename]
+
+ _log.debug('calling {0}'.format(repr(' '.join(args))))
+ Popen(executable=executable, args=args).wait()
+
+ # since pdftocairo added '.png', we need to include it with the
+ # filename
+ store_public(self.entry, 'medium', filename + '.png',
+ self.name_builder.fill('{basename}.medium.png'))
+
+ self.entry.set_file_metadata('medium', size=size)
+
+
+class InitialProcessor(CommonPdfProcessor):
+ """
+ Initial processing step for new pdfs
+ """
+ name = "initial"
+ description = "Initial processing"
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ """
+ Determine if this media type is eligible for processing
+ """
+ if not state:
+ state = entry.state
+ return state in (
+ "unprocessed", "failed")
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ parser.add_argument(
+ '--thumb-size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['size', 'thumb_size'])
+
+ def process(self, size=None, thumb_size=None):
+ self.common_setup()
+ self.extract_pdf_info()
+ self.copy_original()
+ self.generate_medium(size=size)
+ self.generate_thumb(thumb_size=thumb_size)
+ self.delete_queue_file()
+
+
+class Resizer(CommonPdfProcessor):
+ """
+ Resizing process steps for processed pdfs
+ """
+ name = 'resize'
+ description = 'Resize thumbnail and medium'
+ thumb_size = 'size'
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ """
+ Determine if this media type is eligible for processing
+ """
+ if not state:
+ state = entry.state
+ return state in 'processed'
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ parser.add_argument(
+ 'file',
+ choices=['medium', 'thumb'])
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['size', 'file'])
+
+ def process(self, file, size=None):
+ self.common_setup()
+ if file == 'medium':
+ self.generate_medium(size=size)
+ elif file == 'thumb':
+ self.generate_thumb(thumb_size=size)
+
+
+class PdfProcessingManager(ProcessingManager):
+ def __init__(self):
+ super(self.__class__, self).__init__()
+ self.add_processor(InitialProcessor)
+ self.add_processor(Resizer)
diff --git a/mediagoblin/media_types/stl/__init__.py b/mediagoblin/media_types/stl/__init__.py
index 1d2a8478..d5b56b4b 100644
--- a/mediagoblin/media_types/stl/__init__.py
+++ b/mediagoblin/media_types/stl/__init__.py
@@ -15,21 +15,16 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from mediagoblin.media_types import MediaManagerBase
-from mediagoblin.media_types.stl.processing import process_stl, \
+from mediagoblin.media_types.stl.processing import StlProcessingManager, \
sniff_handler
-from mediagoblin.tools import pluginapi
+
MEDIA_TYPE = 'mediagoblin.media_types.stl'
ACCEPTED_EXTENSIONS = ["obj", "stl"]
-def setup_plugin():
- config = pluginapi.get_config(MEDIA_TYPE)
-
-
class STLMediaManager(MediaManagerBase):
human_readable = "stereo lithographics"
- processor = staticmethod(process_stl)
display_template = "mediagoblin/media_displays/stl.html"
default_thumb = "images/media_thumbs/video.jpg"
@@ -39,8 +34,8 @@ def get_media_type_and_manager(ext):
return MEDIA_TYPE, STLMediaManager
hooks = {
- 'setup': setup_plugin,
'get_media_type_and_manager': get_media_type_and_manager,
'sniff_handler': sniff_handler,
('media_manager', MEDIA_TYPE): lambda: STLMediaManager,
+ ('reprocess_manager', MEDIA_TYPE): lambda: StlProcessingManager,
}
diff --git a/mediagoblin/media_types/stl/processing.py b/mediagoblin/media_types/stl/processing.py
index 53751416..39949b59 100644
--- a/mediagoblin/media_types/stl/processing.py
+++ b/mediagoblin/media_types/stl/processing.py
@@ -14,6 +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/>.
+import argparse
import os
import json
import logging
@@ -21,8 +22,11 @@ import subprocess
import pkg_resources
from mediagoblin import mg_globals as mgg
-from mediagoblin.processing import create_pub_filepath, \
- FilenameBuilder
+from mediagoblin.processing import (
+ FilenameBuilder, MediaProcessor,
+ ProcessingManager, request_from_args,
+ get_process_filename, store_public,
+ copy_original)
from mediagoblin.media_types.stl import model_loader
@@ -75,49 +79,61 @@ def blender_render(config):
env=env)
-def process_stl(proc_state):
- """Code to process an stl or obj model. Will be run by celery.
-
- A Workbench() represents a local tempory dir. It is automatically
- cleaned up when this function exits.
+class CommonStlProcessor(MediaProcessor):
"""
- entry = proc_state.entry
- workbench = proc_state.workbench
-
- queued_filepath = entry.queued_media_file
- queued_filename = workbench.localized_file(
- mgg.queue_store, queued_filepath, 'source')
- name_builder = FilenameBuilder(queued_filename)
-
- ext = queued_filename.lower().strip()[-4:]
- if ext.startswith("."):
- ext = ext[1:]
- else:
- ext = None
-
- # Attempt to parse the model file and divine some useful
- # information about it.
- with open(queued_filename, 'rb') as model_file:
- model = model_loader.auto_detect(model_file, ext)
-
- # generate preview images
- greatest = [model.width, model.height, model.depth]
- greatest.sort()
- greatest = greatest[-1]
-
- def snap(name, camera, width=640, height=640, project="ORTHO"):
- filename = name_builder.fill(name)
- workbench_path = workbench.joinpath(filename)
+ Provides a common base for various stl processing steps
+ """
+ acceptable_files = ['original']
+
+ def common_setup(self):
+ # Pull down and set up the processing file
+ self.process_filename = get_process_filename(
+ self.entry, self.workbench, self.acceptable_files)
+ self.name_builder = FilenameBuilder(self.process_filename)
+
+ self._set_ext()
+ self._set_model()
+ self._set_greatest()
+
+ def _set_ext(self):
+ ext = self.name_builder.ext[1:]
+
+ if not ext:
+ ext = None
+
+ self.ext = ext
+
+ def _set_model(self):
+ """
+ Attempt to parse the model file and divine some useful
+ information about it.
+ """
+ with open(self.process_filename, 'rb') as model_file:
+ self.model = model_loader.auto_detect(model_file, self.ext)
+
+ def _set_greatest(self):
+ greatest = [self.model.width, self.model.height, self.model.depth]
+ greatest.sort()
+ self.greatest = greatest[-1]
+
+ def copy_original(self):
+ copy_original(
+ self.entry, self.process_filename,
+ self.name_builder.fill('{basename}{ext}'))
+
+ def _snap(self, keyname, name, camera, size, project="ORTHO"):
+ filename = self.name_builder.fill(name)
+ workbench_path = self.workbench.joinpath(filename)
shot = {
- "model_path": queued_filename,
- "model_ext": ext,
+ "model_path": self.process_filename,
+ "model_ext": self.ext,
"camera_coord": camera,
- "camera_focus": model.average,
- "camera_clip": greatest*10,
- "greatest": greatest,
+ "camera_focus": self.model.average,
+ "camera_clip": self.greatest*10,
+ "greatest": self.greatest,
"projection": project,
- "width": width,
- "height": height,
+ "width": size[0],
+ "height": size[1],
"out_file": workbench_path,
}
blender_render(shot)
@@ -126,70 +142,232 @@ def process_stl(proc_state):
assert os.path.exists(workbench_path)
# copy it up!
- with open(workbench_path, 'rb') as rendered_file:
- public_path = create_pub_filepath(entry, filename)
-
- with mgg.public_store.get_file(public_path, "wb") as public_file:
- public_file.write(rendered_file.read())
-
- return public_path
-
- thumb_path = snap(
- "{basename}.thumb.jpg",
- [0, greatest*-1.5, greatest],
- mgg.global_config['media:thumb']['max_width'],
- mgg.global_config['media:thumb']['max_height'],
- project="PERSP")
-
- perspective_path = snap(
- "{basename}.perspective.jpg",
- [0, greatest*-1.5, greatest], project="PERSP")
-
- topview_path = snap(
- "{basename}.top.jpg",
- [model.average[0], model.average[1], greatest*2])
-
- frontview_path = snap(
- "{basename}.front.jpg",
- [model.average[0], greatest*-2, model.average[2]])
-
- sideview_path = snap(
- "{basename}.side.jpg",
- [greatest*-2, model.average[1], model.average[2]])
-
- ## Save the public file stuffs
- model_filepath = create_pub_filepath(
- entry, name_builder.fill('{basename}{ext}'))
-
- with mgg.public_store.get_file(model_filepath, 'wb') as model_file:
- with open(queued_filename, 'rb') as queued_file:
- model_file.write(queued_file.read())
-
- # Remove queued media file from storage and database.
- # queued_filepath is in the task_id directory which should
- # be removed too, but fail if the directory is not empty to be on
- # the super-safe side.
- mgg.queue_store.delete_file(queued_filepath) # rm file
- mgg.queue_store.delete_dir(queued_filepath[:-1]) # rm dir
- entry.queued_media_file = []
-
- # Insert media file information into database
- media_files_dict = entry.setdefault('media_files', {})
- media_files_dict[u'original'] = model_filepath
- media_files_dict[u'thumb'] = thumb_path
- media_files_dict[u'perspective'] = perspective_path
- media_files_dict[u'top'] = topview_path
- media_files_dict[u'side'] = sideview_path
- media_files_dict[u'front'] = frontview_path
-
- # Put model dimensions into the database
- dimensions = {
- "center_x" : model.average[0],
- "center_y" : model.average[1],
- "center_z" : model.average[2],
- "width" : model.width,
- "height" : model.height,
- "depth" : model.depth,
- "file_type" : ext,
- }
- entry.media_data_init(**dimensions)
+ store_public(self.entry, keyname, workbench_path, filename)
+
+ def _skip_processing(self, keyname, **kwargs):
+ file_metadata = self.entry.get_file_metadata(keyname)
+
+ if not file_metadata:
+ return False
+ skip = True
+
+ if keyname == 'thumb':
+ if kwargs.get('thumb_size') != file_metadata.get('thumb_size'):
+ skip = False
+ else:
+ if kwargs.get('size') != file_metadata.get('size'):
+ skip = False
+
+ return skip
+
+ def generate_thumb(self, thumb_size=None):
+ if not thumb_size:
+ thumb_size = (mgg.global_config['media:thumb']['max_width'],
+ mgg.global_config['media:thumb']['max_height'])
+
+ if self._skip_processing('thumb', thumb_size=thumb_size):
+ return
+
+ self._snap(
+ "thumb",
+ "{basename}.thumb.jpg",
+ [0, self.greatest*-1.5, self.greatest],
+ thumb_size,
+ project="PERSP")
+
+ self.entry.set_file_metadata('thumb', thumb_size=thumb_size)
+
+ def generate_perspective(self, size=None):
+ if not size:
+ size = (mgg.global_config['media:medium']['max_width'],
+ mgg.global_config['media:medium']['max_height'])
+
+ if self._skip_processing('perspective', size=size):
+ return
+
+ self._snap(
+ "perspective",
+ "{basename}.perspective.jpg",
+ [0, self.greatest*-1.5, self.greatest],
+ size,
+ project="PERSP")
+
+ self.entry.set_file_metadata('perspective', size=size)
+
+ def generate_topview(self, size=None):
+ if not size:
+ size = (mgg.global_config['media:medium']['max_width'],
+ mgg.global_config['media:medium']['max_height'])
+
+ if self._skip_processing('top', size=size):
+ return
+
+ self._snap(
+ "top",
+ "{basename}.top.jpg",
+ [self.model.average[0], self.model.average[1],
+ self.greatest*2],
+ size)
+
+ self.entry.set_file_metadata('top', size=size)
+
+ def generate_frontview(self, size=None):
+ if not size:
+ size = (mgg.global_config['media:medium']['max_width'],
+ mgg.global_config['media:medium']['max_height'])
+
+ if self._skip_processing('front', size=size):
+ return
+
+ self._snap(
+ "front",
+ "{basename}.front.jpg",
+ [self.model.average[0], self.greatest*-2,
+ self.model.average[2]],
+ size)
+
+ self.entry.set_file_metadata('front', size=size)
+
+ def generate_sideview(self, size=None):
+ if not size:
+ size = (mgg.global_config['media:medium']['max_width'],
+ mgg.global_config['media:medium']['max_height'])
+
+ if self._skip_processing('side', size=size):
+ return
+
+ self._snap(
+ "side",
+ "{basename}.side.jpg",
+ [self.greatest*-2, self.model.average[1],
+ self.model.average[2]],
+ size)
+
+ self.entry.set_file_metadata('side', size=size)
+
+ def store_dimensions(self):
+ """
+ Put model dimensions into the database
+ """
+ dimensions = {
+ "center_x": self.model.average[0],
+ "center_y": self.model.average[1],
+ "center_z": self.model.average[2],
+ "width": self.model.width,
+ "height": self.model.height,
+ "depth": self.model.depth,
+ "file_type": self.ext,
+ }
+ self.entry.media_data_init(**dimensions)
+
+
+class InitialProcessor(CommonStlProcessor):
+ """
+ Initial processing step for new stls
+ """
+ name = "initial"
+ description = "Initial processing"
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ """
+ Determine if this media type is eligible for processing
+ """
+ if not state:
+ state = entry.state
+ return state in (
+ "unprocessed", "failed")
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ parser.add_argument(
+ '--thumb_size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['size', 'thumb_size'])
+
+ def process(self, size=None, thumb_size=None):
+ self.common_setup()
+ self.generate_thumb(thumb_size=thumb_size)
+ self.generate_perspective(size=size)
+ self.generate_topview(size=size)
+ self.generate_frontview(size=size)
+ self.generate_sideview(size=size)
+ self.store_dimensions()
+ self.copy_original()
+ self.delete_queue_file()
+
+
+class Resizer(CommonStlProcessor):
+ """
+ Resizing process steps for processed stls
+ """
+ name = 'resize'
+ description = 'Resize thumbnail and mediums'
+ thumb_size = 'size'
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ """
+ Determine if this media type is eligible for processing
+ """
+ if not state:
+ state = entry.state
+ return state in 'processed'
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ parser.add_argument(
+ 'file',
+ choices=['medium', 'thumb'])
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['size', 'file'])
+
+ def process(self, file, size=None):
+ self.common_setup()
+ if file == 'medium':
+ self.generate_perspective(size=size)
+ self.generate_topview(size=size)
+ self.generate_frontview(size=size)
+ self.generate_sideview(size=size)
+ elif file == 'thumb':
+ self.generate_thumb(thumb_size=size)
+
+
+class StlProcessingManager(ProcessingManager):
+ def __init__(self):
+ super(self.__class__, self).__init__()
+ self.add_processor(InitialProcessor)
+ self.add_processor(Resizer)
diff --git a/mediagoblin/media_types/video/__init__.py b/mediagoblin/media_types/video/__init__.py
index e8a4308b..c85cc0b2 100644
--- a/mediagoblin/media_types/video/__init__.py
+++ b/mediagoblin/media_types/video/__init__.py
@@ -15,27 +15,22 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from mediagoblin.media_types import MediaManagerBase
-from mediagoblin.media_types.video.processing import process_video, \
+from mediagoblin.media_types.video.processing import VideoProcessingManager, \
sniff_handler
-from mediagoblin.tools import pluginapi
+
MEDIA_TYPE = 'mediagoblin.media_types.video'
ACCEPTED_EXTENSIONS = [
"mp4", "mov", "webm", "avi", "3gp", "3gpp", "mkv", "ogv", "m4v"]
-def setup_plugin():
- config = pluginapi.get_config(MEDIA_TYPE)
-
-
class VideoMediaManager(MediaManagerBase):
human_readable = "Video"
- processor = staticmethod(process_video)
display_template = "mediagoblin/media_displays/video.html"
default_thumb = "images/media_thumbs/video.jpg"
# Used by the media_entry.get_display_media method
- media_fetch_order = [u'webm_640', u'original']
+ media_fetch_order = [u'webm_video', u'original']
default_webm_type = 'video/webm; codecs="vp8, vorbis"'
@@ -44,8 +39,8 @@ def get_media_type_and_manager(ext):
return MEDIA_TYPE, VideoMediaManager
hooks = {
- 'setup': setup_plugin,
'get_media_type_and_manager': get_media_type_and_manager,
'sniff_handler': sniff_handler,
('media_manager', MEDIA_TYPE): lambda: VideoMediaManager,
+ ('reprocess_manager', MEDIA_TYPE): lambda: VideoProcessingManager,
}
diff --git a/mediagoblin/media_types/video/config_spec.ini b/mediagoblin/media_types/video/config_spec.ini
new file mode 100644
index 00000000..98714f56
--- /dev/null
+++ b/mediagoblin/media_types/video/config_spec.ini
@@ -0,0 +1,22 @@
+[plugin_spec]
+# Should we keep the original file?
+keep_original = boolean(default=False)
+
+# 0 means autodetect, autodetect means number_of_CPUs - 1
+vp8_threads = integer(default=0)
+# Range: 0..10
+vp8_quality = integer(default=8)
+# Range: -0.1..1
+vorbis_quality = float(default=0.3)
+
+# Autoplay the video when page is loaded?
+auto_play = boolean(default=False)
+
+[[skip_transcode]]
+mime_types = string_list(default=list("video/webm"))
+container_formats = string_list(default=list("Matroska"))
+video_codecs = string_list(default=list("VP8 video"))
+audio_codecs = string_list(default=list("Vorbis"))
+dimensions_match = boolean(default=True)
+
+
diff --git a/mediagoblin/media_types/video/migrations.py b/mediagoblin/media_types/video/migrations.py
index 442bbd8d..d68e2933 100644
--- a/mediagoblin/media_types/video/migrations.py
+++ b/mediagoblin/media_types/video/migrations.py
@@ -20,6 +20,7 @@ from sqlalchemy import MetaData, Column, Unicode
MIGRATIONS = {}
+
@RegisterMigration(1, MIGRATIONS)
def add_orig_metadata_column(db_conn):
metadata = MetaData(bind=db_conn.bind)
@@ -30,3 +31,19 @@ def add_orig_metadata_column(db_conn):
default=None, nullable=True)
col.create(vid_data)
db_conn.commit()
+
+
+@RegisterMigration(2, MIGRATIONS)
+def webm_640_to_webm_video(db):
+ metadata = MetaData(bind=db.bind)
+
+ file_keynames = inspect_table(metadata, 'core__file_keynames')
+
+ for row in db.execute(file_keynames.select()):
+ if row.name == 'webm_640':
+ db.execute(
+ file_keynames.update(). \
+ where(file_keynames.c.id==row.id).\
+ values(name='webm_video'))
+
+ db.commit()
diff --git a/mediagoblin/media_types/video/models.py b/mediagoblin/media_types/video/models.py
index 0b52c53f..be9d258f 100644
--- a/mediagoblin/media_types/video/models.py
+++ b/mediagoblin/media_types/video/models.py
@@ -36,12 +36,12 @@ class VideoData(Base):
- orig_metadata: A loose json structure containing metadata gstreamer
pulled from the original video.
This field is NOT GUARANTEED to exist!
-
+
Likely metadata extracted:
"videoheight", "videolength", "videowidth",
"audiorate", "audiolength", "audiochannels", "audiowidth",
"mimetype", "tags"
-
+
TODO: document the above better.
"""
__tablename__ = "video__mediadata"
@@ -68,7 +68,7 @@ class VideoData(Base):
"""
orig_metadata = self.orig_metadata or {}
- if "webm_640" not in self.get_media_entry.media_files \
+ if "webm_video" not in self.get_media_entry.media_files \
and "mimetype" in orig_metadata \
and "tags" in orig_metadata \
and "audio-codec" in orig_metadata["tags"] \
diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py
index 857c1647..5ef9b854 100644
--- a/mediagoblin/media_types/video/processing.py
+++ b/mediagoblin/media_types/video/processing.py
@@ -14,13 +14,18 @@
# 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 argparse
import os.path
import logging
import datetime
from mediagoblin import mg_globals as mgg
-from mediagoblin.processing import \
- create_pub_filepath, FilenameBuilder, BaseProcessingFail, ProgressCallback
+from mediagoblin.processing import (
+ FilenameBuilder, BaseProcessingFail,
+ ProgressCallback, MediaProcessor,
+ ProcessingManager, request_from_args,
+ get_process_filename, store_public,
+ copy_original)
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
from . import transcoders
@@ -48,115 +53,15 @@ def sniff_handler(media_file, **kw):
if not data:
_log.error('Could not discover {0}'.format(
- kw.get('media')))
+ kw.get('media')))
return None
- if data['is_video'] == True:
+ if data['is_video'] is True:
return MEDIA_TYPE
return None
-def process_video(proc_state):
- """
- Process a video entry, transcode the queued media files (originals) and
- create a thumbnail for the entry.
-
- A Workbench() represents a local tempory dir. It is automatically
- cleaned up when this function exits.
- """
- entry = proc_state.entry
- workbench = proc_state.workbench
- video_config = mgg.global_config['media_type:mediagoblin.media_types.video']
-
- queued_filepath = entry.queued_media_file
- queued_filename = proc_state.get_queued_filename()
- name_builder = FilenameBuilder(queued_filename)
-
- medium_basename = name_builder.fill('{basename}-640p.webm')
- medium_filepath = create_pub_filepath(entry, medium_basename)
-
- thumbnail_basename = name_builder.fill('{basename}.thumbnail.jpg')
- thumbnail_filepath = create_pub_filepath(entry, thumbnail_basename)
-
- # Create a temporary file for the video destination (cleaned up with workbench)
- tmp_dst = os.path.join(workbench.dir, medium_basename)
- # Transcode queued file to a VP8/vorbis file that fits in a 640x640 square
- progress_callback = ProgressCallback(entry)
-
- dimensions = (
- mgg.global_config['media:medium']['max_width'],
- mgg.global_config['media:medium']['max_height'])
-
- # Extract metadata and keep a record of it
- metadata = transcoders.VideoTranscoder().discover(queued_filename)
- store_metadata(entry, metadata)
-
- # Figure out whether or not we need to transcode this video or
- # if we can skip it
- if skip_transcode(metadata):
- _log.debug('Skipping transcoding')
-
- dst_dimensions = metadata['videowidth'], metadata['videoheight']
-
- # Push original file to public storage
- _log.debug('Saving original...')
- proc_state.copy_original(queued_filepath[-1])
-
- did_transcode = False
- else:
- transcoder = transcoders.VideoTranscoder()
-
- transcoder.transcode(queued_filename, tmp_dst,
- vp8_quality=video_config['vp8_quality'],
- vp8_threads=video_config['vp8_threads'],
- vorbis_quality=video_config['vorbis_quality'],
- progress_callback=progress_callback,
- dimensions=dimensions)
-
- dst_dimensions = transcoder.dst_data.videowidth,\
- transcoder.dst_data.videoheight
-
- # Push transcoded video to public storage
- _log.debug('Saving medium...')
- mgg.public_store.copy_local_to_storage(tmp_dst, medium_filepath)
- _log.debug('Saved medium')
-
- entry.media_files['webm_640'] = medium_filepath
-
- did_transcode = True
-
- # Save the width and height of the transcoded video
- entry.media_data_init(
- width=dst_dimensions[0],
- height=dst_dimensions[1])
-
- # Temporary file for the video thumbnail (cleaned up with workbench)
- tmp_thumb = os.path.join(workbench.dir, thumbnail_basename)
-
- # Create a thumbnail.jpg that fits in a 180x180 square
- transcoders.VideoThumbnailerMarkII(
- queued_filename,
- tmp_thumb,
- 180)
-
- # Push the thumbnail to public storage
- _log.debug('Saving thumbnail...')
- mgg.public_store.copy_local_to_storage(tmp_thumb, thumbnail_filepath)
- entry.media_files['thumb'] = thumbnail_filepath
-
- # save the original... but only if we did a transcoding
- # (if we skipped transcoding and just kept the original anyway as the main
- # media, then why would we save the original twice?)
- if video_config['keep_original'] and did_transcode:
- # Push original file to public storage
- _log.debug('Saving original...')
- proc_state.copy_original(queued_filepath[-1])
-
- # Remove queued media file from storage and database
- proc_state.delete_queue_file()
-
-
def store_metadata(media_entry, metadata):
"""
Store metadata from this video for this media entry.
@@ -165,9 +70,9 @@ def store_metadata(media_entry, metadata):
stored_metadata = dict(
[(key, metadata[key])
for key in [
- "videoheight", "videolength", "videowidth",
- "audiorate", "audiolength", "audiochannels", "audiowidth",
- "mimetype"]
+ "videoheight", "videolength", "videowidth",
+ "audiorate", "audiolength", "audiochannels", "audiowidth",
+ "mimetype"]
if key in metadata])
# We have to convert videorate into a sequence because it's a
@@ -186,10 +91,10 @@ def store_metadata(media_entry, metadata):
tags = dict(
[(key, tags_metadata[key])
for key in [
- "application-name", "artist", "audio-codec", "bitrate",
- "container-format", "copyright", "encoder",
- "encoder-version", "license", "nominal-bitrate", "title",
- "video-codec"]
+ "application-name", "artist", "audio-codec", "bitrate",
+ "container-format", "copyright", "encoder",
+ "encoder-version", "license", "nominal-bitrate", "title",
+ "video-codec"]
if key in tags_metadata])
if 'date' in tags_metadata:
date = tags_metadata['date']
@@ -211,3 +116,334 @@ def store_metadata(media_entry, metadata):
if len(stored_metadata):
media_entry.media_data_init(
orig_metadata=stored_metadata)
+
+
+class CommonVideoProcessor(MediaProcessor):
+ """
+ Provides a base for various video processing steps
+ """
+ acceptable_files = ['original', 'best_quality', 'webm_video']
+
+ def common_setup(self):
+ self.video_config = mgg \
+ .global_config['plugins'][MEDIA_TYPE]
+
+ # Pull down and set up the processing file
+ self.process_filename = get_process_filename(
+ self.entry, self.workbench, self.acceptable_files)
+ self.name_builder = FilenameBuilder(self.process_filename)
+
+ self.transcoder = transcoders.VideoTranscoder()
+ self.did_transcode = False
+
+ def copy_original(self):
+ # If we didn't transcode, then we need to keep the original
+ if not self.did_transcode or \
+ (self.video_config['keep_original'] and self.did_transcode):
+ copy_original(
+ self.entry, self.process_filename,
+ self.name_builder.fill('{basename}{ext}'))
+
+ def _keep_best(self):
+ """
+ If there is no original, keep the best file that we have
+ """
+ if not self.entry.media_files.get('best_quality'):
+ # Save the best quality file if no original?
+ if not self.entry.media_files.get('original') and \
+ self.entry.media_files.get('webm_video'):
+ self.entry.media_files['best_quality'] = self.entry \
+ .media_files['webm_video']
+
+ def _skip_processing(self, keyname, **kwargs):
+ file_metadata = self.entry.get_file_metadata(keyname)
+
+ if not file_metadata:
+ return False
+ skip = True
+
+ if keyname == 'webm_video':
+ if kwargs.get('medium_size') != file_metadata.get('medium_size'):
+ skip = False
+ elif kwargs.get('vp8_quality') != file_metadata.get('vp8_quality'):
+ skip = False
+ elif kwargs.get('vp8_threads') != file_metadata.get('vp8_threads'):
+ skip = False
+ elif kwargs.get('vorbis_quality') != \
+ file_metadata.get('vorbis_quality'):
+ skip = False
+ elif keyname == 'thumb':
+ if kwargs.get('thumb_size') != file_metadata.get('thumb_size'):
+ skip = False
+
+ return skip
+
+
+ def transcode(self, medium_size=None, vp8_quality=None, vp8_threads=None,
+ vorbis_quality=None):
+ progress_callback = ProgressCallback(self.entry)
+ tmp_dst = os.path.join(self.workbench.dir,
+ self.name_builder.fill('{basename}.medium.webm'))
+
+ if not medium_size:
+ medium_size = (
+ mgg.global_config['media:medium']['max_width'],
+ mgg.global_config['media:medium']['max_height'])
+ if not vp8_quality:
+ vp8_quality = self.video_config['vp8_quality']
+ if not vp8_threads:
+ vp8_threads = self.video_config['vp8_threads']
+ if not vorbis_quality:
+ vorbis_quality = self.video_config['vorbis_quality']
+
+ file_metadata = {'medium_size': medium_size,
+ 'vp8_threads': vp8_threads,
+ 'vp8_quality': vp8_quality,
+ 'vorbis_quality': vorbis_quality}
+
+ if self._skip_processing('webm_video', **file_metadata):
+ return
+
+ # Extract metadata and keep a record of it
+ metadata = self.transcoder.discover(self.process_filename)
+ store_metadata(self.entry, metadata)
+
+ # Figure out whether or not we need to transcode this video or
+ # if we can skip it
+ if skip_transcode(metadata, medium_size):
+ _log.debug('Skipping transcoding')
+
+ dst_dimensions = metadata['videowidth'], metadata['videoheight']
+
+ # If there is an original and transcoded, delete the transcoded
+ # since it must be of lower quality then the original
+ if self.entry.media_files.get('original') and \
+ self.entry.media_files.get('webm_video'):
+ self.entry.media_files['webm_video'].delete()
+
+ else:
+ self.transcoder.transcode(self.process_filename, tmp_dst,
+ vp8_quality=vp8_quality,
+ vp8_threads=vp8_threads,
+ vorbis_quality=vorbis_quality,
+ progress_callback=progress_callback,
+ dimensions=tuple(medium_size))
+
+ dst_dimensions = self.transcoder.dst_data.videowidth,\
+ self.transcoder.dst_data.videoheight
+
+ self._keep_best()
+
+ # Push transcoded video to public storage
+ _log.debug('Saving medium...')
+ store_public(self.entry, 'webm_video', tmp_dst,
+ self.name_builder.fill('{basename}.medium.webm'))
+ _log.debug('Saved medium')
+
+ self.entry.set_file_metadata('webm_video', **file_metadata)
+
+ self.did_transcode = True
+
+ # Save the width and height of the transcoded video
+ self.entry.media_data_init(
+ width=dst_dimensions[0],
+ height=dst_dimensions[1])
+
+ def generate_thumb(self, thumb_size=None):
+ # Temporary file for the video thumbnail (cleaned up with workbench)
+ tmp_thumb = os.path.join(self.workbench.dir,
+ self.name_builder.fill(
+ '{basename}.thumbnail.jpg'))
+
+ if not thumb_size:
+ thumb_size = (mgg.global_config['media:thumb']['max_width'],)
+
+ if self._skip_processing('thumb', thumb_size=thumb_size):
+ return
+
+ # We will only use the width so that the correct scale is kept
+ transcoders.VideoThumbnailerMarkII(
+ self.process_filename,
+ tmp_thumb,
+ thumb_size[0])
+
+ # Push the thumbnail to public storage
+ _log.debug('Saving thumbnail...')
+ store_public(self.entry, 'thumb', tmp_thumb,
+ self.name_builder.fill('{basename}.thumbnail.jpg'))
+
+ self.entry.set_file_metadata('thumb', thumb_size=thumb_size)
+
+class InitialProcessor(CommonVideoProcessor):
+ """
+ Initial processing steps for new video
+ """
+ name = "initial"
+ description = "Initial processing"
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ if not state:
+ state = entry.state
+ return state in (
+ "unprocessed", "failed")
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--medium_size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ parser.add_argument(
+ '--vp8_quality',
+ type=int,
+ help='Range 0..10')
+
+ parser.add_argument(
+ '--vp8_threads',
+ type=int,
+ help='0 means number_of_CPUs - 1')
+
+ parser.add_argument(
+ '--vorbis_quality',
+ type=float,
+ help='Range -0.1..1')
+
+ parser.add_argument(
+ '--thumb_size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['medium_size', 'vp8_quality', 'vp8_threads',
+ 'vorbis_quality', 'thumb_size'])
+
+ def process(self, medium_size=None, vp8_threads=None, vp8_quality=None,
+ vorbis_quality=None, thumb_size=None):
+ self.common_setup()
+
+ self.transcode(medium_size=medium_size, vp8_quality=vp8_quality,
+ vp8_threads=vp8_threads, vorbis_quality=vorbis_quality)
+
+ self.copy_original()
+ self.generate_thumb(thumb_size=thumb_size)
+ self.delete_queue_file()
+
+
+class Resizer(CommonVideoProcessor):
+ """
+ Video thumbnail resizing process steps for processed media
+ """
+ name = 'resize'
+ description = 'Resize thumbnail'
+ thumb_size = 'thumb_size'
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ if not state:
+ state = entry.state
+ return state in 'processed'
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--thumb_size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ # Needed for gmg reprocess thumbs to work
+ parser.add_argument(
+ 'file',
+ nargs='?',
+ default='thumb',
+ choices=['thumb'])
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['thumb_size', 'file'])
+
+ def process(self, thumb_size=None, file=None):
+ self.common_setup()
+ self.generate_thumb(thumb_size=thumb_size)
+
+
+class Transcoder(CommonVideoProcessor):
+ """
+ Transcoding processing steps for processed video
+ """
+ name = 'transcode'
+ description = 'Re-transcode video'
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ if not state:
+ state = entry.state
+ return state in 'processed'
+
+ @classmethod
+ def generate_parser(cls):
+ parser = argparse.ArgumentParser(
+ description=cls.description,
+ prog=cls.name)
+
+ parser.add_argument(
+ '--medium_size',
+ nargs=2,
+ metavar=('max_width', 'max_height'),
+ type=int)
+
+ parser.add_argument(
+ '--vp8_quality',
+ type=int,
+ help='Range 0..10')
+
+ parser.add_argument(
+ '--vp8_threads',
+ type=int,
+ help='0 means number_of_CPUs - 1')
+
+ parser.add_argument(
+ '--vorbis_quality',
+ type=float,
+ help='Range -0.1..1')
+
+ return parser
+
+ @classmethod
+ def args_to_request(cls, args):
+ return request_from_args(
+ args, ['medium_size', 'vp8_threads', 'vp8_quality',
+ 'vorbis_quality'])
+
+ def process(self, medium_size=None, vp8_quality=None, vp8_threads=None,
+ vorbis_quality=None):
+ self.common_setup()
+ self.transcode(medium_size=medium_size, vp8_threads=vp8_threads,
+ vp8_quality=vp8_quality, vorbis_quality=vorbis_quality)
+
+
+class VideoProcessingManager(ProcessingManager):
+ def __init__(self):
+ super(self.__class__, self).__init__()
+ self.add_processor(InitialProcessor)
+ self.add_processor(Resizer)
+ self.add_processor(Transcoder)
diff --git a/mediagoblin/media_types/video/util.py b/mediagoblin/media_types/video/util.py
index 5765ecfb..beb10129 100644
--- a/mediagoblin/media_types/video/util.py
+++ b/mediagoblin/media_types/video/util.py
@@ -21,13 +21,13 @@ from mediagoblin import mg_globals as mgg
_log = logging.getLogger(__name__)
-def skip_transcode(metadata):
+def skip_transcode(metadata, size):
'''
Checks video metadata against configuration values for skip_transcode.
Returns True if the video matches the requirements in the configuration.
'''
- config = mgg.global_config['media_type:mediagoblin.media_types.video']\
+ config = mgg.global_config['plugins']['mediagoblin.media_types.video']\
['skip_transcode']
medium_config = mgg.global_config['media:medium']
@@ -51,9 +51,9 @@ def skip_transcode(metadata):
return False
if config['dimensions_match']:
- if not metadata['videoheight'] <= medium_config['max_height']:
+ if not metadata['videoheight'] <= size[1]:
return False
- if not metadata['videowidth'] <= medium_config['max_width']:
+ if not metadata['videowidth'] <= size[0]:
return False
return True
diff --git a/mediagoblin/notifications/__init__.py b/mediagoblin/notifications/__init__.py
index ed9f8d78..b6f9f478 100644
--- a/mediagoblin/notifications/__init__.py
+++ b/mediagoblin/notifications/__init__.py
@@ -17,7 +17,8 @@
import logging
from mediagoblin.db.models import Notification, \
- CommentNotification, CommentSubscription
+ CommentNotification, CommentSubscription, User
+from mediagoblin.notifications.task import email_notification_task
from mediagoblin.notifications.tools import generate_comment_message
_log = logging.getLogger(__name__)
@@ -121,6 +122,12 @@ NOTIFICATION_FETCH_LIMIT = 100
def get_notifications(user_id, only_unseen=True):
query = Notification.query.filter_by(user_id=user_id)
+ wants_notifications = User.query.filter_by(id=user_id).first()\
+ .wants_notifications
+
+ # If the user does not want notifications, don't return any
+ if not wants_notifications:
+ return None
if only_unseen:
query = query.filter_by(seen=False)
@@ -130,12 +137,19 @@ def get_notifications(user_id, only_unseen=True):
return notifications
+
def get_notification_count(user_id, only_unseen=True):
query = Notification.query.filter_by(user_id=user_id)
+ wants_notifications = User.query.filter_by(id=user_id).first()\
+ .wants_notifications
if only_unseen:
query = query.filter_by(seen=False)
- count = query.count()
+ # If the user doesn't want notifications, don't show any
+ if not wants_notifications:
+ count = None
+ else:
+ count = query.count()
return count
diff --git a/mediagoblin/notifications/routing.py b/mediagoblin/notifications/routing.py
index e57956d3..cd7bbc21 100644
--- a/mediagoblin/notifications/routing.py
+++ b/mediagoblin/notifications/routing.py
@@ -23,3 +23,7 @@ add_route('mediagoblin.notifications.subscribe_comments',
add_route('mediagoblin.notifications.silence_comments',
'/u/<string:user>/m/<string:media>/notifications/silence/',
'mediagoblin.notifications.views:silence_comments')
+
+add_route('mediagoblin.notifications.mark_all_comment_notifications_seen',
+ '/notifications/comments/mark_all_seen/',
+ 'mediagoblin.notifications.views:mark_all_comment_notifications_seen')
diff --git a/mediagoblin/notifications/views.py b/mediagoblin/notifications/views.py
index d275bc92..cfe66b2e 100644
--- a/mediagoblin/notifications/views.py
+++ b/mediagoblin/notifications/views.py
@@ -14,19 +14,15 @@
# 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.response import render_to_response, render_404, redirect
+from mediagoblin.tools.response import redirect
from mediagoblin.tools.translate import pass_to_ugettext as _
-from mediagoblin.decorators import (uses_pagination, get_user_media_entry,
- get_media_entry_by_id,
- require_active_login, user_may_delete_media, user_may_alter_collection,
- get_user_collection, get_user_collection_item, active_user_from_url)
-
+from mediagoblin.decorators import get_user_media_entry, require_active_login
from mediagoblin import messages
-from mediagoblin.notifications import add_comment_subscription, \
- silence_comment_subscription
+from mediagoblin.notifications import (add_comment_subscription,
+ silence_comment_subscription, mark_comment_notification_seen,
+ get_notifications)
-from werkzeug.exceptions import BadRequest
@get_user_media_entry
@require_active_login
@@ -41,6 +37,7 @@ def subscribe_comments(request, media):
return redirect(request, location=media.url_for_self(request.urlgen))
+
@get_user_media_entry
@require_active_login
def silence_comments(request, media):
@@ -52,3 +49,17 @@ def silence_comments(request, media):
' %s.') % media.title)
return redirect(request, location=media.url_for_self(request.urlgen))
+
+
+@require_active_login
+def mark_all_comment_notifications_seen(request):
+ """
+ Marks all comment notifications seen.
+ """
+ for comment in get_notifications(request.user.id):
+ mark_comment_notification_seen(comment.subject_id, request.user)
+
+ if request.GET.get('next'):
+ return redirect(request, location=request.GET.get('next'))
+ else:
+ return redirect(request, 'index')
diff --git a/mediagoblin/oauth/views.py b/mediagoblin/oauth/views.py
index 116eb023..14c8ab14 100644
--- a/mediagoblin/oauth/views.py
+++ b/mediagoblin/oauth/views.py
@@ -18,12 +18,12 @@ import datetime
from oauthlib.oauth1 import (RequestTokenEndpoint, AuthorizationEndpoint,
AccessTokenEndpoint)
-
+
from mediagoblin.decorators import require_active_login
from mediagoblin.tools.translate import pass_to_ugettext
from mediagoblin.meddleware.csrf import csrf_exempt
from mediagoblin.tools.request import decode_request
-from mediagoblin.tools.response import (render_to_response, redirect,
+from mediagoblin.tools.response import (render_to_response, redirect,
json_response, render_400,
form_response)
from mediagoblin.tools.crypto import random_string
@@ -41,7 +41,7 @@ client_types = ["web", "native"] # currently what pump supports
def client_register(request):
""" Endpoint for client registration """
try:
- data = decode_request(request)
+ data = decode_request(request)
except ValueError:
error = "Could not decode data."
return json_response({"error": error}, status=400)
@@ -56,7 +56,7 @@ def client_register(request):
if data.get("application_type", None) not in client_types:
error = "Unknown application_type."
return json_response({"error": error}, status=400)
-
+
client_type = data["type"]
if client_type == "client_update":
@@ -69,7 +69,7 @@ def client_register(request):
return json_response({"error": error}, status=400)
client = Client.query.filter_by(
- id=data["client_id"],
+ id=data["client_id"],
secret=data["client_secret"]
).first()
@@ -78,7 +78,7 @@ def client_register(request):
return json_response({"error": error}, status=403)
client.application_name = data.get(
- "application_name",
+ "application_name",
client.application_name
)
@@ -108,12 +108,12 @@ def client_register(request):
client_secret = random_string(43) # again, seems to be what pump uses
expirey = 0 # for now, lets not have it expire
expirey_db = None if expirey == 0 else expirey
- application_type = data["application_type"]
-
+ application_type = data["application_type"]
+
# save it
client = Client(
- id=client_id,
- secret=client_secret,
+ id=client_id,
+ secret=client_secret,
expirey=expirey_db,
application_type=application_type,
)
@@ -126,12 +126,12 @@ def client_register(request):
if logo_url is not None and not validate_url(logo_url):
error = "Logo URL {0} is not a valid URL.".format(logo_url)
return json_response(
- {"error": error},
+ {"error": error},
status=400
)
else:
client.logo_url = logo_url
-
+
client.application_name = data.get("application_name", None)
contacts = data.get("contacts", None)
@@ -146,8 +146,8 @@ def client_register(request):
# not a valid email
error = "Email {0} is not a valid email.".format(contact)
return json_response({"error": error}, status=400)
-
-
+
+
client.contacts = contacts
redirect_uris = data.get("redirect_uris", None)
@@ -166,7 +166,7 @@ def client_register(request):
client.redirect_uri = redirect_uris
-
+
client.save()
expirey = 0 if client.expirey is None else client.expirey
@@ -182,7 +182,7 @@ def client_register(request):
def request_token(request):
""" Returns request token """
try:
- data = decode_request(request)
+ data = decode_request(request)
except ValueError:
error = "Could not decode data."
return json_response({"error": error}, status=400)
@@ -193,7 +193,7 @@ def request_token(request):
if not data and request.headers:
data = request.headers
-
+
data = dict(data) # mutableifying
authorization = decode_authorization_header(data)
@@ -226,12 +226,12 @@ def request_token(request):
return form_response(tokens)
-@require_active_login
+@require_active_login
def authorize(request):
""" Displays a page for user to authorize """
if request.method == "POST":
return authorize_finish(request)
-
+
_ = pass_to_ugettext
token = request.args.get("oauth_token", None)
if token is None:
@@ -243,10 +243,10 @@ def authorize(request):
if oauth_request is None:
err_msg = _("No request token found.")
return render_400(request, err_msg)
-
+
if oauth_request.used:
return authorize_finish(request)
-
+
if oauth_request.verifier is None:
orequest = GMGRequest(request)
request_validator = GMGRequestValidator()
@@ -279,7 +279,7 @@ def authorize(request):
"mediagoblin/api/authorize.html",
context
)
-
+
def authorize_finish(request):
""" Finishes the authorize """
@@ -288,7 +288,7 @@ def authorize_finish(request):
verifier = request.form["oauth_verifier"]
oauth_request = RequestToken.query.filter_by(token=token, verifier=verifier)
oauth_request = oauth_request.first()
-
+
if oauth_request is None:
# invalid token or verifier
err_msg = _("No request token found.")
@@ -321,10 +321,10 @@ def authorize_finish(request):
@csrf_exempt
def access_token(request):
- """ Provides an access token based on a valid verifier and request token """
+ """ Provides an access token based on a valid verifier and request token """
data = request.headers
- parsed_tokens = decode_authorization_header(data)
+ parsed_tokens = decode_authorization_header(data)
if parsed_tokens == dict() or "oauth_token" not in parsed_tokens:
error = "Missing required parameter."
diff --git a/mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html b/mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html
index 2e63e1f8..88b232f8 100644
--- a/mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html
+++ b/mediagoblin/plugins/openid/templates/mediagoblin/plugins/openid/edit_link.html
@@ -17,9 +17,8 @@
#}
{% block openid_edit_link %}
- <p>
- <a href="{{ request.urlgen('mediagoblin.plugins.openid.edit') }}">
- {% trans %}Edit your OpenID's{% endtrans %}
- </a>
- </p>
+ <a href="{{ request.urlgen('mediagoblin.plugins.openid.edit') }}">
+ {% trans %}OpenID's{% endtrans %}
+ </a>
+ &middot;
{% endblock %}
diff --git a/mediagoblin/plugins/persona/__init__.py b/mediagoblin/plugins/persona/__init__.py
index d74ba0d7..700c18e2 100644
--- a/mediagoblin/plugins/persona/__init__.py
+++ b/mediagoblin/plugins/persona/__init__.py
@@ -48,7 +48,7 @@ def setup_plugin():
pluginapi.register_routes(routes)
pluginapi.register_template_path(os.path.join(PLUGIN_DIR, 'templates'))
pluginapi.register_template_hooks(
- {'persona_head': 'mediagoblin/plugins/persona/persona_js_head.html',
+ {'persona_end': 'mediagoblin/plugins/persona/persona_js_end.html',
'persona_form': 'mediagoblin/plugins/persona/persona.html',
'edit_link': 'mediagoblin/plugins/persona/edit_link.html',
'login_link': 'mediagoblin/plugins/persona/login_link.html',
diff --git a/mediagoblin/plugins/persona/static/js/persona.js b/mediagoblin/plugins/persona/static/js/persona.js
index a1d0172f..76a7757a 100644
--- a/mediagoblin/plugins/persona/static/js/persona.js
+++ b/mediagoblin/plugins/persona/static/js/persona.js
@@ -17,14 +17,20 @@
*/
$(document).ready(function () {
+ var requestParams = {
+ backgroundColor: "#171717",
+ siteName: "GNU MediaGoblin",
+ siteLogo: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAA0IklEQVR4XuSYS2gUSRyHq6ofk8kDZXycRTwEcfGgboIgBOMTFoxZ8LYXwcWDd/HoRUFPHvbg47gXQeMugqC7iiIeoht0IeDFg+ID8RBNYpKZ6e4qPyYVu5meBhkmSU9S8PHvamro6v76V93TUuSkHdz3q7z7701Tt6+b0gnr4SfYBptgM6yDEvSADwIq8BUmLK/gDbyE/2AKZjjOdNaxl5tlFXJgcFhJKR1EBAkJ/ZRdlu2wFdwWedcwDi9gDEYRMZoQ41Ei9ulVJWT/3qNSKeUuiEDCDspJOAxroQuSzTQ/5+zfJtL0yBhz4d79kXF7o/iUgL5ZNQlBQokyBOdhIwgIQFmWYm4aInBBwns4i5wbyPi8YhNCAhzSENntnym/we/gJy6KAyp1e5t4olJZaqqMrbYfj7fI+b62iHhsRopC8Gy/DFfhT+b9NHkObS8EAT4yqtRNdK9BH3QnLoTMkuC4BrDkGKEYJUCmZp0Skt6matChBK68lkI2OnJ6TmV4DMeR8W7hXNpdSA/lHJwCDaJBEiCW4PrzFV2tb1ZgGEJVCR0lxGUvaR78YYw5w1I23VZCeGCrfx7c0lbGCcpFWANV8EAmk6AUIMG1aZAyTsjiEh8rIjlhIJBDgnTDZa0KPnyB06Tkik2/YlvnVghvJy53UIiUDUqpO+za2XBpoicVEgqiJkLKHLz8m1hOtSLnsyEzl7JRGEbGB85ZkRqd24Qg5ZiU8no6EfFd6fpGeJDnFlatmGRLyxkKw/D2/Yd/t0yIaoEAZePrwGUrIwAf5PeHqxVR7NbCLxiR9+Yyx84eHd846SlX4C/HcS4N7PnFy1VCBgeOlFzXfWD/WZv654TrGeF3GKFUrd9eTeIiEqRFiShIXTENCv6H3RDat7DlE0IqeilPYG2jxCGiJmQltDBgGSvLrLexMvQi5O2SL1lIcBLfncagBLEMQ4cRxS7dlAxjDORNol1yOSelUnOT4MJr+xlIUOWSJgQZhygjUEwuUwY8u0St5FYhKVGQmZY+eG6M0fZ72KInpN/K6KgXWyjEMppNxtTHCTH1acLu+2GxqfHlclmEYVhL7NzcXK1fqVTE7MysmJycrNVGTWtdP6dUajuKRngFkyXkGWyxMhYnIQvv2/aZMQad9WMKiHD85v9hfyvvPaAsu8o7398+6cbKqburOudWd0tqqZUjSEjI5GD7EUQQPMRgj70MzJhZToPtsZ+xgWcPb8AYPBhsEGDikCwJkBDKoZU6q3N1pa548wl7v7O+dc7qW0F0Xut53qe119Gte+rW7f3f/y/tb39HRxplKUae2IsfBfRtW4vruliWxWmITGR6786dO9FRRMP3qZQrVGtVlFLp+wJUNpulra2Ngf5+FAptDJlMBs/zsG2LTDb7coDLZykFQaDwa/OYUgOyxphNMSi7L5jKuuXmN3Tatr0P6JzrTWVyBts9ezDSCfV9n6Gn99GXb+dEp2HZsmXCEnWK6DG956WXXmL3bpkDAj/AYGjPFrm0bw2hjujMteKHAZP1EuWwzlhlmhm/Qi1s4Cgbx3awlMIPfTJuBqPAdh06OzvZsGED+Xx+1t9DIaqrMR8UgFFgPVCLjX3jvAJyw7V32Llc7ilgy1xVJ2A4hnORdOWVSiWOPbOXX1tzJV8/9gjbr7wiXfkpMAsCUS6XefqppxmfGGegrYe8k+Gqgc2U/Spb+1YT6UgAj4zBoJHJdx0828NzXXkviALGylMxWGUMEKGZrsww6VfYOXKQkl9j0eJFbNu2DcdxaJYoUjSqC4KyIwbj0lizuPE1OEdAxF44MbphfP2cpMzPs5pqZkfKkF2PPMPbNt/CsyMvsd+aYPPmzQuqjBSo44PHefyJx+W9V6zcxhX9Gyh4OfwoxEKJ+kMBSmEri5jluJaL7QojUJaFsuOhbJQBO1FrlrLxwwZ1v8GxiSGOxmOoPMGJqMKmy7aKemtmbxTOY0oE2Eka/52ns1WsTtNu/DpwzxxvSgy4kzk3MJonGGBycpKjz+/j9auv4cj0CI+P7GHxosW0DHQTBgH5QmHWRAwPD/PoI4+yqKWL12+4lvZMUSbUUpYwQWGJXXK9DMoI8AJIPMRWeG4Wy1IYDADaICrLsgU4gkZA3a8ThgGVWoVypcRweZKD1VE6NgwIKCmDURA0lIwmCQEHeF8MxhfOkSGSve21LGsECACXBA3HOzdvKgUg9nbE8zlw4AC61GBL70r6iz30FNswGvLZrKzKqaDKiClRLpUIXUX/0gEGR4coTGmWtPVwy9rtjJenAcQRsC0bjSEMQ3nt2BbGgO24WJaNAmGX6zlYtkMUhvK+BgHTccWWiGNQq1Ypl0s0/DqNoIEC7j3wJLumjnHrrbfOciaUgnrVIgqZKzPApcChX5UhdjiFxGD8oCn9LGI5nDUY6Zc/evQow0NDHBscZH3nUrbE47pNWzAGGqGP2EsUjuOyqmsAY7QAmRvIcixmTmm6Sl53ceXmi7CVzVStgus4Mtme66HRGB3heS6u7aIsW4DxMhmMTDoox8HNeigUfqVGFISoKBTGWNrgeC6hEYDJZXMoECYFYQAGsVsx4MKk5lRRNqepVSy0pllagf8Rg3Hbr7InzilU1vuTFLqZbTf0WTMjBkNc0r1798rrt2y4kZWd/RSyObQBgyHjegJcJpNFoUR1KGWBglBreoqd9BW7BCw34wkIdhRgIo3lOKAjud9zLMRrslxRQY7j4HoeYks8YREK8OsNIj+Sifb9hjBHFoMnLjdhFBGGvjBb7I1S1HxhCuPj4/T19c1ivajzvKZWtuaqrlfFYHwgBuNzL2dPnJfbdgUywF8DNGVtxaNSFmclSilGRkbYv38/fYUObli6lXW9y3FcTybHRuHlMkRRRBD4uI6LI+rHkdUuwZkD2nbQRpMvtKCMASVZS0IdogDluCgMtiX3YdDoyKAyGUJhgI0VRoTCIk2tUqE8PUUo7JV4SGKSqBTJJBtj5DuJp2aEIWRdV0CPf85CopQ4PBLRN821D3w6BuPrMRiTp8MQyVMle+CfTGhmAJVkbWWcLTvENX36aZYWe2Jm3CCrWYyr4+I6joDieBkUELkZwOB5OTHSMUDpVyHQPo7tye8oZaGFWmKsZQVHURgPTRT6oMBxxE4QNurx1SYyAZHtoHVEpTQjrnakQwwy8cIOo8BoQ2QibKXEXdYJ88r1GiYC17JZsmSJgCJqa7ZIXGYlO5GJeADJQr/rtACJwYhiMFYBH2q2Hco6d7vxwAMP0Om18Ipll4BSopoyXkaYICsR8XAEmHjIKlCORRhEhFGAQoGyhAkZ1yWMNMaEoBQqGTqJN3QkqxkbC+VaCMhhRK1SFVUUBGWq1QqlSilRS6GsfEs8NIWoKR0B4DmugOAkjsJ0tcxUvUT/wEDKfBYW0SjUyvPevzNmySeAvWLgT8OG/D2gAZdEHDfdzzg7u3HkyBHQhuuXbqHgZUX/Z92MGGBQANiJfm7UaxgFnpdFN3xhR71RE+NqAL/RAMuiVJ5GGSUgFoqt4poGQQAK8ZoEVNcRdvlG4/vynoBQrZepB0H6DxLwFAhD6lEojNbJd6rUa/LZNV0n0oZao8ZUo8zqvqWnzCIoheS8/Lqi6TYH+HAMxvvT8qJfpbKuAK5sth1KIbt855ARF7d2oKWXZS09YFt4joPt2KIWhBtK4Qe+qJxSZUbcU1BUamUCvyHpjkI2T4SR1xGaWq0q+r6YLxJMTwhzLKPEbji2C7aRla+UEqAaYUOAqge+2INUMKQMlZ8bsUeRTH7DaGFP3feJJIZRlP0aTlue/v7+00rruJ4h9FXz/EXA+2IwPgZMLcQQKe+Mq0VMUsRWJBWDBH+CLuqMs68pnSuVCm/acBWB0WQtN9H1Gq2D1DSIujFoqo06WUDXykzNTKKwsBQ0Al+iZmMMjSCg4fvCjpnytLAQFGBwHU8ms9oIEIfAaGqNBkHoi71BzVIzqdEWEDDI9/KjQIDVWkAlMhoLi+PlSZ4bP8CGSzY3qatTSsqSuVn2f4jZ8YZmlqg5hcYtwFBzzKGUIVc0nIsEvs+/3Xsvv33p68U45jM50ctiCBNXUhsxoNQbdbTRYlfK1Qok+tx1bBRKmKKwZCVb0KTq4oEYcLmKR4QSO6SNMGWeKtWp92QiAh0J8EZA0MKUFIwYbGFHKajx+NheFi1fwuYtW06HHU2gS8CI0aTiJ8Asj8E43syQtL4oiK9vBLxmz8rNcq4iq8+1ZKKSmII0BY5MvutJYs8PGmhtRHVNl8soASMgEM8HsTtGa3ntWJYAYQmYGgwIsFqDTGAISVxjjAyZ1PiaEkmAF9UUGbQR70qYgAEgNeySCT5cGuLAzBArVq8WMFLP6nTFssB2RHWRiIsIHwD+eK7KsgEN/EVytdIPcRzDuYofBLS6OWEHWiO+fBQmkx2SMZGwoOE35CpBV+L/CxOUQoPcr7VMMWFytcX4ChhYGnwTESXxRZQwwDSpT0sJgPK+H4pnha0siU1c28bGoqp9xmqTjDVKDJXHmQ4qLO5ZxXXX3E5nX05AFTBOMz+XMsTLzAIkffO1MRH+IiZEPQWE+EUQ25DLgB4gIAXkPBWx+aLrbVEHQRjJpFhK1I+wQSbZGKarldQIQ2JYMYjIJBqTXCHjuBjLioctyUO/4QtrjAHQGATQVK0k6kkMuvzdE/UZWfmBiQBDQ4fUooAxv0zW9ggiH8/N09LSxU1b3sXqZRfz9N4f4DoZgrBxSru58M+FJZIVbpJLgS0xKE/GOBgnDeFj6t/dxBbg3NmRTsihQ4eYqE2hULIi05Wa6vVqvYqfBHMYw0S1xIxfZrw+TUfbAKXGDNp2GZ0apOjlCXWAY2wKbh4VNsgArdkinuXhODZZO4OdbDZV/JrkxvygxlhtmmPVcerKUIt8CoVOCTB72gfoa1tEX8dSFnWuYMfen1Otl1jatxXHtjk6spu2GBiDolavJGpXzWODbD/PzFAt1+nt6sfOSsKSFB9jEo8rUMzB7JUxBk/EqSrLacqnvHpWRhewHc5J0mCttdiCnQ/wQ1Em4i3ZkptC2NEIQ7TWojIOTI4yEQMxFDZYu+Ja1q28AhGjiXSAMUqALFenqPsl8rl2LB0xNLqXKb9GGDbQ9RLj00OEyeq3nAyrl26jt9hBrjYtTFm++CLaW3rJehlaCm3kcwW0hvsf/yoNv8bNl78TSzloo2gr9rLzwEOMTBxkwOpKc1dpjAXInj3UiyzrupStV13FA4/+ALLT86poLZuF4rk7gb9UStkqMepXA/cBWcACoRbZvDkvhW3Hjx9nfO8xblm+DcnkJmDZyhZmaLETNsPlcZ4bewnV2suNl76VRV3LJVYRaVppQSixQeKuhuIUuLaDSa21iKLhV+Vzs9mcAGowiCNgW8l3EHWG7HuEIUZb/P2//j7vfPUfk81kcVwJVMUZqDeqVGtlvv+Lz3DFtZek2QdGhkfwq4obL389a5ZvxhiEXZ/60ke44srLF/TEgoaUqaYsiQDbGNMeg1tNOXA5kAdMSi3Hk+t5ke7ubob3HILEyIqbKjmpgDCMMBjR5Y+P7mblqmu545q7aIRVIBKdrVCUKlMS+PlBlYybJ59to96oSArdAkBL2hxIrgbHzmHZCkyESjetjAG0AAFK3GVAAsnxmVFuuvyt8n0j0wBjMIBlbCw7Tz7Xwiu3v5NnD3yXnp4+jh48ziuvegvXXX4bM+VJCT6Vcvi3h77JpdsuXhCMlCVKwezgW/36j+/95udTQLY3vwnn7XyG0NrzPHSLRyWoJ6tTAZJKx498LGx2jx+k2LGCO669U1SRMUZW/s6XHuXw0C6W9m1mpnxC1Ev8c2HYuuWXAjrV0zL5pOGhUTSXsCtFAsAslSrgpZPW09XDkkUD6KgBWhgFKnFZLRtjoLe7n67RTXgNm7t/4z/QUiwyOjYK2NRrPj968B9RLdMU3PaXDaItyyQ2Z9ac/zrweZUcqPklsOUkgqKuOI8ikfrQ03u5OtbdtaCRRMESEYu6uO/4M7zmlo+yun9dajN4cud9PPr8T9i+8TUs7b1IGJDNZnAcjzCqcXx0L1vWXYWyJJ91RnZt7u22bQmgRieRe6iTiB6UlaIMBhifnODw4C5WDqyjo62X0YnjPL/3IY5P7WLTpo2ntT1Rn72B1QCs2J57DpAHNjb5y83GfEGUmz2M+aKaeEh6H4VCgaA7G9uIA6wo9kp0HDUVNnS0L2FJ9wCgJCr/t4f/BaMzvOKyd9Lfsw5NiOyPOLbYhZZiAcdR1P0ybS3tGHPy+8gFA6SsWNgVlZ9L0YMSUE3ifh89foA9h57GzvpEBOjI0JlbztoVW2lr74hB6KCQu4qd+x/Dc/K8dOhZ3PYyFw1slEWGUadKOApLtJ4Vk9gxOZY7QDfgpO5AwpDmve9TFqUtLPNdwo0bN7J/916mymU6Mq1C3UpYZW9llFtvvpuO1k60DnnpyIvYVp6L178SZUEm44r+ti2FagK5p6OPSPuJepLv2qyefmUaw3EslCVqTmwaaCzX4zP//IeE1Pj4n32M6667llwux/T0DD+7/xd89u/+iduufTstLW3kcgWODO9BYYEdyn2p13UqMYDlACGppBzcrmLf9zeUUl9LAcEgZzhIPJCpyWkAjh49ghSdtbfLpozjOIyOjnH8+CDValVGX/eyWK9vwXYsvGKEVv6CkeveHS9gTQeU/CozSvP+t3yCQj4DlqFeCbnvsXtY2reF5UvWkc9l8DyL8yXKQlgGiBdlJ/Vejp3lJw99jZ8/8W2+fs9X+bXX3pFOSXI1MSgP8fa3vZsPv+u/Mzx2jC99+0943eVv5sWpfSxe1sIZiLCjXlFzjzX8oaOU2jL3C6NIi8+YPFGhVqmzYeVVkhbPOBmsapGDQ3uYLk3Q1b6U26+9iVtvfBNBWItp/JTsZ+zZ/zzTlQqRqmC7SsplbNsWcNZdsplgyqaQXcRVW18tase2HCrVqmRwDxx7jmsufiPFQhbXUWjDSbUjq9CWEYaRxAyO7cqeh2U7UvSmLGHwgqpWmKEUrivXRMXYjJeGuf/Rb/HpT/7fMRivxRgJYKGpPOjmV97Mx//0D/jkX/5ZbPzXkq+OYmYOMF2fYDFnBIhoB5iX/d3oACtmuV9W6qUYisUixTVF9uw6wKqBTWJAo2S71HM9YUkQRpJKOHr4iKy8ga71EldsXnMV41MjMWiTHBt+KQZnjKHRowR+iOsG3H7N22MwF1P3a+TsDI16IF4KBro7B+jp7CY0NbRGjLmXdZN9dYsTk8c5NnSAYqeNcgN6unvx7YDO9m5KJwzVaYtFfX2JG6pIJVVrnmcnSU9RMTieje3DumVbeN0bbwOiearaknikwXvfdxfat/job3+QdyxxyCzdTvTC18+GqQvJEgdYNdfgCENS9BQsW7mY793/j7EK2YAOBVkkwm4EkhBs+EFaLC0qwHFdPNchX/DoaomNde8KlGWolCrUaoGU5hSKGbSREhqJ3Gs1H8fOsO/I4yzqGsC2IPCTCcy4SdFAnnt/+Q0efeEH/Ml//SPe/Z47ZUJj5hGFoQAwPDTK/T9+mJ2PHWJR91Lx5lI3W4rfLNV0sstKmSMFcBdt3kpXdwdgWEhsYaXPK26/jkJnG1ZLiMn1S93vGUtyAnkOkfscoGvunXNEDNbAyj4++7U/4oqLbmdTHLyVymWQ3E6ViZkRZipTdBU7UVYGXwcUcq0UykWmJqtksi7ZrJPaE/FaGo2I0A8FiDAIASQ6PjE9yJLupemOnvxuDKD8nYee/h7rt7fz3Z8OEgaB3OMlMYljO+SyedraOli/YRN3vfcunt55kKsufpVE2cIKUVEGB4WyZzsorbkeqvUJMl6RIKjhujnAYEw4y6uUBeQ36OpsYTCzlMWNMl1dXZyNqPndC1odoHP2TQt7VD09PbICf/CL/0m1VmOgb52AcO8j/wRGMaAP4OYLhHaRE/WAXOtSyk4HG9fdRnd7L8KeJHDzGyGqXMOYhIkSFxiMirho9Xa62voIogbZrIuX8Xh29yPsH3ya//LxD/Hq219HpTIlwWF+weMCGoXhk5/6a373tz7KkcH9LBtYieEkUzQGC0UiwrADh3dz+2teASBg7Nr1vCzEFSvWpPZERhRFbNq4kVWbNqOmL+L4xB68Nu98HSgsWnBKa5RWnot3tfWSTfzwoS/wo19+gS//rz/FN9PctOWD3LJ2HSs62unPatbnIwYaLxEN/YKXYgMdaZIU+8nADJKrao5tIhZ3r5B0iefaZHIOQ2OH+d7Pv8gn/vYPeeUrbqHRKJPPFyT6X0jSzywUcnziU3/Gz5/8Vlr4ljKUKNCgmhliJN/1zjvfDsC3vvUN7rzzPTEou/nJT36IUu6suVDK4Ybrb+SlwccYa+w6u4NFwAIecs4C3PnBEnMljSWEnlddfSWhNcMlF1/M+vXrGRw9gFI2uWyW9pZWulrj0dYmWdaZ8hiu7QkgWouHdAoeayRwSryrvQd38Du/9wG2bNmSVDNmTnPbVEkwuv6iVYyOH08Skfpk9aEhFUlQrll+kbAOIr785a8IO26++SaeeWYHWvtzXHfF4kVLqHCU3t7epnjtnMU5kzZIKShixLZu3cryFcvE+9gz+DPKLbcyNTOGY0Xkiy20F1vpb28lUpru9h5kV045DI8dlQkw2vxKKhs0tqPRTo3bb3u1pDaEFajTdCuV3L+kv0+Osvl+2By4iYeVslQ8OVeidKmm37NnL48//jgf/vBH+NKX/kkK6Wa70YY1q1dSyBU4z6IsoDGPS+bUoKQxRXdPD3hVdk4aSks/yrBzqdTHYispt5w+sZMv//DjvHjwKe659zPs3P8EtWpAPR5hoFlILEllgO1aaBNQbMmnicB5ti0Mw5dN79i2S3dvK1PTUwkYCpX8Hk09TaJAJwsGUYetrW14XoavfOWrlEozUp0/+28Yuno7yeQyAOfzxHBgAeUzwCMFZdahmauvvZSSeY6nDt7PqH0RY4t+i4rqYn1HnjcuL3JNdpDOke9yU0edK9dej448xGWuhbJS54AhwZu4z7ZNsZiju6sLY+aeUZW6WqampkSnz8EkUVEBJvDoau8jiSmRasfIYDdF/yaJPJUlOTKWL18mgeY3vvE1pqfLAs5sZhr6FvUJy89WFLAAjnULmKBJzhRsqfrQhsXL2lm6PsuBme/y+O4fMtP5BsqBodXRdHcupWvj7zDUcgfPHT7Ik7u/z/DEYYkd/HpAKrZjCQscx8YgG0Ny8NIPgkTVnMyx1WoVvvCFL/K9732fT3/6UwLKQlKr1ZHiN5DIPgZxblAm9mpqtColq8py+f3f/6gw77bb7uCVcXTe2toyh50Wg8cGCcNzY8YCyYTSAoAozlBkEk1ygnXVqlXozBAHRg9TXnwXFWcpkx2/wfef/CGP7/lHhmoPYreP8+zBnzBZHkOHCowwIykCsEFWs1SsyzgxdqLJ0TDCyscee0wOeL73ve/ni1/8x/l+pEGkVJrGD+pgoLnviolIbYgsgIkTVUaPT6Ejn0sv3c6jjz7MPXFO6/Of/2ySqmlGUQuLisVzsyHGqAUB2Qdw9iyZn5Lv7eth95GfMlFpMJx7Iz9+9J/ZHxv+tWtXsXzFAC3FFlauW8TgyGEwVmJLUr2vENFgMCxbshqjdKqn0VrsF88++xz33nt/bHS/yPDwCGNjQ7NUmrKU3Ldly1bx8lBNVtPImQ8g9ZwMmazDkZfGpIhBaz8G5RLe+tY3i1c5X4krYQjq5Pc+GzHzGTJkAUfS9+ffdHbAtLa2MrCqjR2Hvs2juz/PdLiPG2+8kc7OjtRbkeNh1caUMDJhgoCRgoqtUBhast2YyJplyMHhgQceFFDe/e67xGs7Fk8QqDkLRHHZxVfTku1Epe+l+yYGYV/qbRU7sux57pic4g2DMGWEXOdX0iiefvoZ8b7Onh0sJMMWsHseaoZzlo6ODlas7WHjJcu57rrrJFHZvHp379pDT8dSWalJwwDJNYEwA8sSA4yti9Sn3DQ4JRFhxV13vYe7734/QRCSy2VfhrkWkTbzKilNUsMrdsOGQkuWJx55jkcefoxqrSI2ZKGVr3VEGNbYv++gFG+crZelo9kvEWGPBTw+18vS5w6IqItsNisZ4WQiZ9NbGWaqY5ikqkN+nAxlG1AIa4x22PvcqASeTXhI5fng4KCorXXr1rJhw2YgXNC+KWZXEKbRvDHJ+0ahlc9A31q+8uWvypG7SqUsQM91s+v1hiyGhx54AhM5Z+1iaa3mAmKAHRZQmls8JIb23EUmPx1zRDo0DI7uFSAavkEZlcQKJDGBAqPwMjaHdo/h18Om+CfgD/7gY8zMlKRC5Dvf+VdAs5Dkch5Oxm6eCzHiqWhhipHkZECZygmXQ4cPy+ng8fHRNA5BDveUSkxOTvCud3yAnsxWXnXlO2JVeSxl7+nj8fIMeT6NQ15oTp3okAslaYJOVNpMZZJGUBN/vlGPRHejDJEwIz2BpMi1uDzz0H4J9FKgL774Mh566AEeeeQXDAyswJiIhSRb9HAdu8moW4kdEQcBdFL/Gxm6ujpY038Zf/3nn+Mzn/kMR48cF1cZSY3YAsYb3/Qm1ne+ios2bOXqba9iZjwQ5pyJYTdiv2bdb5LmZwespDH9DppE+toqLoSkeR+p9Ks2SrJDaJRhptSgUdOyhWu0GPkk8DQU2zM88rN9c4xbmLDPSv+fhUTZwrpZLe4irQX8KIwA0oBR3lu3+iK2rryFn/9gJx/56H/mg3d/KAbhLdz59vfxtjf8Dleveg+9XUtAzpyUeM0NH+T55144Y+/KmFlgZICfNYe+T9IkykAYXjiGAJJnavhl6dJjlBHD3qhGBHVDlIIRIS5xqlGff3o3SrlnEHgF1BtlKo1pUki0MQKGJBq1kYFBrn4QoYDFPf1sWXU9rdEm6qOdrC2+hjUtv8Zt2++iJdOJJSe/LIg0Ha0dbFv7BoaGhk7bwOv5gAB8sxmQx4EyoAFQ0mT4grZvlUP8OSUeTRQajIJKNaBSDgSYNGgLfSMpFj+s8Xf//TNo3TitJhRS6V6vI9vLo7uSHJxungEBJwhCUUvJW8Ke9vZuli1dyUVrriBrtTA4dpC9h55mcGQ/bsZGtB5ywIhG3Wd08rC0eTrdmCSK1EKA3BOXAblWchzhUWACiJrdMmMuLEtsqSx/gXI5lK3VUBsq9YBGPZRCtTQQNKHF+OQoY8NTDI8MyUZZFPkywS+jFpNKmBpPPfMElsklet5irghjwij5TE29XkUpLdvGbe1FNq7bxtqlF7NpzXYWLxrAWBplG7m/WvUpVaqMTO6Wtk2nK1EITbjZwIsxBjMAVlwGlL71i6b6rLSpMKgLAoiAcf3111Oxd7L74MMMD5cJQoMBJqd9qqVA1IhSlsQE3R19tLnL+dGPfiRAlMtVGg0fPctdMUnCcVI6LOzbt58P/faHKJWn5qqTuTVU8ns6NDy848e8dGQXEjSGobAhW3RwM0j1jG0nbaKwxHV9ds9DrFq79AzU6Hwv1hhzT3KNLGlDh7z4K0A1O/NhABgulMgkbNywEdr3snfoPo4PHaFaDQi1ZqYUiOdlkigebdPft5o//tgnePDBhwAjrmnMAik8iF1TcYMnJiYEFNfJxoHj/0mrt4SL110PmFllPSPjh6WAe7azYXFocE8SjSd3qiRWSWqAIx2IS35g8EWU8SjVhiXeOh3boZJuQcqat0B/FKsrFWOhFUDaDCW+DgJLmj8gW9BN9Lqw4IweUfhVh6u3vA7LDmktunhZJylQAKNhYnKcb9z3af70//ovvOH1r5P4QKLxMEKbSLrI/cu/fI1P/PWniAKLO+/4ffp6loLSzU2pYyb8EK1Drr/s9bOYE+lQasQWEHmvmGvnqz/8JK++7k4C3+LhPf9Mz5Li6XW9A2oliznyFHBDPP/VZqOe8v7jzYZGa1FbXFhJ1YfN4pUWkZrCWJGwpN7QBH5EvR4i+yMZS/Jh73vTf+Vv//xr/OeP/DFPPfUMDzz4U779nW/zJ3/05/ze7/4h3/3qE9yw9V1cufkOBhatBhXNqyzYtulmrrnkNfNWtmJO7iphlut4ckL4b/7pP/Kq696GbWeYqgxR8U+c/hMZGvNiD4B7UzAAUqOuY1viGWO+DtSbGwb4jQsPSLMqqfjDBL6Rui5L9DXoUIBJQHEAeMPNdxEML+Vzf/lj/u6/fZ//+bcPcuhZC3+snyVdm4VxW1ZfI4V4mPkUz2XyYkMWLujQaRkS+WyRWr3M/Y99Q1j17tf9ATmvhTDUNII6ruOctu0Ig1mA+IjwCZrEapqUIHnMzz/QLBpCPzXuF16M8jk+ukfsl1JGWGqARiOUbV+dVoxYEb09faxZdjnbNtzGNZfdQbHYSqFQlD38zWsvpVhoQbBWC7JywZ+lXSAKuRaxMd+697Ps2PUIa5dt56bL3yxH34IgIuPl2LP/UToO1jl+fOhU6ko0jZ4fDN4Tk2EiNhUncVigtcaVwM8BLwUMBfmi5sILsulk11Zy9dY3o/DJ5lw8T+FYCsuRfXV0ZMnZkS1rrkPrdG9DkcvksKW+S+Mk9xrM6TBUQKjWy0zOjPHUi/dzdGQvmdaIsAZvfeXHyOdyolaNVsLWatjghfu+QHcEv/QGufzyy/kVIg3NjJ7di1FrvdhxnBM/+rdvhCRiLdAN6DFjzC+AqBnPoHFBWJKuVDm9uv/5XRSO1qiVjkmhRBBFVGs+vq8lhY5WYJSok662ZTz2wv28EK/SA8de4ODxF+LX3+WRZ3/IocEXKVWnxF32nByOlSGXKcpROFt55LMt8joeUr5aq/o8+ux9/PKZ/8VPnvh7fvN9t/LNb32FjRs209+xVaJxMfRGSawCisNHn6Gl7nOsPiEJzpcXmbu5yUQb+Ie4lcnw3H5b6mX6LC6zLOvw3NZ+uYJGWec/r3XixAmGn9nP1a2rcbDZWx1l+bb34GaKWI5FxnMo5mxsR5HxXGGKMRaVaoVao4qFBSj2H9lJ/6YaQ0OjhA0Lv+7T2bqI7p5eBgeP0NLaQkuxjZ0v7pFtgcg0WLduDRsuWh4HkE/RxWWcmDnMzW9ayzVXXcOtN7+ZD/0f/w0gTbVQbzTkyN193/6r+PuuYWf9OMfafC677DJZXPMrdNRC7ZlqwHZg59yucs4Cbf3s2JYcia//j1LqPzSfG/EbFpmcviAsabdz5L0cRsEG08PjT36eTdvvxglsbCtHzYcsFsb42KEtrnCxkKVYzKYJO9bbm3hkxz/zmc/9DVs2b423YN/GscNDvOuDr+W22/5ICuHe+pbf5NrNb2JqZpz9U/fyht+8kW2XbecXP91BaA7T09nPsz+d4l+/9Jd8+N2fplKdSZqkgY6kzSzf/9GneWX7WrSjGLC7OBwdWyDYTBtizvOsFPC1GIgXWUDUKVr8HQHamz/Oy2kc7/wFjFpWnmbowRfZ3rlauoEaSzE9PsGzTsiSlbfTWegik7XJZVvwPI2d7C66rp2e8wAMtuXyxHMPMBrsoF6tsa7vFpb1rOOr9/0Fd//Wu/nO977N8uINLOrtZ3TyGC/ueQrfGufSyy/iyIs+oWnEQeSN9Pctp5DPUamWACthBzLZ93zvT7nSdNLa1goYUaVfH36MQmcrbY5Ndz5LaMB2XbAyeC19ONk8idQBG+iNAZk6NSDzgfkA8FkSOa+qq1lljYxivzjB+vZ+2TxyMi6SApmZ5lC9RK19BUv6NstefSHflRy4gXzOEVBs25IhuKA4cuwArmczsHi1pD9GR0f43Hf+E6+74QNsWLVNomzXzpPLtGCMkorL/kUracm3JkeWjXhSkqYPtSQ/bdvjGz//JBvLARt6V2BkizkUl/yno8/Q7VRpsR1spTAAGEI3g15/DZZtN59Hf1+sgb4QayAVX83ZdLZ+HLi8+X7LMmQL5rwB8uzTz7B5uo3eYideNiM1wjoKZa/ExuLo1DBPNk6wcvnNdLQtERbFJ7ekIDubsbClPawhIzFKkvYQxtjpPjg6kuPZoEzS4iPCoLGUlZYxpdMhYDR8yQDjh5oT4wfYt/d+eisVNvatxMlmMWiq5YrYqecmdtORmcFNupyCkhR9bdXlmGyBJnkgZsZNZ9smNpU3AseABpBJz8c16pDNGYw5d0DK0yXa1CLpg+KZTFoaLin6MAxY1rWEfr+Hh48+yPBkN7lCHxEBflAh6xVpKXTRUeyWvlyOrcQRcByraZItjIqkiZnCSvNaMiKMsIC0f1aoCQKk+ebekWc4vvdR7LFDbO9ZQ7GvD1xbWBwEmnICyIw/Ta8nu4pyUjiby1HuXS1gNDU7KQPvTFq3B2fTSDntozUY0+tNSqlvNbduigKFb51b6780mHK1whCJe5vPayI0jpwX9AgjDx2GWHmLm3IXM1abYKx+gonDDzGKYdPK6wh9X7wf13jScsnySRsCSDmqZSvZEVRoJJ0PEvVjONnCSSsc5eJm8oyVD3Jwz8/JTQyx3ivSvXQLypHuAdKIOQxD2c4tl0qM10soVcax2/GyeckwVNuXUMt3pmBoRPioPA7pPDTjt+TIWBT9LfAh5oiXMzhn+ZiKtInY/p89yaaom1BHtLS209LWQj6fk9Vm2ZZkcjGIaDS2UaAN040yT4y/xLGwRl/Pehb3rGOgd73EF6nH4zkOGkMSO2IrjQbR9dogYPhBxNTMMMdGdzE29ALdfsC1A5sJLYORViBSQYObzSBJ0NFhJqYnicoNHvb3c21HBrdYxPVcwmInk92r556u/VYMxptP50GUitOUG6/7NS/+Uk8AmwE1+9kh+qw7B42NjcGTg/SQlw4P+WyBtvZ2OuLh2BZOxktP32JQCY4Go5O+WZbLTK3EkZlRyjpkJgoIlIXnFWlr6SPMFPCy8cgUsbRm95HHKE0NYbkZelsW0ahMYYV1CrUS61oHyBVaeXByH9ctWk/ByRIFgXRPzWRzGAwzpWkGJwdplEvsK08R2ZNs7W4n11IkzLcz3rU6ZX6qL5+MQdh+us/RVWf4zMKCUmosQT1Dk2TyBts+Y5pI+1i1e4LuuoMf+aKq8tk83R1dOJ4nBXDSrEYMpkaTbnA5WIjKQRmhGsoARlEN6jTqVbFJE/UZfGMY8Ss8WzrAZZkB+nId4ChpO9iaK9Keb5UDpcq1sRXS1P/J0b1c3b2eSqNKm5clkytIe9jR8hiTlTGGYmBG/AkubsvT1t0JhfaYGWvAsprtxmFjzFUxU0fixjKG0xDnDHV+AGwADjFHGlVFJscZP9ilf8kSDry0j6F6C9241KM6UT3EmlRkc3np0ZvxPHEd0/6KKr66yZNwdNpyCQWWEvAKbgHprBBq2sIOaSubLY8z6ndySdcaArS0NM9lM7huPDIetutghIWarkyRWqNOaWJaGp1lihbT1SrVsMREbZJqvcbxcIY1nk2+kCPMFCnFYJAwo8mIvzl2bYcv2EPBjDFBTLsjwBWABsJZoNQUga9Q6sya0izRARV7gnFqgEJFhlK9RLk8LbuC8U4g0zMzlMrl+FqS49XlcplSJb6WypQrFdlDb9QaYnDDIECH0m0UFHi2x97qCJcWlhKhxTDHzCObK8QjK8e4EQ8rpF6pyTNM2qMMB8pDhLUaY9MTjMwMMVGZxK9V2dmYoE+FdLcWMG09zCzeKMxoOlYbAnfEc/WUZHIv/GPzRH1tV0o9DtSAHE1iO5DNaQynlpmxURrPPoUb+gzXNWWToUiRxeQkoec4Lhk7I1G47UnjmeT4wskI3Tr5aAtZ9UhsYREloLi+5t7xF7k6vxKVscnlC9hOfM3l5XO0NgJiGPhShVIulwhLdXaER1nqFNHKCJBWELFLz1CkyqaOFqL+Nfi9K5trVE0Cxk0xGA+nRvyCAxKjrizLUlrr9cDOl2uLmsmfevt3dHSUzPMxIEZTrwVSkzVlYByHJXTQRRHbceUDs44r+ai0EZmFkjSLdHgAAUFpg7Jt8aIUSjyyXdUh8qFNp1cgk8+Sz+UluWjHA4wA5/s+8pi9hi8R+IH6OENMsU61ggELi2FTp2JNsrUtD2suJWzrm5ujKiXMeOgCPXr11I9Diq8blVIPAD1pemDeM6rcl+fKvn37WD54QPoxinG2FGEjIAoMQ9owjk2namHAtOBZOXJJV2zE8QogaZCvlcYyQhUsbPHCbGUT+T479BCbVS84Dq0treTyOYlPSLtYNxpiM8JKgxkr4Fk9yEa6GdQz9JMnBMapELll1nd3YVZfhsnmm+MMCzistX5znFJ/KmXGOQNyDuC0J6BsBcK5zoJlGzI5syBbdjz4czabAMtx0kK1kw+erzeY8X1K2jAdQdEUaVcdeHi04OJgqBPgq5AQLf+FBMKgLFksYzGpy9QI6KaAp7LiVcWACKhSXY+mVq1JlD+iK/JYpU1eH65x2BHtZrFboGZCcpmIruWbiBatApgLxpNa69fGYAyf6/PVnfO0J16LaXpxvDK+Arx9fkZX9gRwM7Oeoy7G061XIJtBEoSijpRkUKU3VrFIplKhzfdZbOBEUGekMUhoHGpGAS4duPSZPBlsIiRWQQBF46kMEYoc8RWNMRH1Wh0hktaANO5HEplRhd2MsI1FtOgMj5rDrC/YuJ7G5Nowq7YRedmFWl5I0Hf7rW9RAKcBxoVnyJxSovcDfwO0zGWLaCQLHE/juLB/zy5ajhyg3XNki1SepOY4oDUqOYUbNnwpCw1D8ZwIwlDOaJggoq4NDQ0loA44WIDCUx4eGU6YKnll027aaMNDYaFAjLSUDhGgjBI27GKcLlxyuJTQtOZbqRRmWLxsLVHHItA67aqQquUy8J9iMP5HDIYXxxk+50EU51HiL6biL2ZiUFYnaftb0l3Hedu2yjC+bwddU8dlovKFPF4mK+kHExkBRI4RRJrQ6MQtFZdWQAmiCCJpUS7xhq1AAShRezIUyDhchzy95IwtsDgo4VJIgINDCZ+daoI24+LgsrhjCf1r1jJVdLHtpCBMWQZoAFngQWPMO2I2HD1Le3HhAZmflJTSoruVUp8CsswXMbyqNoM1tI9coyzpCdtzMUZJeY1rWWhOPt3AhBGT9Qa2MfEQJwBjFmhWJmkVObMhicmnpxtsYRVlAmZMnQYBJRpihyKFMKlPtcRALMJZ3Y/dUgRLsYAExpgPJvsZTnwNSeSCAXIBVFhnosLeAThABFiAkklD1ACEIbnSEPn6NDaarG2jDBhAgzRcDn1f7jtWqWJ8n27XRjmuAPJyMlouUa91scLtwbEcsplMwrCQkhNQUz6VLo9FKzYSOUrYqyCNKTRgAzXga8DvxWyYat7P+HcDCEC6K5YAtBH4CPBeRPABoQOkxlhhDLhhjVxUJxNU8cI6TtiQavO0CbMHPHDoKL22ojOXFUBfjoH7J0ssZg1t0mHIw+lpI8i7BFkHPxtfcyf7eKXVA0opvylX9w/Ap2UPfM6/6d8ZIAursfjaDXwBuAOwT8VSZbQMKwpw/CpeUCdDwMT4CQ6MnWBVxhbjrxBQ0wd1YByP0HIYN1k6iktQxSxkXLAUxrY4Dfm61vp3Y1d2aKFnDv57ByQFRQCIgQnjUqN+y7I+ALwWuISTEgEqHVwYMU3DnlP4fB/wVzEAE69+1VsdrTUxGCHA/16AzH9WYpSAlAO2AK8A3g2s56Q0ElCsdHB2opNhkmuGk7LTGHOPUuqHSZ1UFWCu9/S/MSDzJVUJTVH/bwBvBW4A7PPEFtPEwJ8B39Ra3xOrpGmAU6il/38Bkq5IwFFKmTiWCZqqKJdblnUFsAHYBCxKRitQBHJNwWcI1IASUAaOA8PAXuAZrfWLMQD7m+ImN3kOSCQR9v8H5P8FdKdwLi9BNikAAAAASUVORK5CYII="
+ };
+
var signinLink = document.getElementById('persona_login');
if (signinLink) {
- signinLink.onclick = function() { navigator.id.request(); };
+ signinLink.onclick = function() { navigator.id.request(requestParams); };
}
var signinLink1 = document.getElementById('persona_login1');
if (signinLink1) {
- signinLink1.onclick = function() { navigator.id.request(); };
+ signinLink1.onclick = function() { navigator.id.request(requestParams); };
}
var signoutLink = document.getElementById('logout');
@@ -32,15 +38,19 @@ $(document).ready(function () {
signoutLink.onclick = function() { navigator.id.logout(); };
}
+ var logout_url = document.getElementById('_logout_url').value;
+ var persona_user = document.getElementById('_persona_user').value;
+
navigator.id.watch({
+ loggedInUser: persona_user || null,
onlogin: function(assertion) {
document.getElementById('_assertion').value = assertion;
- document.getElementById('_persona_login').submit()
+ document.getElementById('_persona_login').submit();
},
onlogout: function() {
$.ajax({
- type: 'POST',
- url: '/auth/logout',
+ type: 'GET',
+ url: logout_url,
success: function(res, status, xhr) { window.location.reload(); },
error: function(xhr, status, err) { alert("Logout failure: " + err); }
});
diff --git a/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html b/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html
index 08879da5..a022c62a 100644
--- a/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html
+++ b/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/edit_link.html
@@ -17,9 +17,8 @@
#}
{% block persona_edit_link %}
- <p>
- <a href="{{ request.urlgen('mediagoblin.plugins.persona.edit') }}">
- {% trans %}Edit your Persona email addresses{% endtrans %}
- </a>
- </p>
+ <a href="{{ request.urlgen('mediagoblin.plugins.persona.edit') }}">
+ {% trans %}Persona's{% endtrans %}
+ </a>
+ &middot;
{% endblock %}
diff --git a/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona.html b/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona.html
index ec0e1875..03d63aae 100644
--- a/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona.html
+++ b/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona.html
@@ -26,5 +26,13 @@
method="POST">
{{ csrf_token }}
<input type="hidden" name="assertion" type="text" id="_assertion"/>
+ <input type="hidden" name="_logout_url" type="text" id="_logout_url"
+ value="{{ request.urlgen('mediagoblin.auth.logout') }}"/>
+ <input type="hidden" type="text" id="_persona_user"
+ {% if request.session.get('persona_login_email', False) %}
+ value="{{ request.session['persona_login_email'] }}"/>
+ {% else %}
+ value=""/>
+ {% endif %}
</form>
{% endblock %}
diff --git a/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona_js_head.html b/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona_js_end.html
index 8c0d72d5..8c0d72d5 100644
--- a/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona_js_head.html
+++ b/mediagoblin/plugins/persona/templates/mediagoblin/plugins/persona/persona_js_end.html
diff --git a/mediagoblin/plugins/persona/views.py b/mediagoblin/plugins/persona/views.py
index f3aff38d..1bba3b8c 100644
--- a/mediagoblin/plugins/persona/views.py
+++ b/mediagoblin/plugins/persona/views.py
@@ -64,6 +64,7 @@ def login(request):
if user:
request.session['user_id'] = unicode(user.id)
+ request.session['persona_login_email'] = email
request.session.save()
return redirect(request, "index")
@@ -183,9 +184,11 @@ def add(request):
new_entry.user_id = request.user.id
new_entry.save()
+ request.session['persona_login_email'] = email
+
messages.add_message(
request,
messages.SUCCESS,
- _('Your Person email address was saved successfully.'))
+ _('Your Persona email address was saved successfully.'))
return redirect(request, 'mediagoblin.edit.account')
diff --git a/mediagoblin/processing/__init__.py b/mediagoblin/processing/__init__.py
index f3a85940..246091d6 100644
--- a/mediagoblin/processing/__init__.py
+++ b/mediagoblin/processing/__init__.py
@@ -14,12 +14,20 @@
# 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/>.
+# Use an ordered dict if we can. If not, we'll just use a normal dict
+# later.
+try:
+ from collections import OrderedDict
+except:
+ OrderedDict = None
+
import logging
import os
-from mediagoblin.db.util import atomic_update
from mediagoblin import mg_globals as mgg
-
+from mediagoblin.db.util import atomic_update
+from mediagoblin.db.models import MediaEntry
+from mediagoblin.tools.pluginapi import hook_handle
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
_log = logging.getLogger(__name__)
@@ -74,49 +82,89 @@ class FilenameBuilder(object):
ext=self.ext)
-class ProcessingState(object):
- """
- The first and only argument to the "processor" of a media type
- This could be thought of as a "request" to the processor
- function. It has the main info for the request (media entry)
- and a bunch of tools for the request on it.
- It can get more fancy without impacting old media types.
+class MediaProcessor(object):
+ """A particular processor for this media type.
+
+ While the ProcessingManager handles all types of MediaProcessing
+ possible for a particular media type, a MediaProcessor can be
+ thought of as a *particular* processing action for a media type.
+ For example, you may have separate MediaProcessors for:
+
+ - initial_processing: the intial processing of a media
+ - gen_thumb: generate a thumbnail
+ - resize: resize an image
+ - transcode: transcode a video
+
+ ... etc.
+
+ Some information on producing a new MediaProcessor for your media type:
+
+ - You *must* supply a name attribute. This must be a class level
+ attribute, and a string. This will be used to determine the
+ subcommand of your process
+ - It's recommended that you supply a class level description
+ attribute.
+ - Supply a media_is_eligible classmethod. This will be used to
+ determine whether or not a media entry is eligible to use this
+ processor type. See the method documentation for details.
+ - To give "./bin/gmg reprocess run" abilities to this media type,
+ supply both gnerate_parser and parser_to_request classmethods.
+ - The process method will be what actually processes your media.
"""
- def __init__(self, entry):
+ # You MUST override this in the child MediaProcessor!
+ name = None
+
+ # Optional, but will be used in various places to describe the
+ # action this MediaProcessor provides
+ description = None
+
+ def __init__(self, manager, entry):
+ self.manager = manager
self.entry = entry
+ self.entry_orig_state = entry.state
+
+ # Should be initialized at time of processing, at least
self.workbench = None
- self.queued_filename = None
- def set_workbench(self, wb):
- self.workbench = wb
+ def __enter__(self):
+ self.workbench = mgg.workbench_manager.create()
+ return self
+
+ def __exit__(self, *args):
+ self.workbench.destroy()
+ self.workbench = None
- def get_queued_filename(self):
+ # @with_workbench
+ def process(self, **kwargs):
"""
- Get the a filename for the original, on local storage
+ Actually process this media entry.
"""
- if self.queued_filename is not None:
- return self.queued_filename
- queued_filepath = self.entry.queued_media_file
- queued_filename = self.workbench.localized_file(
- mgg.queue_store, queued_filepath,
- 'source')
- self.queued_filename = queued_filename
- return queued_filename
-
- def copy_original(self, target_name, keyname=u"original"):
- self.store_public(keyname, self.get_queued_filename(), target_name)
-
- def store_public(self, keyname, local_file, target_name=None):
- if target_name is None:
- target_name = os.path.basename(local_file)
- target_filepath = create_pub_filepath(self.entry, target_name)
- if keyname in self.entry.media_files:
- _log.warn("store_public: keyname %r already used for file %r, "
- "replacing with %r", keyname,
- self.entry.media_files[keyname], target_filepath)
- mgg.public_store.copy_local_to_storage(local_file, target_filepath)
- self.entry.media_files[keyname] = target_filepath
+ raise NotImplementedError
+
+ @classmethod
+ def media_is_eligible(cls, entry=None, state=None):
+ raise NotImplementedError
+
+ ###############################
+ # Command line interface things
+ ###############################
+
+ @classmethod
+ def generate_parser(cls):
+ raise NotImplementedError
+
+ @classmethod
+ def args_to_request(cls, args):
+ raise NotImplementedError
+
+ ##########################################
+ # THE FUTURE: web interface things here :)
+ ##########################################
+
+ #####################
+ # Some common "steps"
+ #####################
def delete_queue_file(self):
# Remove queued media file from storage and database.
@@ -124,9 +172,132 @@ class ProcessingState(object):
# be removed too, but fail if the directory is not empty to be on
# the super-safe side.
queued_filepath = self.entry.queued_media_file
- mgg.queue_store.delete_file(queued_filepath) # rm file
- mgg.queue_store.delete_dir(queued_filepath[:-1]) # rm dir
- self.entry.queued_media_file = []
+ if queued_filepath:
+ mgg.queue_store.delete_file(queued_filepath) # rm file
+ mgg.queue_store.delete_dir(queued_filepath[:-1]) # rm dir
+ self.entry.queued_media_file = []
+
+
+class ProcessingKeyError(Exception): pass
+class ProcessorDoesNotExist(ProcessingKeyError): pass
+class ProcessorNotEligible(ProcessingKeyError): pass
+class ProcessingManagerDoesNotExist(ProcessingKeyError): pass
+
+
+
+class ProcessingManager(object):
+ """Manages all the processing actions available for a media type
+
+ Specific processing actions, MediaProcessor subclasses, are added
+ to the ProcessingManager.
+ """
+ def __init__(self):
+ # Dict of all MediaProcessors of this media type
+ if OrderedDict is not None:
+ self.processors = OrderedDict()
+ else:
+ self.processors = {}
+
+ def add_processor(self, processor):
+ """
+ Add a processor class to this media type
+ """
+ name = processor.name
+ if name is None:
+ raise AttributeError("Processor class's .name attribute not set")
+
+ self.processors[name] = processor
+
+ def list_eligible_processors(self, entry):
+ """
+ List all processors that this media entry is eligible to be processed
+ for.
+ """
+ return [
+ processor
+ for processor in self.processors.values()
+ if processor.media_is_eligible(entry=entry)]
+
+ def list_all_processors_by_state(self, state):
+ """
+ List all processors that this media state is eligible to be processed
+ for.
+ """
+ return [
+ processor
+ for processor in self.processors.values()
+ if processor.media_is_eligible(state=state)]
+
+
+ def list_all_processors(self):
+ return self.processors.values()
+
+ def gen_process_request_via_cli(self, subparser):
+ # Got to figure out what actually goes here before I can write this properly
+ pass
+
+ def get_processor(self, key, entry=None):
+ """
+ Get the processor with this key.
+
+ If entry supplied, make sure this entry is actually compatible;
+ otherwise raise error.
+ """
+ try:
+ processor = self.processors[key]
+ except KeyError:
+ import pdb
+ pdb.set_trace()
+ raise ProcessorDoesNotExist(
+ "'%s' processor does not exist for this media type" % key)
+
+ if entry and not processor.media_is_eligible(entry):
+ raise ProcessorNotEligible(
+ "This entry is not eligible for processor with name '%s'" % key)
+
+ return processor
+
+
+def request_from_args(args, which_args):
+ """
+ Generate a request from the values of some argparse parsed args
+ """
+ request = {}
+ for arg in which_args:
+ request[arg] = getattr(args, arg)
+
+ return request
+
+
+class MediaEntryNotFound(Exception): pass
+
+
+def get_processing_manager_for_type(media_type):
+ """
+ Get the appropriate media manager for this type
+ """
+ manager_class = hook_handle(('reprocess_manager', media_type))
+ if not manager_class:
+ raise ProcessingManagerDoesNotExist(
+ "A processing manager does not exist for {0}".format(media_type))
+ manager = manager_class()
+
+ return manager
+
+
+def get_entry_and_processing_manager(media_id):
+ """
+ Get a MediaEntry, its media type, and its manager all in one go.
+
+ Returns a tuple of: `(entry, media_type, media_manager)`
+ """
+ entry = MediaEntry.query.filter_by(id=media_id).first()
+ if entry is None:
+ raise MediaEntryNotFound("Can't find media with id '%s'" % media_id)
+
+ manager = get_processing_manager_for_type(entry.media_type)
+
+ return entry, manager
def mark_entry_failed(entry_id, exc):
@@ -165,6 +336,65 @@ def mark_entry_failed(entry_id, exc):
u'fail_metadata': {}})
+def get_process_filename(entry, workbench, acceptable_files):
+ """
+ Try and get the queued file if available, otherwise return the first file
+ in the acceptable_files that we have.
+
+ If no acceptable_files, raise ProcessFileNotFound
+ """
+ if entry.queued_media_file:
+ filepath = entry.queued_media_file
+ storage = mgg.queue_store
+ else:
+ for keyname in acceptable_files:
+ if entry.media_files.get(keyname):
+ filepath = entry.media_files[keyname]
+ storage = mgg.public_store
+ break
+
+ if not filepath:
+ raise ProcessFileNotFound()
+
+ filename = workbench.localized_file(
+ storage, filepath,
+ 'source')
+
+ if not os.path.exists(filename):
+ raise ProcessFileNotFound()
+
+ return filename
+
+
+def store_public(entry, keyname, local_file, target_name=None,
+ delete_if_exists=True):
+ if target_name is None:
+ target_name = os.path.basename(local_file)
+ target_filepath = create_pub_filepath(entry, target_name)
+
+ if keyname in entry.media_files:
+ _log.warn("store_public: keyname %r already used for file %r, "
+ "replacing with %r", keyname,
+ entry.media_files[keyname], target_filepath)
+ if delete_if_exists:
+ mgg.public_store.delete_file(entry.media_files[keyname])
+
+ try:
+ mgg.public_store.copy_local_to_storage(local_file, target_filepath)
+ except:
+ raise PublicStoreFail(keyname=keyname)
+
+ # raise an error if the file failed to copy
+ if not mgg.public_store.file_exists(target_filepath):
+ raise PublicStoreFail(keyname=keyname)
+
+ entry.media_files[keyname] = target_filepath
+
+
+def copy_original(entry, orig_filename, target_name, keyname=u"original"):
+ store_public(entry, keyname, orig_filename, target_name)
+
+
class BaseProcessingFail(Exception):
"""
Base exception that all other processing failure messages should
@@ -184,10 +414,24 @@ class BaseProcessingFail(Exception):
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.')
+
+
+class PublicStoreFail(BaseProcessingFail):
+ """
+ Error that should be raised when copying to public store fails
+ """
+ general_message = _('Copying to public storage failed.')
+
+
+class ProcessFileNotFound(BaseProcessingFail):
+ """
+ Error that should be raised when an acceptable file for processing
+ is not found.
+ """
+ general_message = _(u'An acceptable processing file was not found')
diff --git a/mediagoblin/processing/task.py b/mediagoblin/processing/task.py
index 9af192ed..7f683485 100644
--- a/mediagoblin/processing/task.py
+++ b/mediagoblin/processing/task.py
@@ -18,19 +18,20 @@ import logging
import urllib
import urllib2
-from celery import registry, task
+import celery
+from celery.registry import tasks
from mediagoblin import mg_globals as mgg
-from mediagoblin.db.models import MediaEntry
-from . import mark_entry_failed, BaseProcessingFail, ProcessingState
+from . import mark_entry_failed, BaseProcessingFail
from mediagoblin.tools.processing import json_processing_callback
+from mediagoblin.processing import get_entry_and_processing_manager
_log = logging.getLogger(__name__)
logging.basicConfig()
_log.setLevel(logging.DEBUG)
-@task.task(default_retry_delay=2 * 60)
+@celery.task(default_retry_delay=2 * 60)
def handle_push_urls(feed_url):
"""Subtask, notifying the PuSH servers of new content
@@ -60,36 +61,51 @@ def handle_push_urls(feed_url):
'Giving up.'.format(feed_url))
return False
+
################################
# Media processing initial steps
################################
-
-class ProcessMedia(task.Task):
+class ProcessMedia(celery.Task):
"""
Pass this entry off for processing.
"""
- def run(self, media_id, feed_url):
+ def run(self, media_id, feed_url, reprocess_action, reprocess_info=None):
"""
Pass the media entry off to the appropriate processing function
(for now just process_image...)
:param feed_url: The feed URL that the PuSH server needs to be
updated for.
+ :param reprocess: A dict containing all of the necessary reprocessing
+ info for the media_type.
"""
- entry = MediaEntry.query.get(media_id)
+ reprocess_info = reprocess_info or {}
+ entry, manager = get_entry_and_processing_manager(media_id)
# Try to process, and handle expected errors.
try:
- entry.state = u'processing'
- entry.save()
-
- _log.debug('Processing {0}'.format(entry))
-
- proc_state = ProcessingState(entry)
- with mgg.workbench_manager.create() as workbench:
- proc_state.set_workbench(workbench)
- # run the processing code
- entry.media_manager.processor(proc_state)
+ processor_class = manager.get_processor(reprocess_action, entry)
+
+ with processor_class(manager, entry) as processor:
+ # Initial state change has to be here because
+ # the entry.state gets recorded on processor_class init
+ entry.state = u'processing'
+ entry.save()
+
+ _log.debug('Processing {0}'.format(entry))
+
+ try:
+ processor.process(**reprocess_info)
+ except Exception as exc:
+ if processor.entry_orig_state == 'processed':
+ _log.error(
+ 'Entry {0} failed to process due to the following'
+ ' error: {1}'.format(entry.id, exc))
+ _log.info(
+ 'Setting entry.state back to "processed"')
+ pass
+ else:
+ raise
# We set the state to processed and save the entry here so there's
# no need to save at the end of the processing stage, probably ;)
@@ -140,6 +156,4 @@ class ProcessMedia(task.Task):
entry = mgg.database.MediaEntry.query.filter_by(id=entry_id).first()
json_processing_callback(entry)
-# Register the task
-process_media = registry.tasks[ProcessMedia.name]
-
+tasks.register(ProcessMedia)
diff --git a/mediagoblin/static/js/file_size.js b/mediagoblin/static/js/file_size.js
new file mode 100644
index 00000000..2238ef89
--- /dev/null
+++ b/mediagoblin/static/js/file_size.js
@@ -0,0 +1,45 @@
+/**
+ * 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/>.
+ */
+
+$(document).ready(function(){
+ var file = document.getElementById('file');
+ var uploaded = parseInt(document.getElementById('uploaded').value);
+ var upload_limit = parseInt(document.getElementById('upload_limit').value);
+ var max_file_size = parseInt(document.getElementById('max_file_size').value);
+
+ file.onchange = function() {
+ var file_size = file.files[0].size / (1024.0 * 1024);
+
+ if (file_size >= max_file_size) {
+ $('#file').after('<p id="file_size_error" class="form_field_error">Sorry, the file size is too big.</p>');
+ }
+ else if (document.getElementById('file_size_error')) {
+ $('#file_size_error').hide();
+ }
+
+ if (upload_limit) {
+ if ( uploaded + file_size >= upload_limit) {
+ $('#file').after('<p id="upload_limit_error" class="form_field_error">Sorry, uploading this file will put you over your upload limit.</p>');
+ }
+ else if (document.getElementById('upload_limit_error')) {
+ $('#upload_limit_error').hide();
+ console.log(file_size >= max_file_size);
+ }
+ }
+ };
+});
diff --git a/mediagoblin/static/js/notifications.js b/mediagoblin/static/js/notifications.js
index 0153463a..78694f59 100644
--- a/mediagoblin/static/js/notifications.js
+++ b/mediagoblin/static/js/notifications.js
@@ -33,4 +33,17 @@ var notifications = {};
$(document).ready(function () {
notifications.init();
+
+ var mark_all_comments_seen = document.getElementById('mark_all_comments_seen');
+
+ if (mark_all_comments_seen) {
+ mark_all_comments_seen.href = '#';
+ mark_all_comments_seen.onclick = function() {
+ $.ajax({
+ type: 'GET',
+ url: mark_all_comments_seen_url,
+ success: function(res, status, xhr) { window.location.reload(); },
+ });
+ }
+ }
});
diff --git a/mediagoblin/storage/__init__.py b/mediagoblin/storage/__init__.py
index bbe134a7..51b46c07 100644
--- a/mediagoblin/storage/__init__.py
+++ b/mediagoblin/storage/__init__.py
@@ -191,6 +191,13 @@ class StorageInterface(object):
# Copy to storage system in 4M chunks
shutil.copyfileobj(source_file, dest_file, length=4*1048576)
+ def get_file_size(self, filepath):
+ """
+ Return the size of the file in bytes.
+ """
+ # Subclasses should override this method.
+ self.__raise_not_implemented()
+
###########
# Utilities
diff --git a/mediagoblin/storage/cloudfiles.py b/mediagoblin/storage/cloudfiles.py
index 250f06d4..47c81ad6 100644
--- a/mediagoblin/storage/cloudfiles.py
+++ b/mediagoblin/storage/cloudfiles.py
@@ -168,6 +168,12 @@ class CloudFilesStorage(StorageInterface):
# Copy to storage system in 4096 byte chunks
dest_file.send(source_file)
+ def get_file_size(self, filepath):
+ """Returns the file size in bytes"""
+ obj = self.container.get_object(
+ self._resolve_filepath(filepath))
+ return obj.total_bytes
+
class CloudFilesStorageObjectWrapper():
"""
Wrapper for python-cloudfiles's cloudfiles.storage_object.Object
diff --git a/mediagoblin/storage/filestorage.py b/mediagoblin/storage/filestorage.py
index 3d6e0753..29b8383b 100644
--- a/mediagoblin/storage/filestorage.py
+++ b/mediagoblin/storage/filestorage.py
@@ -111,3 +111,6 @@ class BasicFileStorage(StorageInterface):
os.makedirs(directory)
# This uses chunked copying of 16kb buffers (Py2.7):
shutil.copy(filename, self.get_local_path(filepath))
+
+ def get_file_size(self, filepath):
+ return os.stat(self._resolve_filepath(filepath)).st_size
diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py
index e9bd93fd..e2264645 100644
--- a/mediagoblin/submit/forms.py
+++ b/mediagoblin/submit/forms.py
@@ -17,30 +17,44 @@
import wtforms
+from mediagoblin import mg_globals
from mediagoblin.tools.text import tag_length_validator
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
from mediagoblin.tools.licenses import licenses_as_choices
-class SubmitStartForm(wtforms.Form):
- file = wtforms.FileField(_('File'))
- title = wtforms.TextField(
- _('Title'),
- [wtforms.validators.Length(min=0, max=500)])
- 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],
- description=_(
- "Separate tags by commas."))
- license = wtforms.SelectField(
- _('License'),
- [wtforms.validators.Optional(),],
- choices=licenses_as_choices())
+def get_submit_start_form(form, **kwargs):
+ max_file_size = kwargs.get('max_file_size')
+ desc = None
+ if max_file_size:
+ desc = _('Max file size: {0} mb'.format(max_file_size))
+
+ class SubmitStartForm(wtforms.Form):
+ file = wtforms.FileField(
+ _('File'),
+ description=desc)
+ title = wtforms.TextField(
+ _('Title'),
+ [wtforms.validators.Length(min=0, max=500)])
+ 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],
+ description=_(
+ "Separate tags by commas."))
+ license = wtforms.SelectField(
+ _('License'),
+ [wtforms.validators.Optional(),],
+ choices=licenses_as_choices())
+ max_file_size = wtforms.HiddenField('')
+ upload_limit = wtforms.HiddenField('')
+ uploaded = wtforms.HiddenField('')
+
+ return SubmitStartForm(form, **kwargs)
class AddCollectionForm(wtforms.Form):
title = wtforms.TextField(
diff --git a/mediagoblin/submit/lib.py b/mediagoblin/submit/lib.py
index 7e85696b..1bbf2cb8 100644
--- a/mediagoblin/submit/lib.py
+++ b/mediagoblin/submit/lib.py
@@ -21,7 +21,7 @@ from werkzeug.datastructures import FileStorage
from mediagoblin.db.models import MediaEntry
from mediagoblin.processing import mark_entry_failed
-from mediagoblin.processing.task import process_media
+from mediagoblin.processing.task import ProcessMedia
_log = logging.getLogger(__name__)
@@ -76,17 +76,21 @@ def prepare_queue_task(app, entry, filename):
return queue_file
-def run_process_media(entry, feed_url=None):
+def run_process_media(entry, feed_url=None,
+ reprocess_action="initial", reprocess_info=None):
"""Process the media asynchronously
:param entry: MediaEntry() instance to be processed.
:param feed_url: A string indicating the feed_url that the PuSH servers
should be notified of. This will be sth like: `request.urlgen(
'mediagoblin.user_pages.atom_feed',qualified=True,
- user=request.user.username)`"""
+ user=request.user.username)`
+ :param reprocess_action: What particular action should be run.
+ :param reprocess_info: A dict containing all of the necessary reprocessing
+ info for the given media_type"""
try:
- process_media.apply_async(
- [entry.id, feed_url], {},
+ ProcessMedia().apply_async(
+ [entry.id, feed_url, reprocess_action, reprocess_info], {},
task_id=entry.queued_task_id)
except BaseException as exc:
# The purpose of this section is because when running in "lazy"
diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py
index 3f9d5b2d..7f7dee33 100644
--- a/mediagoblin/submit/views.py
+++ b/mediagoblin/submit/views.py
@@ -43,8 +43,28 @@ def submit_start(request):
"""
First view for submitting a file.
"""
- submit_form = submit_forms.SubmitStartForm(request.form,
- license=request.user.license_preference)
+ user = request.user
+ if user.upload_limit >= 0:
+ upload_limit = user.upload_limit
+ else:
+ upload_limit = mg_globals.app_config.get('upload_limit', None)
+
+ if upload_limit and user.uploaded >= upload_limit:
+ messages.add_message(
+ request,
+ messages.WARNING,
+ _('Sorry, you have reached your upload limit.'))
+ return redirect(request, "mediagoblin.user_pages.user_home",
+ user=request.user.username)
+
+ max_file_size = mg_globals.app_config.get('max_file_size', None)
+
+ submit_form = submit_forms.get_submit_start_form(
+ request.form,
+ license=request.user.license_preference,
+ max_file_size=max_file_size,
+ upload_limit=upload_limit,
+ uploaded=user.uploaded)
if request.method == 'POST' and submit_form.validate():
if not check_file_field(request, 'file'):
@@ -86,23 +106,49 @@ def submit_start(request):
with queue_file:
queue_file.write(request.files['file'].stream.read())
- # Save now so we have this data before kicking off processing
- entry.save()
+ # Get file size and round to 2 decimal places
+ file_size = request.app.queue_store.get_file_size(
+ entry.queued_media_file) / (1024.0 * 1024)
+ file_size = float('{0:.2f}'.format(file_size))
+
+ error = False
+
+ # Check if file size is over the limit
+ if max_file_size and file_size >= max_file_size:
+ submit_form.file.errors.append(
+ _(u'Sorry, the file size is too big.'))
+ error = True
+
+ # Check if user is over upload limit
+ if upload_limit and (user.uploaded + file_size) >= upload_limit:
+ submit_form.file.errors.append(
+ _('Sorry, uploading this file will put you over your'
+ ' upload limit.'))
+ error = True
+
+ if not error:
+ user.uploaded = user.uploaded + file_size
+ user.save()
+
+ entry.file_size = file_size
+
+ # Save now so we have this data before kicking off processing
+ entry.save()
- # Pass off to processing
- #
- # (... don't change entry after this point to avoid race
- # conditions with changes to the document via processing code)
- feed_url = request.urlgen(
- 'mediagoblin.user_pages.atom_feed',
- qualified=True, user=request.user.username)
- run_process_media(entry, feed_url)
- add_message(request, SUCCESS, _('Woohoo! Submitted!'))
+ # Pass off to processing
+ #
+ # (... don't change entry after this point to avoid race
+ # conditions with changes to the document via processing code)
+ feed_url = request.urlgen(
+ 'mediagoblin.user_pages.atom_feed',
+ qualified=True, user=request.user.username)
+ run_process_media(entry, feed_url)
+ add_message(request, SUCCESS, _('Woohoo! Submitted!'))
- add_comment_subscription(request.user, entry)
+ add_comment_subscription(request.user, entry)
- return redirect(request, "mediagoblin.user_pages.user_home",
- user=request.user.username)
+ return redirect(request, "mediagoblin.user_pages.user_home",
+ user=user.username)
except Exception as e:
'''
This section is intended to catch exceptions raised in
diff --git a/mediagoblin/templates/mediagoblin/api/authorize.html b/mediagoblin/templates/mediagoblin/api/authorize.html
index d0ec2616..93cdc7e3 100644
--- a/mediagoblin/templates/mediagoblin/api/authorize.html
+++ b/mediagoblin/templates/mediagoblin/api/authorize.html
@@ -41,7 +41,7 @@
{% trans %}Applications with access to your account can: {% endtrans %}
<ul>
<li>{% trans %}Post new media as you{% endtrans %}</li>
- <li>{% trans %}See your information (e.g profile, meida, etc...){% endtrans %}</li>
+ <li>{% trans %}See your information (e.g profile, media, etc...){% endtrans %}</li>
<li>{% trans %}Change your information{% endtrans %}</li>
</ul>
<br />
diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html
index 483b6dfa..f9deb2ad 100644
--- a/mediagoblin/templates/mediagoblin/base.html
+++ b/mediagoblin/templates/mediagoblin/base.html
@@ -37,6 +37,9 @@
src="{{ request.staticdirect('/js/header_dropdown.js') }}"></script>
<script type="text/javascript"
src="{{ request.staticdirect('/js/notifications.js') }}"></script>
+ <script>
+ var mark_all_comments_seen_url = "{{ request.urlgen('mediagoblin.notifications.mark_all_comment_notifications_seen') }}"
+ </script>
{# For clarification, the difference between the extra_head.html template
# and the head template hook is that the former should be used by
@@ -47,8 +50,6 @@
{% include "mediagoblin/extra_head.html" %}
{% template_hook("head") %}
- {% template_hook("persona_head") %}
-
{% block mediagoblin_head %}
{% endblock mediagoblin_head %}
</head>
@@ -65,11 +66,11 @@
{% set notification_count = get_notification_count(request.user.id) %}
{% if notification_count %}
- <a href="#notifications" class="notification-gem button_action" title="Notifications">
+ <a href="javascript:;" class="notification-gem button_action" title="Notifications">
{{ notification_count }}</a>
{% endif %}
- <a href="#header" class="button_action header_dropdown_down">&#9660;</a>
- <a href="#no_header" class="button_action header_dropdown_up">&#9650;</a>
+ <a href="javascript:;" class="button_action header_dropdown_down">&#9660;</a>
+ <a href="javascript:;" class="button_action header_dropdown_up">&#9650;</a>
{% elif request.user and request.user.status == "needs_email_verification" %}
{# the following link should only appear when verification is needed #}
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
diff --git a/mediagoblin/templates/mediagoblin/bits/body_end.html b/mediagoblin/templates/mediagoblin/bits/body_end.html
index bb7b9762..c8f5e2d6 100644
--- a/mediagoblin/templates/mediagoblin/bits/body_end.html
+++ b/mediagoblin/templates/mediagoblin/bits/body_end.html
@@ -15,3 +15,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/>.
-#}
+
+{% template_hook("persona_end") %}
diff --git a/mediagoblin/templates/mediagoblin/edit/change_email.html b/mediagoblin/templates/mediagoblin/edit/change_email.html
new file mode 100644
index 00000000..76cc4771
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/edit/change_email.html
@@ -0,0 +1,45 @@
+{#
+# 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/>.
+#}
+{% extends "mediagoblin/base.html" %}
+
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block title -%}
+ {% trans username=user.username -%}
+ Changing {{ username }}'s email
+ {%- endtrans %} &mdash; {{ super() }}
+{%- endblock %}
+
+{% block mediagoblin_content %}
+ <form action="{{ request.urlgen('mediagoblin.edit.email') }}"
+ method="POST" enctype="multipart/form-data">
+ <div class="form_box edit_box">
+ <h1>
+ {%- trans username=user.username -%}
+ Changing {{ username }}'s email
+ {%- endtrans -%}
+ </h1>
+ {{ wtforms_util.render_divs(form, True) }}
+ {{ csrf_token }}
+ <div class="form_submit_buttons">
+ <input type="submit" value="{% trans %}Save{% endtrans %}"
+ class="button_form" />
+ </div>
+ </div>
+ </form>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/edit/edit_account.html b/mediagoblin/templates/mediagoblin/edit/edit_account.html
index 069cfd85..f9e75890 100644
--- a/mediagoblin/templates/mediagoblin/edit/edit_account.html
+++ b/mediagoblin/templates/mediagoblin/edit/edit_account.html
@@ -53,5 +53,16 @@
<a href="{{ request.urlgen('mediagoblin.edit.delete_account') }}">
{%- trans %}Delete my account{% endtrans -%}
</a>
+ &middot;
+ {% template_hook("edit_link") %}
+ <a href="{{ request.urlgen('mediagoblin.edit.email') }}">
+ {% trans %}Email{% endtrans %}
+ </a>
+ {% if pass_auth is defined %}
+ &middot;
+ <a href="{{ request.urlgen('mediagoblin.edit.pass') }}">
+ {% trans %}Password{% endtrans %}
+ </a>
+ {% endif %}
</div>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/fragments/header_notifications.html b/mediagoblin/templates/mediagoblin/fragments/header_notifications.html
index 70d7935a..55759a39 100644
--- a/mediagoblin/templates/mediagoblin/fragments/header_notifications.html
+++ b/mediagoblin/templates/mediagoblin/fragments/header_notifications.html
@@ -36,5 +36,9 @@
</li>
{% endfor %}
</ul>
+ <a href="{{ request.urlgen('mediagoblin.notifications.mark_all_comment_notifications_seen') }}?next={{
+ request.base_url|urlencode }}" id="mark_all_comments_seen">
+ {% trans %}Mark all read{% endtrans %}
+ </a>
</div>
{% endif %}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/pdf.html b/mediagoblin/templates/mediagoblin/media_displays/pdf.html
index 9319e87c..a615cba6 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/pdf.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/pdf.html
@@ -29,7 +29,7 @@
media.media_files['original']) %}
{% endif %}
-{% set pdf_js = global_config.get('media_type:mediagoblin.media_types.pdf', {}).get('pdf_js', False) %}
+{% set pdf_js = global_config['plugins'].get('mediagoblin.media_types.pdf', {}).get('pdf_js', False) %}
{% if pdf_js %}
{% block mediagoblin_html_tag %}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html
index b0854c9f..c6f770c1 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/video.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/video.html
@@ -21,17 +21,40 @@
{% block mediagoblin_head -%}
{{ super() }}
<script type="text/javascript" src="{{
- request.staticdirect('/extlib/video-js/video.min.js') }}"></script>
- <link href="{{ request.staticdirect('/css/vjs-mg-skin.css') }}"
+ request.staticdirect('/extlib/video-js/video.js') }}"></script>
+ {# Sadly commented out till we can get the mediagoblin skin ported over
+ # to the newest video.js release ;\ #}
+ {#
+ <link href="{{ request.staticdirect('/css/vjs-mg-skin.css') }}"
+ rel="stylesheet">
+ #}
+ <link href="{{
+ request.staticdirect('/extlib/video-js/video-js.css') }}"
rel="stylesheet">
+
+ <style type="text/css">
+ .vjs-default-skin .vjs-big-play-button
+ {
+ top: 50%;
+ left: 50%;
+ margin: -1.5em auto auto -2em;
+ }
+ .vjs-play-progress, .vjs-volume-level {
+ background-color: #561792 !important;
+ }
+ .vjs-default-skin {
+ color: #a59ead !important;
+ }
+
+ </style>
{%- endblock %}
{% block mediagoblin_media %}
{% set display_type, display_path = media.get_display_media() %}
<video controls
- {% if global_config['media_type:mediagoblin.media_types.video']['auto_play'] %}autoplay{% endif %}
- preload="auto" class="video-js vjs-mg-skin"
+ {% if global_config['plugins']['mediagoblin.media_types.video']['auto_play'] %}autoplay{% endif %}
+ preload="auto" class="video-js vjs-default-skin"
data-setup='{"height": {{ media.media_data.height }},
"width": {{ media.media_data.width }} }'>
<source src="{{ request.app.public_store.file_url(display_path) }}"
@@ -62,11 +85,11 @@
</a>
</li>
{% endif %}
- {% if 'webm_640' in media.media_files %}
+ {% if 'webm_video' in media.media_files %}
<li>
<a href="{{ request.app.public_store.file_url(
- media.media_files.webm_640) }}">
- {%- trans %}WebM file (640p; VP8/Vorbis){% endtrans -%}
+ media.media_files.webm_video) }}">
+ {%- trans %}WebM file (VP8/Vorbis){% endtrans -%}
</a>
</li>
{% endif %}
diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html
index aa390f56..d335d742 100644
--- a/mediagoblin/templates/mediagoblin/submit/start.html
+++ b/mediagoblin/templates/mediagoblin/submit/start.html
@@ -19,6 +19,11 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/file_size.js') }}"></script>
+{% endblock %}
+
{% block title -%}
{% trans %}Add your media{% endtrans %} &mdash; {{ super() }}
{%- endblock %}
diff --git a/mediagoblin/tests/resources.py b/mediagoblin/tests/resources.py
index f7b3037d..480f6d9a 100644
--- a/mediagoblin/tests/resources.py
+++ b/mediagoblin/tests/resources.py
@@ -29,6 +29,8 @@ EVIL_JPG = resource('evil.jpg')
EVIL_PNG = resource('evil.png')
BIG_BLUE = resource('bigblue.png')
GOOD_PDF = resource('good.pdf')
+MED_PNG = resource('medium.png')
+BIG_PNG = resource('big.png')
def resource_exif(f):
diff --git a/mediagoblin/tests/test_celery_setup.py b/mediagoblin/tests/test_celery_setup.py
index 0184436a..d60293f9 100644
--- a/mediagoblin/tests/test_celery_setup.py
+++ b/mediagoblin/tests/test_celery_setup.py
@@ -55,6 +55,6 @@ def test_setup_celery_from_config():
pkg_resources.resource_filename('mediagoblin.tests', 'celery.db'))
assert fake_celery_module.BROKER_TRANSPORT == 'sqlalchemy'
- assert fake_celery_module.BROKER_HOST == (
+ assert fake_celery_module.BROKER_URL == (
'sqlite:///' +
pkg_resources.resource_filename('mediagoblin.tests', 'kombu.db'))
diff --git a/mediagoblin/tests/test_edit.py b/mediagoblin/tests/test_edit.py
index 581af4ac..4740bd2a 100644
--- a/mediagoblin/tests/test_edit.py
+++ b/mediagoblin/tests/test_edit.py
@@ -112,26 +112,26 @@ class TestUserEdit(object):
# Test email already in db
template.clear_test_template_context()
test_app.post(
- '/edit/account/', {
+ '/edit/email/', {
'new_email': 'chris@example.com',
'password': 'toast'})
# Check form errors
context = template.TEMPLATE_TEST_CONTEXT[
- 'mediagoblin/edit/edit_account.html']
+ 'mediagoblin/edit/change_email.html']
assert context['form'].new_email.errors == [
u'Sorry, a user with that email address already exists.']
# Test successful email change
template.clear_test_template_context()
res = test_app.post(
- '/edit/account/', {
+ '/edit/email/', {
'new_email': 'new@example.com',
'password': 'toast'})
res.follow()
# Correct redirect?
- assert urlparse.urlsplit(res.location)[2] == '/u/chris/'
+ assert urlparse.urlsplit(res.location)[2] == '/edit/account/'
# Make sure we get email verification and try verifying
assert len(mail.EMAIL_TEST_INBOX) == 1
diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini
index 535cf1c1..4cd3d9b6 100644
--- a/mediagoblin/tests/test_mgoblin_app.ini
+++ b/mediagoblin/tests/test_mgoblin_app.ini
@@ -13,6 +13,10 @@ tags_max_length = 50
# So we can start to test attachments:
allow_attachments = True
+upload_limit = 500
+
+max_file_size = 2
+
[storage:publicstore]
base_dir = %(here)s/user_dev/media/public
base_url = /mgoblin_media/
@@ -23,7 +27,7 @@ base_dir = %(here)s/user_dev/media/queue
[celery]
CELERY_ALWAYS_EAGER = true
CELERY_RESULT_DBURI = "sqlite:///%(here)s/user_dev/celery.db"
-BROKER_HOST = "sqlite:///%(here)s/user_dev/kombu.db"
+BROKER_URL = "sqlite:///%(here)s/test_user_dev/kombu.db"
[plugins]
[[mediagoblin.plugins.api]]
diff --git a/mediagoblin/tests/test_notifications.py b/mediagoblin/tests/test_notifications.py
index d52b8d5a..e075d475 100644
--- a/mediagoblin/tests/test_notifications.py
+++ b/mediagoblin/tests/test_notifications.py
@@ -149,3 +149,56 @@ otherperson@example.com\n\nSGkgb3RoZXJwZXJzb24sCmNocmlzIGNvbW1lbnRlZCBvbiB5b3VyI
# User should not have been notified
assert len(notifications) == 1
+
+ def test_mark_all_comment_notifications_seen(self):
+ """ Test that mark_all_comments_seen works"""
+
+ user = fixture_add_user('otherperson', password='nosreprehto')
+
+ media_entry = fixture_media_entry(uploader=user.id, state=u'processed')
+
+ fixture_comment_subscription(media_entry)
+
+ media_uri_id = '/u/{0}/m/{1}/'.format(user.username,
+ media_entry.id)
+
+ # add 2 comments
+ self.test_app.post(
+ media_uri_id + 'comment/add/',
+ {
+ 'comment_content': u'Test comment #43'
+ }
+ )
+
+ self.test_app.post(
+ media_uri_id + 'comment/add/',
+ {
+ 'comment_content': u'Test comment #44'
+ }
+ )
+
+ notifications = Notification.query.filter_by(
+ user_id=user.id).all()
+
+ assert len(notifications) == 2
+
+ # both comments should not be marked seen
+ assert notifications[0].seen == False
+ assert notifications[1].seen == False
+
+ # login with other user to mark notifications seen
+ self.logout()
+ self.login('otherperson', 'nosreprehto')
+
+ # mark all comment notifications seen
+ res = self.test_app.get('/notifications/comments/mark_all_seen/')
+ res.follow()
+
+ assert urlparse.urlsplit(res.location)[2] == '/'
+
+ notifications = Notification.query.filter_by(
+ user_id=user.id).all()
+
+ # both notifications should be marked seen
+ assert notifications[0].seen == True
+ assert notifications[1].seen == True
diff --git a/mediagoblin/tests/test_persona.py b/mediagoblin/tests/test_persona.py
index ce795258..919877c9 100644
--- a/mediagoblin/tests/test_persona.py
+++ b/mediagoblin/tests/test_persona.py
@@ -18,6 +18,8 @@ import pkg_resources
import pytest
import mock
+pytest.importorskip("requests")
+
from mediagoblin import mg_globals
from mediagoblin.db.base import Session
from mediagoblin.tests.tools import get_app
diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py
index ac941063..7f4e8086 100644
--- a/mediagoblin/tests/test_submission.py
+++ b/mediagoblin/tests/test_submission.py
@@ -24,13 +24,14 @@ import pytest
from mediagoblin.tests.tools import fixture_add_user
from mediagoblin import mg_globals
-from mediagoblin.db.models import MediaEntry
+from mediagoblin.db.models import MediaEntry, User
+from mediagoblin.db.base import Session
from mediagoblin.tools import template
from mediagoblin.media_types.image import ImageMediaManager
from mediagoblin.media_types.pdf.processing import check_prerequisites as pdf_check_prerequisites
from .resources import GOOD_JPG, GOOD_PNG, EVIL_FILE, EVIL_JPG, EVIL_PNG, \
- BIG_BLUE, GOOD_PDF, GPS_JPG
+ BIG_BLUE, GOOD_PDF, GPS_JPG, MED_PNG, BIG_PNG
GOOD_TAG_STRING = u'yin,yang'
BAD_TAG_STRING = unicode('rage,' + 'f' * 26 + 'u' * 26)
@@ -107,9 +108,38 @@ class TestSubmission:
self.logout()
self.test_app.get(url)
+ def user_upload_limits(self, uploaded=None, upload_limit=None):
+ if uploaded:
+ self.test_user.uploaded = uploaded
+ if upload_limit:
+ self.test_user.upload_limit = upload_limit
+
+ self.test_user.save()
+
+ # Reload
+ self.test_user = User.query.filter_by(
+ username=self.test_user.username
+ ).first()
+
+ # ... and detach from session:
+ Session.expunge(self.test_user)
+
def test_normal_jpg(self):
+ # User uploaded should be 0
+ assert self.test_user.uploaded == 0
+
self.check_normal_upload(u'Normal upload 1', GOOD_JPG)
+ # User uploaded should be the same as GOOD_JPG size in Mb
+ file_size = os.stat(GOOD_JPG).st_size / (1024.0 * 1024)
+ file_size = float('{0:.2f}'.format(file_size))
+
+ # Reload user
+ self.test_user = User.query.filter_by(
+ username=self.test_user.username
+ ).first()
+ assert self.test_user.uploaded == file_size
+
def test_normal_png(self):
self.check_normal_upload(u'Normal upload 2', GOOD_PNG)
@@ -121,6 +151,75 @@ class TestSubmission:
self.check_url(response, '/u/{0}/'.format(self.test_user.username))
assert 'mediagoblin/user_pages/user.html' in context
+ def test_default_upload_limits(self):
+ self.user_upload_limits(uploaded=500)
+
+ # User uploaded should be 500
+ assert self.test_user.uploaded == 500
+
+ response, context = self.do_post({'title': u'Normal upload 4'},
+ do_follow=True,
+ **self.upload_data(GOOD_JPG))
+ self.check_url(response, '/u/{0}/'.format(self.test_user.username))
+ assert 'mediagoblin/user_pages/user.html' in context
+
+ # Reload user
+ self.test_user = User.query.filter_by(
+ username=self.test_user.username
+ ).first()
+
+ # Shouldn't have uploaded
+ assert self.test_user.uploaded == 500
+
+ def test_user_upload_limit(self):
+ self.user_upload_limits(uploaded=25, upload_limit=25)
+
+ # User uploaded should be 25
+ assert self.test_user.uploaded == 25
+
+ response, context = self.do_post({'title': u'Normal upload 5'},
+ do_follow=True,
+ **self.upload_data(GOOD_JPG))
+ self.check_url(response, '/u/{0}/'.format(self.test_user.username))
+ assert 'mediagoblin/user_pages/user.html' in context
+
+ # Reload user
+ self.test_user = User.query.filter_by(
+ username=self.test_user.username
+ ).first()
+
+ # Shouldn't have uploaded
+ assert self.test_user.uploaded == 25
+
+ def test_user_under_limit(self):
+ self.user_upload_limits(uploaded=499)
+
+ # User uploaded should be 499
+ assert self.test_user.uploaded == 499
+
+ response, context = self.do_post({'title': u'Normal upload 6'},
+ do_follow=False,
+ **self.upload_data(MED_PNG))
+ form = context['mediagoblin/submit/start.html']['submit_form']
+ assert form.file.errors == [u'Sorry, uploading this file will put you'
+ ' over your upload limit.']
+
+ # Reload user
+ self.test_user = User.query.filter_by(
+ username=self.test_user.username
+ ).first()
+
+ # Shouldn't have uploaded
+ assert self.test_user.uploaded == 499
+
+ def test_big_file(self):
+ response, context = self.do_post({'title': u'Normal upload 7'},
+ do_follow=False,
+ **self.upload_data(BIG_PNG))
+
+ form = context['mediagoblin/submit/start.html']['submit_form']
+ assert form.file.errors == [u'Sorry, the file size is too big.']
+
def check_media(self, request, find_data, count=None):
media = MediaEntry.query.filter_by(**find_data)
if count is not None:
@@ -155,6 +254,7 @@ class TestSubmission:
'ffffffffffffffffffffffffffuuuuuuuuuuuuuuuuuuuuuuuuuu']
def test_delete(self):
+ self.user_upload_limits(uploaded=50)
response, request = self.do_post({'title': u'Balanced Goblin'},
*REQUEST_CONTEXT, do_follow=True,
**self.upload_data(GOOD_JPG))
@@ -199,6 +299,14 @@ class TestSubmission:
self.check_media(request, {'id': media_id}, 0)
self.check_comments(request, media_id, 0)
+ # Reload user
+ self.test_user = User.query.filter_by(
+ username = self.test_user.username
+ ).first()
+
+ # Check that user.uploaded is the same as before the upload
+ assert self.test_user.uploaded == 50
+
def test_evil_file(self):
# Test non-suppoerted file with non-supported extension
# -----------------------------------------------------
diff --git a/mediagoblin/tests/test_submission/COPYING.txt b/mediagoblin/tests/test_submission/COPYING.txt
new file mode 100644
index 00000000..3818aae4
--- /dev/null
+++ b/mediagoblin/tests/test_submission/COPYING.txt
@@ -0,0 +1,5 @@
+Images located in this directory tree are released under a GPLv3 license
+and CC BY-SA 3.0 license. To the extent possible under law, the author(s)
+have dedicated all copyright and related and neighboring rights to these
+files to the public domain worldwide. These files are distributed without
+any warranty.
diff --git a/mediagoblin/tests/test_submission/big.png b/mediagoblin/tests/test_submission/big.png
new file mode 100644
index 00000000..a284cfda
--- /dev/null
+++ b/mediagoblin/tests/test_submission/big.png
Binary files differ
diff --git a/mediagoblin/tests/test_submission/medium.png b/mediagoblin/tests/test_submission/medium.png
new file mode 100644
index 00000000..e8b9ca00
--- /dev/null
+++ b/mediagoblin/tests/test_submission/medium.png
Binary files differ
diff --git a/mediagoblin/tools/pagination.py b/mediagoblin/tools/pagination.py
index d0f08c94..855878e0 100644
--- a/mediagoblin/tools/pagination.py
+++ b/mediagoblin/tools/pagination.py
@@ -18,7 +18,7 @@ import urllib
import copy
from math import ceil, floor
from itertools import izip, count
-
+from werkzeug.datastructures import MultiDict
PAGINATION_DEFAULT_PER_PAGE = 30
@@ -98,7 +98,11 @@ class Pagination(object):
"""
Get a page url by adding a page= parameter to the base url
"""
- new_get_params = dict(get_params) or {}
+ if isinstance(get_params, MultiDict):
+ new_get_params = get_params.to_dict()
+ else:
+ new_get_params = dict(get_params) or {}
+
new_get_params['page'] = page_no
return "%s?%s" % (
base_url, urllib.urlencode(new_get_params))
diff --git a/mediagoblin/tools/pluginapi.py b/mediagoblin/tools/pluginapi.py
index 3f98aa8a..1eabe9f1 100644
--- a/mediagoblin/tools/pluginapi.py
+++ b/mediagoblin/tools/pluginapi.py
@@ -252,7 +252,7 @@ def get_hook_templates(hook_name):
.. code-block:: html+jinja
- {% template_hook "media_sidebar" %}
+ {% template_hook("media_sidebar") %}
... which will include all templates for you, partly using this
method.
diff --git a/mediagoblin/tools/staticdirect.py b/mediagoblin/tools/staticdirect.py
index ef8b20d0..8381b8b6 100644
--- a/mediagoblin/tools/staticdirect.py
+++ b/mediagoblin/tools/staticdirect.py
@@ -35,7 +35,8 @@ class StaticDirect(object):
staticdirect to. In general, you should supply a None domain, as
that's the "default" domain.
- Things work like this:
+ Things work like this::
+
>>> staticdirect = StaticDirect(
... {None: "/static/",
... "theme": "http://example.org/themestatic/"})
@@ -69,17 +70,18 @@ class PluginStatic(object):
This has two mandatory attributes that you must pass in on class
init:
- - name: this name will be both used for lookup in "urlgen" for
- your plugin's static resources and for the subdirectory that
- it'll be "mounted" to for serving via your web browser. It
- *MUST* be unique. If writing a plugin bundled with MediaGoblin
- please use the pattern 'coreplugin__foo' where 'foo' is your
- plugin name. All external plugins should use their modulename,
- so if your plugin is 'mg_bettertags' you should also call this
- name 'mg_bettertags'.
- - file_path: the directory your plugin's static resources are
- located in. It's recommended that you use
- pkg_resources.resource_filename() for this.
+
+ - *name:* this name will be both used for lookup in "urlgen" for
+ your plugin's static resources and for the subdirectory that
+ it'll be "mounted" to for serving via your web browser. It
+ *MUST* be unique. If writing a plugin bundled with MediaGoblin
+ please use the pattern 'coreplugin__foo' where 'foo' is your
+ plugin name. All external plugins should use their modulename,
+ so if your plugin is 'mg_bettertags' you should also call this
+ name 'mg_bettertags'.
+ - *file_path:* the directory your plugin's static resources are
+ located in. It's recommended that you use
+ pkg_resources.resource_filename() for this.
An example of using this::
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py
index 91ea04b8..5eac0fe4 100644
--- a/mediagoblin/user_pages/views.py
+++ b/mediagoblin/user_pages/views.py
@@ -296,13 +296,23 @@ def media_confirm_delete(request, media):
if request.method == 'POST' and form.validate():
if form.confirm.data is True:
username = media.get_uploader.username
+
+ media.get_uploader.uploaded = media.get_uploader.uploaded - \
+ media.file_size
+ media.get_uploader.save()
+
# Delete MediaEntry and all related files, comments etc.
media.delete()
messages.add_message(
request, messages.SUCCESS, _('You deleted the media.'))
- return redirect(request, "mediagoblin.user_pages.user_home",
- user=username)
+ location = media.url_to_next(request.urlgen)
+ if not location:
+ location=media.url_to_prev(request.urlgen)
+ if not location:
+ location=request.urlgen("mediagoblin.user_pages.user_home",
+ user=username)
+ return redirect(request, location=location)
else:
messages.add_message(
request, messages.ERROR,
diff --git a/setup.py b/setup.py
index b485a2ff..cf3c2018 100644
--- a/setup.py
+++ b/setup.py
@@ -48,8 +48,8 @@ setup(
'pytest>=2.3.1',
'pytest-xdist',
'werkzeug>=0.7',
- 'celery==2.5.3',
- 'kombu==2.1.7',
+ 'celery>=3.0',
+ 'kombu',
'jinja2',
'sphinx',
'Babel<1.0',
@@ -63,7 +63,7 @@ setup(
'itsdangerous',
'pytz',
'six',
- 'oauthlib',
+ 'oauthlib==0.5.0',
## This is optional!
# 'translitcodec',
## For now we're expecting that users will install this from