aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin
diff options
context:
space:
mode:
Diffstat (limited to 'mediagoblin')
-rw-r--r--mediagoblin/_version.py11
-rw-r--r--mediagoblin/app.py35
-rw-r--r--mediagoblin/auth/forms.py26
-rw-r--r--mediagoblin/auth/lib.py19
-rw-r--r--mediagoblin/auth/routing.py13
-rw-r--r--mediagoblin/auth/views.py105
-rw-r--r--mediagoblin/config_spec.ini18
-rw-r--r--mediagoblin/db/__init__.py2
-rw-r--r--mediagoblin/db/mixin.py92
-rw-r--r--mediagoblin/db/mongo/__init__.py (renamed from mediagoblin/templates/mediagoblin/auth/fp_changed_success.html)14
-rw-r--r--mediagoblin/db/mongo/indexes.py (renamed from mediagoblin/db/indexes.py)5
-rw-r--r--mediagoblin/db/mongo/migrations.py (renamed from mediagoblin/db/migrations.py)10
-rw-r--r--mediagoblin/db/mongo/models.py (renamed from mediagoblin/db/models.py)0
-rw-r--r--mediagoblin/db/mongo/open.py78
-rw-r--r--mediagoblin/db/mongo/util.py292
-rw-r--r--mediagoblin/db/open.py41
-rw-r--r--mediagoblin/db/sql/__init__.py (renamed from mediagoblin/templates/mediagoblin/auth/fp_email_sent.html)15
-rw-r--r--mediagoblin/db/sql/base.py38
-rw-r--r--mediagoblin/db/sql/convert.py151
-rw-r--r--mediagoblin/db/sql/extratypes.py18
-rw-r--r--mediagoblin/db/sql/models.py153
-rw-r--r--mediagoblin/db/sql/open.py33
-rw-r--r--mediagoblin/db/util.py277
-rw-r--r--mediagoblin/decorators.py17
-rw-r--r--mediagoblin/edit/__init__.py2
-rw-r--r--mediagoblin/edit/forms.py32
-rw-r--r--mediagoblin/edit/lib.py4
-rw-r--r--mediagoblin/edit/routing.py5
-rw-r--r--mediagoblin/edit/views.py100
-rw-r--r--mediagoblin/gmg_commands/__init__.py5
-rw-r--r--mediagoblin/gmg_commands/import_export.py36
-rw-r--r--mediagoblin/gmg_commands/migrate.py14
-rw-r--r--mediagoblin/gmg_commands/users.py36
-rw-r--r--mediagoblin/gmg_commands/util.py13
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mobin12268 -> 14396 bytes
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po497
-rw-r--r--mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mobin10826 -> 13397 bytes
-rw-r--r--mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po501
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mobin11089 -> 13692 bytes
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po548
-rw-r--r--mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po458
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mobin10809 -> 13543 bytes
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po524
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mobin11329 -> 13891 bytes
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po547
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mobin11272 -> 12357 bytes
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po403
-rw-r--r--mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mobin10530 -> 13161 bytes
-rw-r--r--mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po457
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mobin11026 -> 13574 bytes
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po523
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mobin11224 -> 13736 bytes
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po469
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mobin10695 -> 11670 bytes
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po412
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mobin10287 -> 12901 bytes
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po509
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mobin10945 -> 13279 bytes
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po515
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mobin11051 -> 13685 bytes
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po535
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mobin13895 -> 16681 bytes
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po530
-rw-r--r--mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mobin11267 -> 13900 bytes
-rw-r--r--mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po576
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mobin10764 -> 13350 bytes
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po488
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mobin10627 -> 13259 bytes
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po455
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mobin11015 -> 13448 bytes
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po511
-rw-r--r--mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mobin0 -> 13409 bytes
-rw-r--r--mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po637
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mobin10509 -> 11198 bytes
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po324
-rw-r--r--mediagoblin/init/__init__.py46
-rw-r--r--mediagoblin/init/celery/__init__.py14
-rw-r--r--mediagoblin/init/celery/from_celery.py2
-rw-r--r--mediagoblin/init/config.py2
-rw-r--r--mediagoblin/listings/routing.py1
-rw-r--r--mediagoblin/listings/views.py27
-rw-r--r--mediagoblin/meddleware/__init__.py32
-rw-r--r--mediagoblin/meddleware/csrf.py (renamed from mediagoblin/middleware/csrf.py)30
-rw-r--r--mediagoblin/meddleware/noop.py (renamed from mediagoblin/middleware/noop.py)9
-rw-r--r--mediagoblin/media_types/__init__.py88
-rw-r--r--mediagoblin/media_types/ascii/__init__.py27
-rw-r--r--mediagoblin/media_types/ascii/asciitoimage.py172
l---------mediagoblin/media_types/ascii/fonts/Inconsolata.otf1
-rw-r--r--mediagoblin/media_types/ascii/processing.py93
-rw-r--r--mediagoblin/media_types/image/__init__.py26
-rw-r--r--mediagoblin/media_types/image/processing.py109
-rw-r--r--mediagoblin/media_types/video/__init__.py27
-rw-r--r--mediagoblin/media_types/video/devices/web-advanced.json505
-rw-r--r--mediagoblin/media_types/video/devices/web-flv.pngbin0 -> 2234 bytes
-rw-r--r--mediagoblin/media_types/video/devices/web-webm.svg259
-rw-r--r--mediagoblin/media_types/video/devices/web.svg982
-rw-r--r--mediagoblin/media_types/video/processing.py119
-rw-r--r--mediagoblin/media_types/video/transcoders.py658
-rw-r--r--mediagoblin/messages.py2
-rw-r--r--mediagoblin/process_media/errors.py44
-rw-r--r--mediagoblin/processing.py (renamed from mediagoblin/process_media/__init__.py)120
-rw-r--r--mediagoblin/routing.py4
-rw-r--r--mediagoblin/static/css/base.css265
l---------mediagoblin/static/css/extlib/960_16_col.css1
l---------mediagoblin/static/css/extlib/reset.css2
l---------mediagoblin/static/css/extlib/text.css1
l---------mediagoblin/static/fonts/Inconsolata.otf1
-rw-r--r--mediagoblin/static/images/empty_back.pngbin0 -> 191 bytes
-rw-r--r--mediagoblin/static/images/icon_comment.pngbin0 -> 283 bytes
-rw-r--r--mediagoblin/static/images/icon_delete.pngbin472 -> 0 bytes
-rw-r--r--mediagoblin/static/images/icon_edit.pngbin297 -> 0 bytes
-rw-r--r--mediagoblin/static/images/media_thumbs/video.jpgbin0 -> 7278 bytes
-rw-r--r--mediagoblin/static/images/navigation_end.pngbin718 -> 0 bytes
-rw-r--r--mediagoblin/static/images/navigation_left.pngbin406 -> 0 bytes
-rw-r--r--mediagoblin/static/images/navigation_right.pngbin383 -> 0 bytes
-rw-r--r--mediagoblin/static/images/pagination_left.pngbin252 -> 0 bytes
-rw-r--r--mediagoblin/static/images/pagination_right.pngbin249 -> 0 bytes
-rw-r--r--mediagoblin/static/js/comment_show.js9
l---------mediagoblin/static/js/extlib/html5shiv.js1
l---------mediagoblin/static/js/extlib/jquery.js1
-rw-r--r--mediagoblin/static/js/show_password.js19
-rw-r--r--mediagoblin/staticdirect.py17
-rw-r--r--mediagoblin/storage/__init__.py12
-rw-r--r--mediagoblin/storage/cloudfiles.py11
-rw-r--r--mediagoblin/storage/filestorage.py14
-rw-r--r--mediagoblin/submit/__init__.py2
-rw-r--r--mediagoblin/submit/forms.py9
-rw-r--r--mediagoblin/submit/security.py2
-rw-r--r--mediagoblin/submit/views.py179
-rw-r--r--mediagoblin/templates/mediagoblin/404.html19
-rw-r--r--mediagoblin/templates/mediagoblin/auth/change_fp.html15
-rw-r--r--mediagoblin/templates/mediagoblin/auth/forgot_password.html11
-rw-r--r--mediagoblin/templates/mediagoblin/auth/login.html26
-rw-r--r--mediagoblin/templates/mediagoblin/auth/register.html9
-rw-r--r--mediagoblin/templates/mediagoblin/base.html56
-rw-r--r--mediagoblin/templates/mediagoblin/edit/attachments.html8
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit.html10
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit_account.html45
-rw-r--r--mediagoblin/templates/mediagoblin/edit/edit_profile.html8
-rw-r--r--mediagoblin/templates/mediagoblin/listings/tag.html19
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/ascii.html40
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/image.html (renamed from mediagoblin/middleware/__init__.py)7
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/video.html52
-rw-r--r--mediagoblin/templates/mediagoblin/root.html37
-rw-r--r--mediagoblin/templates/mediagoblin/submit/start.html6
-rw-r--r--mediagoblin/templates/mediagoblin/test_submit.html2
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/gallery.html43
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/media.html266
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html10
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/processing_panel.html6
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/user.html52
-rw-r--r--mediagoblin/templates/mediagoblin/utils/object_gallery.html12
-rw-r--r--mediagoblin/templates/mediagoblin/utils/pagination.html8
-rw-r--r--mediagoblin/templates/mediagoblin/utils/prev_next.html46
-rw-r--r--mediagoblin/templates/mediagoblin/utils/tags.html24
-rw-r--r--mediagoblin/templates/mediagoblin/utils/wtforms.html14
-rw-r--r--mediagoblin/templates/mediagoblin/webfinger/host-meta.xml27
-rw-r--r--mediagoblin/templates/mediagoblin/webfinger/xrd.xml27
-rw-r--r--mediagoblin/tests/test_auth.py73
-rw-r--r--mediagoblin/tests/test_celery_setup.py4
-rw-r--r--mediagoblin/tests/test_csrf_middleware.py21
-rw-r--r--mediagoblin/tests/test_edit.py95
-rw-r--r--mediagoblin/tests/test_mgoblin_app.ini6
-rw-r--r--mediagoblin/tests/test_migrations.py4
-rw-r--r--mediagoblin/tests/test_misc.py26
-rw-r--r--mediagoblin/tests/test_paste.ini2
-rw-r--r--mediagoblin/tests/test_storage.py27
-rw-r--r--mediagoblin/tests/test_submission.py49
-rw-r--r--mediagoblin/tests/test_tags.py9
-rw-r--r--mediagoblin/tests/test_tests.py6
-rw-r--r--mediagoblin/tests/tools.py64
-rw-r--r--mediagoblin/tools/common.py1
-rw-r--r--mediagoblin/tools/files.py2
-rw-r--r--mediagoblin/tools/mail.py7
-rw-r--r--mediagoblin/tools/pagination.py18
-rw-r--r--mediagoblin/tools/request.py12
-rw-r--r--mediagoblin/tools/response.py7
-rw-r--r--mediagoblin/tools/template.py23
-rw-r--r--mediagoblin/tools/text.py12
-rw-r--r--mediagoblin/tools/url.py2
-rw-r--r--mediagoblin/user_pages/__init__.py2
-rw-r--r--mediagoblin/user_pages/forms.py2
-rw-r--r--mediagoblin/user_pages/views.py88
-rw-r--r--mediagoblin/views.py3
-rw-r--r--mediagoblin/webfinger/__init__.py25
-rw-r--r--mediagoblin/webfinger/routing.py25
-rw-r--r--mediagoblin/webfinger/views.py117
-rw-r--r--mediagoblin/workbench.py9
188 files changed, 12707 insertions, 5013 deletions
diff --git a/mediagoblin/_version.py b/mediagoblin/_version.py
index df212faf..5e69f21a 100644
--- a/mediagoblin/_version.py
+++ b/mediagoblin/_version.py
@@ -14,4 +14,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-__version__ = "0.0.5"
+# valid version formats:
+# * x.y - final release
+# * x.ya1 - alpha 1
+# * x.yb1 - beta 1
+# * x.yrc1 - release candidate 1
+# * x.y.dev - dev
+
+# see http://www.python.org/dev/peps/pep-0386/
+
+__version__ = "0.3.0.dev"
diff --git a/mediagoblin/app.py b/mediagoblin/app.py
index d39469c3..96b2c8ab 100644
--- a/mediagoblin/app.py
+++ b/mediagoblin/app.py
@@ -20,7 +20,7 @@ import urllib
import routes
from webob import Request, exc
-from mediagoblin import routing, middleware
+from mediagoblin import routing, meddleware
from mediagoblin.tools import common, translate, template
from mediagoblin.tools.response import render_404
from mediagoblin.tools import request as mg_request
@@ -63,7 +63,7 @@ class MediaGoblinApp(object):
# Get the template environment
self.template_loader = get_jinja_loader(
- app_config.get('user_template_path'))
+ app_config.get('local_templates'))
# Set up storage systems
self.public_store, self.queue_store = setup_storage()
@@ -94,26 +94,19 @@ class MediaGoblinApp(object):
# object.
#######################################################
- setup_globals(app = self)
+ setup_globals(app=self)
# Workbench *currently* only used by celery, so this only
# matters in always eager mode :)
setup_workbench()
- # instantiate application middleware
- self.middleware = [common.import_component(m)(self)
- for m in middleware.ENABLED_MIDDLEWARE]
-
+ # instantiate application meddleware
+ self.meddleware = [common.import_component(m)(self)
+ for m in meddleware.ENABLED_MEDDLEWARE]
def __call__(self, environ, start_response):
request = Request(environ)
- # pass the request through our middleware classes
- for m in self.middleware:
- response = m.process_request(request)
- if response is not None:
- return response(environ, start_response)
-
## Routing / controller loading stuff
path_info = request.path_info
route_match = self.routing.match(path_info)
@@ -129,6 +122,11 @@ class MediaGoblinApp(object):
# The other option would be:
# request.full_path = environ["SCRIPT_URL"]
+ # Fix up environ for urlgen
+ # See bug: https://bitbucket.org/bbangert/routes/issue/55/cache_hostinfo-breaks-on-https-off
+ if environ.get('HTTPS', '').lower() == 'off':
+ environ.pop('HTTPS')
+
## Attach utilities to the request object
request.matchdict = route_match
request.urlgen = routes.URLGenerator(self.routing, environ)
@@ -165,13 +163,20 @@ class MediaGoblinApp(object):
return render_404(request)(environ, start_response)
controller = common.import_component(route_match['controller'])
+
+ # pass the request through our meddleware classes
+ for m in self.meddleware:
+ response = m.process_request(request, controller)
+ if response is not None:
+ return response(environ, start_response)
+
request.start_response = start_response
# get the response from the controller
response = controller(request)
- # pass the response through the middleware
- for m in self.middleware[::-1]:
+ # pass the response through the meddleware
+ for m in self.meddleware[::-1]:
m.process_response(request, response)
return response(environ, start_response)
diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py
index a932ad26..5a707c7b 100644
--- a/mediagoblin/auth/forms.py
+++ b/mediagoblin/auth/forms.py
@@ -29,15 +29,7 @@ class RegistrationForm(wtforms.Form):
password = wtforms.PasswordField(
_('Password'),
[wtforms.validators.Required(),
- wtforms.validators.Length(min=6, max=30),
- wtforms.validators.EqualTo(
- 'confirm_password',
- _('Passwords must match.'))])
- confirm_password = wtforms.PasswordField(
- _('Confirm password'),
- [wtforms.validators.Required()],
- description=_(
- u"Type it again here to make sure there are no spelling mistakes."))
+ wtforms.validators.Length(min=6, max=30)])
email = wtforms.TextField(
_('Email address'),
[wtforms.validators.Required(),
@@ -59,9 +51,10 @@ class ForgotPassForm(wtforms.Form):
'Username or email',
[wtforms.validators.Required()])
- def validate_username(form,field):
- if not (re.match(r'^\w+$',field.data) or
- re.match(r'^.+@[^.].*\.[a-z]{2,10}$',field.data, re.IGNORECASE)):
+ def validate_username(form, field):
+ if not (re.match(r'^\w+$', field.data) or
+ re.match(r'^.+@[^.].*\.[a-z]{2,10}$', field.data,
+ re.IGNORECASE)):
raise wtforms.ValidationError(u'Incorrect input')
@@ -69,17 +62,10 @@ class ChangePassForm(wtforms.Form):
password = wtforms.PasswordField(
'Password',
[wtforms.validators.Required(),
- wtforms.validators.Length(min=6, max=30),
- wtforms.validators.EqualTo(
- 'confirm_password',
- 'Passwords must match.')])
- confirm_password = wtforms.PasswordField(
- 'Confirm password',
- [wtforms.validators.Required()])
+ wtforms.validators.Length(min=6, max=30)])
userid = wtforms.HiddenField(
'',
[wtforms.validators.Required()])
token = wtforms.HiddenField(
'',
[wtforms.validators.Required()])
-
diff --git a/mediagoblin/auth/lib.py b/mediagoblin/auth/lib.py
index 4c57ef88..c0af3b5b 100644
--- a/mediagoblin/auth/lib.py
+++ b/mediagoblin/auth/lib.py
@@ -94,6 +94,7 @@ EMAIL_VERIFICATION_TEMPLATE = (
u"http://{host}{uri}?"
u"userid={userid}&token={verification_key}")
+
def send_verification_email(user, request):
"""
Send the verification email to users to activate their accounts.
@@ -104,17 +105,17 @@ def send_verification_email(user, request):
"""
rendered_email = render_template(
request, 'mediagoblin/auth/verification_email.txt',
- {'username': user['username'],
+ {'username': user.username,
'verification_url': EMAIL_VERIFICATION_TEMPLATE.format(
host=request.host,
uri=request.urlgen('mediagoblin.auth.verify_email'),
- userid=unicode(user['_id']),
- verification_key=user['verification_key'])})
+ userid=unicode(user._id),
+ verification_key=user.verification_key)})
# TODO: There is no error handling in place
send_email(
mg_globals.app_config['email_sender_address'],
- [user['email']],
+ [user.email],
# TODO
# Due to the distributed nature of GNU MediaGoblin, we should
# find a way to send some additional information about the
@@ -128,6 +129,7 @@ EMAIL_FP_VERIFICATION_TEMPLATE = (
u"http://{host}{uri}?"
u"userid={userid}&token={fp_verification_key}")
+
def send_fp_verification_email(user, request):
"""
Send the verification email to users to change their password.
@@ -138,17 +140,16 @@ def send_fp_verification_email(user, request):
"""
rendered_email = render_template(
request, 'mediagoblin/auth/fp_verification_email.txt',
- {'username': user['username'],
+ {'username': user.username,
'verification_url': EMAIL_FP_VERIFICATION_TEMPLATE.format(
host=request.host,
uri=request.urlgen('mediagoblin.auth.verify_forgot_password'),
- userid=unicode(user['_id']),
- fp_verification_key=user['fp_verification_key'])})
+ userid=unicode(user._id),
+ fp_verification_key=user.fp_verification_key)})
# TODO: There is no error handling in place
send_email(
mg_globals.app_config['email_sender_address'],
- [user['email']],
+ [user.email],
'GNU MediaGoblin - Change forgotten password!',
rendered_email)
-
diff --git a/mediagoblin/auth/routing.py b/mediagoblin/auth/routing.py
index 912d89fa..ea9388c5 100644
--- a/mediagoblin/auth/routing.py
+++ b/mediagoblin/auth/routing.py
@@ -33,13 +33,6 @@ auth_routes = [
controller='mediagoblin.views:simple_template_render'),
Route('mediagoblin.auth.forgot_password', '/forgot_password/',
controller='mediagoblin.auth.views:forgot_password'),
- Route('mediagoblin.auth.verify_forgot_password', '/forgot_password/verify/',
- controller='mediagoblin.auth.views:verify_forgot_password'),
- Route('mediagoblin.auth.fp_changed_success',
- '/forgot_password/changed_success/',
- template='mediagoblin/auth/fp_changed_success.html',
- controller='mediagoblin.views:simple_template_render'),
- Route('mediagoblin.auth.fp_email_sent',
- '/forgot_password/email_sent/',
- template='mediagoblin/auth/fp_email_sent.html',
- controller='mediagoblin.views:simple_template_render')]
+ Route('mediagoblin.auth.verify_forgot_password',
+ '/forgot_password/verify/',
+ controller='mediagoblin.auth.views:verify_forgot_password')]
diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py
index 2a670679..c04a49a7 100644
--- a/mediagoblin/auth/views.py
+++ b/mediagoblin/auth/views.py
@@ -74,20 +74,21 @@ def register(request):
extra_validation_passes = False
if users_with_email:
register_form.email.errors.append(
- _(u'Sorry, that email address has already been taken.'))
+ _(u'Sorry, a user with that email address already exists.'))
extra_validation_passes = False
if extra_validation_passes:
# Create the user
user = request.db.User()
- user['username'] = username
- user['email'] = email
- user['pw_hash'] = auth_lib.bcrypt_gen_password_hash(
+ user.username = username
+ user.email = email
+ user.pw_hash = auth_lib.bcrypt_gen_password_hash(
request.POST['password'])
+ user.verification_key = unicode(uuid.uuid4())
user.save(validate=True)
# log the user in
- request.session['user_id'] = unicode(user['_id'])
+ request.session['user_id'] = unicode(user._id)
request.session.save()
# send verification email
@@ -98,7 +99,7 @@ def register(request):
# message waiting for them to verify their email
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=user['username'])
+ user=user.username)
return render_to_response(
request,
@@ -122,7 +123,7 @@ def login(request):
if user and user.check_login(request.POST['password']):
# set up login in session
- request.session['user_id'] = unicode(user['_id'])
+ request.session['user_id'] = unicode(user._id)
request.session.save()
if request.POST.get('next'):
@@ -160,16 +161,16 @@ def verify_email(request):
you are lucky :)
"""
# If we don't have userid and token parameters, we can't do anything; 404
- if not request.GET.has_key('userid') or not request.GET.has_key('token'):
+ if not 'userid' in request.GET or not 'token' in request.GET:
return render_404(request)
user = request.db.User.find_one(
{'_id': ObjectId(unicode(request.GET['userid']))})
- if user and user['verification_key'] == unicode(request.GET['token']):
- user[u'status'] = u'active'
- user[u'email_verified'] = True
- user[u'verification_key'] = None
+ if user and user.verification_key == unicode(request.GET['token']):
+ user.status = u'active'
+ user.email_verified = True
+ user.verification_key = None
user.save()
@@ -186,7 +187,7 @@ def verify_email(request):
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=user['username'])
+ user=user.username)
def resend_activation(request):
@@ -195,9 +196,26 @@ def resend_activation(request):
Resend the activation email.
"""
- request.user[u'verification_key'] = unicode(uuid.uuid4())
- request.user.save()
+ if request.user is None:
+ messages.add_message(
+ request,
+ messages.ERROR,
+ _('You must be logged in so we know who to send the email to!'))
+
+ return redirect(request, 'mediagoblin.auth.login')
+
+ if request.user.email_verified:
+ messages.add_message(
+ request,
+ messages.ERROR,
+ _("You've already verified your email address!"))
+
+ return redirect(request, "mediagoblin.user_pages.user_home", user=request.user['username'])
+
+ request.user.verification_key = unicode(uuid.uuid4())
+ request.user.save()
+
email_debug_message(request)
send_verification_email(request.user, request)
@@ -207,23 +225,19 @@ def resend_activation(request):
_('Resent your verification email.'))
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=request.user['username'])
+ user=request.user.username)
def forgot_password(request):
"""
Forgot password view
- Sends an email whit an url to renew forgoten password
+ Sends an email with an url to renew forgotten password
"""
fp_form = auth_forms.ForgotPassForm(request.POST)
if request.method == 'POST' and fp_form.validate():
- # Here, so it doesn't depend on the actual mail being sent
- # and thus doesn't reveal, wether mail was sent.
- email_debug_message(request)
-
# '$or' not available till mongodb 1.5.3
user = request.db.User.find_one(
{'username': request.POST['username']})
@@ -232,13 +246,21 @@ def forgot_password(request):
{'email': request.POST['username']})
if user:
- if user['email_verified'] and user['status'] == 'active':
- user[u'fp_verification_key'] = unicode(uuid.uuid4())
- user[u'fp_token_expire'] = datetime.datetime.now() + \
+ if user.email_verified and user.status == 'active':
+ user.fp_verification_key = unicode(uuid.uuid4())
+ user.fp_token_expire = datetime.datetime.now() + \
datetime.timedelta(days=10)
user.save()
send_fp_verification_email(user, request)
+
+ messages.add_message(
+ request,
+ messages.INFO,
+ _("An email has been sent with instructions on how to "
+ "change your password."))
+ email_debug_message(request)
+
else:
# special case... we can't send the email because the
# username is inactive / hasn't verified their email
@@ -251,11 +273,14 @@ def forgot_password(request):
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=user['username'])
-
-
- # do not reveal whether or not there is a matching user, just move along
- return redirect(request, 'mediagoblin.auth.fp_email_sent')
+ user=user.username)
+ return redirect(request, 'mediagoblin.auth.login')
+ else:
+ messages.add_message(
+ request,
+ messages.WARNING,
+ _("Couldn't find someone with that username or email."))
+ return redirect(request, 'mediagoblin.auth.forgot_password')
return render_to_response(
request,
@@ -285,21 +310,25 @@ def verify_forgot_password(request):
return render_404(request)
# check if we have a real user and correct token
- if ((user and user['fp_verification_key'] and
- user['fp_verification_key'] == unicode(formdata_token) and
- datetime.datetime.now() < user['fp_token_expire']
- and user['email_verified'] and user['status'] == 'active')):
+ if ((user and user.fp_verification_key and
+ user.fp_verification_key == unicode(formdata_token) and
+ datetime.datetime.now() < user.fp_token_expire
+ and user.email_verified and user.status == 'active')):
cp_form = auth_forms.ChangePassForm(formdata_vars)
if request.method == 'POST' and cp_form.validate():
- user[u'pw_hash'] = auth_lib.bcrypt_gen_password_hash(
+ user.pw_hash = auth_lib.bcrypt_gen_password_hash(
request.POST['password'])
- user[u'fp_verification_key'] = None
- user[u'fp_token_expire'] = None
+ user.fp_verification_key = None
+ user.fp_token_expire = None
user.save()
- return redirect(request, 'mediagoblin.auth.fp_changed_success')
+ messages.add_message(
+ request,
+ messages.INFO,
+ _("You can now log in using your new password."))
+ return redirect(request, 'mediagoblin.auth.login')
else:
return render_to_response(
request,
@@ -328,6 +357,6 @@ def _process_for_token(request):
formdata = {
'vars': formdata_vars,
'has_userid_and_token':
- formdata_vars.has_key('userid') and formdata_vars.has_key('token')}
+ 'userid' in formdata_vars and 'token' in formdata_vars}
return formdata
diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini
index 900957ce..eb22bc1b 100644
--- a/mediagoblin/config_spec.ini
+++ b/mediagoblin/config_spec.ini
@@ -1,14 +1,18 @@
[mediagoblin]
+# HTML title of the pages
+html_title = string(default="GNU MediaGoblin")
+
+# Enabled media types
+media_types = string_list(default=list("mediagoblin.media_types.image"))
+
# database stuff
db_host = string()
db_name = string(default="mediagoblin")
db_port = integer()
-
# Where temporary files used in processing and etc are kept
workbench_path = string(default="%(here)s/user_dev/media/workbench")
-
# Where mediagoblin-builtin static assets are kept
direct_remote_path = string(default="/mgoblin_static/")
@@ -24,9 +28,11 @@ email_smtp_pass = string(default=None)
allow_registration = boolean(default=True)
# tag parsing
-tags_delimiter = string(default=",")
tags_max_length = integer(default=50)
+# Whether comments are ascending or descending
+comments_ascending = boolean(default=True)
+
# By default not set, but you might want something like:
# "%(here)s/user_dev/templates/"
local_templates = string()
@@ -44,6 +50,7 @@ allow_attachments = boolean(default=False)
# Cookie stuff
csrf_cookie_name = string(default='mediagoblin_csrftoken')
+
[storage:publicstore]
storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage")
base_dir = string(default="%(here)s/user_dev/media/public")
@@ -54,6 +61,11 @@ storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage
base_dir = string(default="%(here)s/user_dev/media/queue")
+# Should we keep the original file?
+[media_type:mediagoblin.media_types.video]
+keep_original = boolean(default=False)
+
+
[beaker.cache]
type = string(default="file")
data_dir = string(default="%(here)s/user_dev/beaker/cache/data")
diff --git a/mediagoblin/db/__init__.py b/mediagoblin/db/__init__.py
index c5124b1a..27e8a90f 100644
--- a/mediagoblin/db/__init__.py
+++ b/mediagoblin/db/__init__.py
@@ -23,7 +23,7 @@ Database Abstraction/Wrapper Layer
pymongo. Read beow for why, but note that nobody is actually doing
this and there's no proof that we'll ever support more than
MongoDB... it would be a huge amount of work to do so.
-
+
If you really want to prove that possible, jump on IRC and talk to
us about making such a branch. In the meanwhile, it doesn't hurt to
have things as they are... if it ever makes it hard for us to
diff --git a/mediagoblin/db/mixin.py b/mediagoblin/db/mixin.py
new file mode 100644
index 00000000..5145289e
--- /dev/null
+++ b/mediagoblin/db/mixin.py
@@ -0,0 +1,92 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011,2012 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+This module contains some Mixin classes for the db objects.
+
+A bunch of functions on the db objects are really more like
+"utility functions": They could live outside the classes
+and be called "by hand" passing the appropiate reference.
+They usually only use the public API of the object and
+rarely use database related stuff.
+
+These functions now live here and get "mixed in" into the
+real objects.
+"""
+
+from mediagoblin.auth import lib as auth_lib
+from mediagoblin.tools import common
+
+
+class UserMixin(object):
+ def check_login(self, password):
+ """
+ See if a user can login with this password
+ """
+ return auth_lib.bcrypt_check_password(
+ password, self.pw_hash)
+
+
+class MediaEntryMixin(object):
+ def get_display_media(self, media_map,
+ fetch_order=common.DISPLAY_IMAGE_FETCHING_ORDER):
+ """
+ Find the best media for display.
+
+ Args:
+ - media_map: a dict like
+ {u'image_size': [u'dir1', u'dir2', u'image.jpg']}
+ - fetch_order: the order we should try fetching images in
+
+ Returns:
+ (media_size, media_path)
+ """
+ media_sizes = media_map.keys()
+
+ for media_size in common.DISPLAY_IMAGE_FETCHING_ORDER:
+ if media_size in media_sizes:
+ return media_map[media_size]
+
+ def main_mediafile(self):
+ pass
+
+ def url_for_self(self, urlgen, **extra_args):
+ """
+ Generate an appropriate url for ourselves
+
+ Use a slug if we have one, else use our '_id'.
+ """
+ uploader = self.get_uploader
+
+ if self.get('slug'):
+ return urlgen(
+ 'mediagoblin.user_pages.media_home',
+ user=uploader.username,
+ media=self.slug,
+ **extra_args)
+ else:
+ return urlgen(
+ 'mediagoblin.user_pages.media_home',
+ user=uploader.username,
+ media=unicode(self._id),
+ **extra_args)
+
+ def get_fail_exception(self):
+ """
+ Get the exception that's appropriate for this error
+ """
+ if self['fail_error']:
+ return common.import_component(self['fail_error'])
diff --git a/mediagoblin/templates/mediagoblin/auth/fp_changed_success.html b/mediagoblin/db/mongo/__init__.py
index 7cea312d..ba347c69 100644
--- a/mediagoblin/templates/mediagoblin/auth/fp_changed_success.html
+++ b/mediagoblin/db/mongo/__init__.py
@@ -1,6 +1,5 @@
-{#
# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 Free Software Foundation, Inc
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -14,14 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#}
-{% extends "mediagoblin/base.html" %}
-
-{% block mediagoblin_content %}
- <p>
- {% trans -%}
- Your password has been changed. Try to log in now.
- {%- endtrans %}
- </p>
-{% endblock %}
-
diff --git a/mediagoblin/db/indexes.py b/mediagoblin/db/mongo/indexes.py
index 75394a31..1dd73f2b 100644
--- a/mediagoblin/db/indexes.py
+++ b/mediagoblin/db/mongo/indexes.py
@@ -93,8 +93,9 @@ MEDIAENTRY_INDEXES = {
('created', DESCENDING)]},
'state_uploader_tags_created': {
- # Indexing on processed?, media uploader, associated tags, and timestamp
- # Used for showing media items matching a tag search, most recent first.
+ # Indexing on processed?, media uploader, associated tags, and
+ # timestamp Used for showing media items matching a tag
+ # search, most recent first.
'index': [('state', ASCENDING),
('uploader', ASCENDING),
('tags.slug', DESCENDING),
diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/mongo/migrations.py
index edaf5630..cf4e94ae 100644
--- a/mediagoblin/db/migrations.py
+++ b/mediagoblin/db/mongo/migrations.py
@@ -14,7 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from mediagoblin.db.util import RegisterMigration
+from mediagoblin.db.mongo.util import RegisterMigration
from mediagoblin.tools.text import cleaned_markdown_conversion
@@ -100,3 +100,11 @@ def user_add_forgot_password_token_and_expires(database):
"""
add_table_field(database, 'users', 'fp_verification_key', None)
add_table_field(database, 'users', 'fp_token_expire', None)
+
+
+@RegisterMigration(7)
+def media_type_image_to_multimedia_type_image(database):
+ database['media_entries'].update(
+ {'media_type': 'image'},
+ {'$set': {'media_type': 'mediagoblin.media_types.image'}},
+ multi=True)
diff --git a/mediagoblin/db/models.py b/mediagoblin/db/mongo/models.py
index e085840e..e085840e 100644
--- a/mediagoblin/db/models.py
+++ b/mediagoblin/db/mongo/models.py
diff --git a/mediagoblin/db/mongo/open.py b/mediagoblin/db/mongo/open.py
new file mode 100644
index 00000000..48c909d9
--- /dev/null
+++ b/mediagoblin/db/mongo/open.py
@@ -0,0 +1,78 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import pymongo
+import mongokit
+from paste.deploy.converters import asint
+from mediagoblin.db.mongo import models
+from mediagoblin.db.mongo.util import MigrationManager
+
+
+def connect_database_from_config(app_config, use_pymongo=False):
+ """
+ Connect to the main database, take config from app_config
+
+ Optionally use pymongo instead of mongokit for the connection.
+ """
+ port = app_config.get('db_port')
+ if port:
+ port = asint(port)
+
+ if use_pymongo:
+ connection = pymongo.Connection(
+ app_config.get('db_host'), port)
+ else:
+ connection = mongokit.Connection(
+ app_config.get('db_host'), port)
+ return connection
+
+
+def setup_connection_and_db_from_config(app_config, use_pymongo=False):
+ """
+ Setup connection and database from config.
+
+ Optionally use pymongo instead of mongokit.
+ """
+ connection = connect_database_from_config(app_config, use_pymongo)
+ database_path = app_config['db_name']
+ db = connection[database_path]
+
+ if not use_pymongo:
+ models.register_models(connection)
+
+ return (connection, db)
+
+
+def check_db_migrations_current(db):
+ # This MUST be imported so as to set up the appropriate migrations!
+ from mediagoblin.db.mongo import migrations
+
+ # Init the migration number if necessary
+ migration_manager = MigrationManager(db)
+ migration_manager.install_migration_version_if_missing()
+
+ # Tiny hack to warn user if our migration is out of date
+ if not migration_manager.database_at_latest_migration():
+ db_migration_num = migration_manager.database_current_migration()
+ latest_migration_num = migration_manager.latest_migration()
+ if db_migration_num < latest_migration_num:
+ print (
+ "*WARNING:* Your migrations are out of date, "
+ "maybe run ./bin/gmg migrate?")
+ elif db_migration_num > latest_migration_num:
+ print (
+ "*WARNING:* Your migrations are out of date... "
+ "in fact they appear to be from the future?!")
diff --git a/mediagoblin/db/mongo/util.py b/mediagoblin/db/mongo/util.py
new file mode 100644
index 00000000..e2065693
--- /dev/null
+++ b/mediagoblin/db/mongo/util.py
@@ -0,0 +1,292 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Utilities for database operations.
+
+Some note on migration and indexing tools:
+
+We store information about what the state of the database is in the
+'mediagoblin' document of the 'app_metadata' collection. Keys in that
+document relevant to here:
+
+ - 'migration_number': The integer representing the current state of
+ the migrations
+"""
+
+import copy
+
+# Imports that other modules might use
+from pymongo import ASCENDING, DESCENDING
+from pymongo.errors import InvalidId
+from mongokit import ObjectId
+
+from mediagoblin.db.mongo.indexes import ACTIVE_INDEXES, DEPRECATED_INDEXES
+
+
+################
+# Indexing tools
+################
+
+
+def add_new_indexes(database, active_indexes=ACTIVE_INDEXES):
+ """
+ Add any new indexes to the database.
+
+ Args:
+ - database: pymongo or mongokit database instance.
+ - active_indexes: indexes to possibly add in the pattern of:
+ {'collection_name': {
+ 'identifier': {
+ 'index': [index_foo_goes_here],
+ 'unique': True}}
+ where 'index' is the index to add and all other options are
+ arguments for collection.create_index.
+
+ Returns:
+ A list of indexes added in form ('collection', 'index_name')
+ """
+ indexes_added = []
+
+ for collection_name, indexes in active_indexes.iteritems():
+ collection = database[collection_name]
+ collection_indexes = collection.index_information().keys()
+
+ for index_name, index_data in indexes.iteritems():
+ if not index_name in collection_indexes:
+ # Get a copy actually so we don't modify the actual
+ # structure
+ index_data = copy.copy(index_data)
+ index = index_data.pop('index')
+ collection.create_index(
+ index, name=index_name, **index_data)
+
+ indexes_added.append((collection_name, index_name))
+
+ return indexes_added
+
+
+def remove_deprecated_indexes(database, deprecated_indexes=DEPRECATED_INDEXES):
+ """
+ Remove any deprecated indexes from the database.
+
+ Args:
+ - database: pymongo or mongokit database instance.
+ - deprecated_indexes: the indexes to deprecate in the pattern of:
+ {'collection_name': {
+ 'identifier': {
+ 'index': [index_foo_goes_here],
+ 'unique': True}}
+
+ (... although we really only need the 'identifier' here, as the
+ rest of the information isn't used in this case. But it's kept
+ around so we can remember what it was)
+
+ Returns:
+ A list of indexes removed in form ('collection', 'index_name')
+ """
+ indexes_removed = []
+
+ for collection_name, indexes in deprecated_indexes.iteritems():
+ collection = database[collection_name]
+ collection_indexes = collection.index_information().keys()
+
+ for index_name, index_data in indexes.iteritems():
+ if index_name in collection_indexes:
+ collection.drop_index(index_name)
+
+ indexes_removed.append((collection_name, index_name))
+
+ return indexes_removed
+
+
+#################
+# Migration tools
+#################
+
+# The default migration registry...
+#
+# Don't set this yourself! RegisterMigration will automatically fill
+# this with stuff via decorating methods in migrations.py
+
+class MissingCurrentMigration(Exception):
+ pass
+
+
+MIGRATIONS = {}
+
+
+class RegisterMigration(object):
+ """
+ Tool for registering migrations
+
+ Call like:
+
+ @RegisterMigration(33)
+ def update_dwarves(database):
+ [...]
+
+ This will register your migration with the default migration
+ registry. Alternately, to specify a very specific
+ migration_registry, you can pass in that as the second argument.
+
+ Note, the number of your migration should NEVER be 0 or less than
+ 0. 0 is the default "no migrations" state!
+ """
+ def __init__(self, migration_number, migration_registry=MIGRATIONS):
+ assert migration_number > 0, "Migration number must be > 0!"
+ assert migration_number not in migration_registry, \
+ "Duplicate migration numbers detected! That's not allowed!"
+
+ self.migration_number = migration_number
+ self.migration_registry = migration_registry
+
+ def __call__(self, migration):
+ self.migration_registry[self.migration_number] = migration
+ return migration
+
+
+class MigrationManager(object):
+ """
+ Migration handling tool.
+
+ Takes information about a database, lets you update the database
+ to the latest migrations, etc.
+ """
+ def __init__(self, database, migration_registry=MIGRATIONS):
+ """
+ Args:
+ - database: database we're going to migrate
+ - migration_registry: where we should find all migrations to
+ run
+ """
+ self.database = database
+ self.migration_registry = migration_registry
+ self._sorted_migrations = None
+
+ def _ensure_current_migration_record(self):
+ """
+ If there isn't a database[u'app_metadata'] mediagoblin entry
+ with the 'current_migration', throw an error.
+ """
+ if self.database_current_migration() is None:
+ raise MissingCurrentMigration(
+ "Tried to call function which requires "
+ "'current_migration' set in database")
+
+ @property
+ def sorted_migrations(self):
+ """
+ Sort migrations if necessary and store in self._sorted_migrations
+ """
+ if not self._sorted_migrations:
+ self._sorted_migrations = sorted(
+ self.migration_registry.items(),
+ # sort on the key... the migration number
+ key=lambda migration_tuple: migration_tuple[0])
+
+ return self._sorted_migrations
+
+ def latest_migration(self):
+ """
+ Return a migration number for the latest migration, or 0 if
+ there are no migrations.
+ """
+ if self.sorted_migrations:
+ return self.sorted_migrations[-1][0]
+ else:
+ # If no migrations have been set, we start at 0.
+ return 0
+
+ def set_current_migration(self, migration_number):
+ """
+ Set the migration in the database to migration_number
+ """
+ # Add the mediagoblin migration if necessary
+ self.database[u'app_metadata'].update(
+ {u'_id': u'mediagoblin'},
+ {u'$set': {u'current_migration': migration_number}},
+ upsert=True)
+
+ def install_migration_version_if_missing(self):
+ """
+ Sets the migration to the latest version if no migration
+ version at all is set.
+ """
+ mgoblin_metadata = self.database[u'app_metadata'].find_one(
+ {u'_id': u'mediagoblin'})
+ if not mgoblin_metadata:
+ latest_migration = self.latest_migration()
+ self.set_current_migration(latest_migration)
+
+ def database_current_migration(self):
+ """
+ Return the current migration in the database.
+ """
+ mgoblin_metadata = self.database[u'app_metadata'].find_one(
+ {u'_id': u'mediagoblin'})
+ if not mgoblin_metadata:
+ return None
+ else:
+ return mgoblin_metadata[u'current_migration']
+
+ def database_at_latest_migration(self):
+ """
+ See if the database is at the latest migration.
+ Returns a boolean.
+ """
+ current_migration = self.database_current_migration()
+ return current_migration == self.latest_migration()
+
+ def migrations_to_run(self):
+ """
+ Get a list of migrations to run still, if any.
+
+ Note that calling this will set your migration version to the
+ latest version if it isn't installed to anything yet!
+ """
+ self._ensure_current_migration_record()
+
+ db_current_migration = self.database_current_migration()
+
+ return [
+ (migration_number, migration_func)
+ for migration_number, migration_func in self.sorted_migrations
+ if migration_number > db_current_migration]
+
+ def migrate_new(self, pre_callback=None, post_callback=None):
+ """
+ Run all migrations.
+
+ Includes two optional args:
+ - pre_callback: if called, this is a callback on something to
+ run pre-migration. Takes (migration_number, migration_func)
+ as arguments
+ - pre_callback: if called, this is a callback on something to
+ run post-migration. Takes (migration_number, migration_func)
+ as arguments
+ """
+ # If we aren't set to any version number, presume we're at the
+ # latest (which means we'll do nothing here...)
+ self.install_migration_version_if_missing()
+
+ for migration_number, migration_func in self.migrations_to_run():
+ if pre_callback:
+ pre_callback(migration_number, migration_func)
+ migration_func(self.database)
+ self.set_current_migration(migration_number)
+ if post_callback:
+ post_callback(migration_number, migration_func)
diff --git a/mediagoblin/db/open.py b/mediagoblin/db/open.py
index e73b6258..32827fcb 100644
--- a/mediagoblin/db/open.py
+++ b/mediagoblin/db/open.py
@@ -14,42 +14,5 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import pymongo
-import mongokit
-from paste.deploy.converters import asint
-from mediagoblin.db import models
-
-
-def connect_database_from_config(app_config, use_pymongo=False):
- """
- Connect to the main database, take config from app_config
-
- Optionally use pymongo instead of mongokit for the connection.
- """
- port = app_config.get('db_port')
- if port:
- port = asint(port)
-
- if use_pymongo:
- connection = pymongo.Connection(
- app_config.get('db_host'), port)
- else:
- connection = mongokit.Connection(
- app_config.get('db_host'), port)
- return connection
-
-
-def setup_connection_and_db_from_config(app_config, use_pymongo=False):
- """
- Setup connection and database from config.
-
- Optionally use pymongo instead of mongokit.
- """
- connection = connect_database_from_config(app_config, use_pymongo)
- database_path = app_config['db_name']
- db = connection[database_path]
-
- if not use_pymongo:
- models.register_models(connection)
-
- return (connection, db)
+from mediagoblin.db.mongo.open import \
+ setup_connection_and_db_from_config, check_db_migrations_current
diff --git a/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html b/mediagoblin/db/sql/__init__.py
index 69aac6b3..ba347c69 100644
--- a/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html
+++ b/mediagoblin/db/sql/__init__.py
@@ -1,6 +1,5 @@
-{#
# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 Free Software Foundation, Inc
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -14,15 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#}
-{% extends "mediagoblin/base.html" %}
-
-{% block mediagoblin_content %}
- <p>
- {% trans -%}
- Check your inbox. We sent an email with a URL for changing your password.
- {%- endtrans %}
- </p>
-
-{% endblock %}
-
diff --git a/mediagoblin/db/sql/base.py b/mediagoblin/db/sql/base.py
new file mode 100644
index 00000000..40140327
--- /dev/null
+++ b/mediagoblin/db/sql/base.py
@@ -0,0 +1,38 @@
+from sqlalchemy.orm import scoped_session, sessionmaker, object_session
+
+
+Session = scoped_session(sessionmaker())
+
+
+def _fix_query_dict(query_dict):
+ if '_id' in query_dict:
+ query_dict['id'] = query_dict.pop('_id')
+
+
+class GMGTableBase(object):
+ query = Session.query_property()
+
+ @classmethod
+ def find(cls, query_dict={}):
+ _fix_query_dict(query_dict)
+ return cls.query.filter_by(**query_dict)
+
+ @classmethod
+ def find_one(cls, query_dict={}):
+ _fix_query_dict(query_dict)
+ return cls.query.filter_by(**query_dict).first()
+
+ @classmethod
+ def one(cls, query_dict):
+ return cls.find(query_dict).one()
+
+ def get(self, key):
+ return getattr(self, key)
+
+ def save(self, validate = True):
+ assert validate
+ sess = object_session(self)
+ if sess is None:
+ sess = Session()
+ sess.add(self)
+ sess.commit()
diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py
new file mode 100644
index 00000000..88614fd4
--- /dev/null
+++ b/mediagoblin/db/sql/convert.py
@@ -0,0 +1,151 @@
+from mediagoblin.init import setup_global_and_app_config, setup_database
+from mediagoblin.db.mongo.util import ObjectId
+
+from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment,
+ Tag, MediaTag, MediaFile)
+from mediagoblin.db.sql.open import setup_connection_and_db_from_config as \
+ sql_connect
+from mediagoblin.db.mongo.open import setup_connection_and_db_from_config as \
+ mongo_connect
+from mediagoblin.db.sql.base import Session
+
+
+obj_id_table = dict()
+
+def add_obj_ids(entry, new_entry):
+ global obj_id_table
+ print "%r -> %r" % (entry._id, new_entry.id)
+ obj_id_table[entry._id] = new_entry.id
+
+
+def copy_attrs(entry, new_entry, attr_list):
+ for a in attr_list:
+ val = entry[a]
+ setattr(new_entry, a, val)
+
+def copy_reference_attr(entry, new_entry, ref_attr):
+ val = entry[ref_attr]
+ val = obj_id_table[val]
+ setattr(new_entry, ref_attr, val)
+
+
+def convert_users(mk_db):
+ session = Session()
+
+ for entry in mk_db.User.find():
+ print entry.username
+
+ new_entry = User()
+ copy_attrs(entry, new_entry,
+ ('username', 'email', 'created', 'pw_hash', 'email_verified',
+ 'status', 'verification_key', 'is_admin', 'url',
+ 'bio', 'bio_html',
+ 'fp_verification_key', 'fp_token_expire',))
+ # new_entry.fp_verification_expire = entry.fp_token_expire
+
+ session.add(new_entry)
+ session.flush()
+ add_obj_ids(entry, new_entry)
+
+ session.commit()
+ session.close()
+
+
+def convert_media_entries(mk_db):
+ session = Session()
+
+ for entry in mk_db.MediaEntry.find():
+ print repr(entry.title)
+
+ new_entry = MediaEntry()
+ copy_attrs(entry, new_entry,
+ ('title', 'slug', 'created',
+ 'description', 'description_html',
+ 'media_type', 'state',
+ 'fail_error',
+ 'queued_task_id',))
+ copy_reference_attr(entry, new_entry, "uploader")
+
+ session.add(new_entry)
+ session.flush()
+ add_obj_ids(entry, new_entry)
+
+ for key, value in entry.media_files.iteritems():
+ new_file = MediaFile(name=key, file_path=value)
+ new_file.media_entry = new_entry.id
+ Session.add(new_file)
+
+ session.commit()
+ session.close()
+
+
+def convert_media_tags(mk_db):
+ session = Session()
+ session.autoflush = False
+
+ for media in mk_db.MediaEntry.find():
+ print repr(media.title)
+
+ for otag in media.tags:
+ print " ", repr((otag["slug"], otag["name"]))
+
+ nslug = session.query(Tag).filter_by(slug=otag["slug"]).first()
+ print " ", repr(nslug)
+ if nslug is None:
+ nslug = Tag(slug=otag["slug"])
+ session.add(nslug)
+ session.flush()
+ print " ", repr(nslug), nslug.id
+
+ ntag = MediaTag()
+ ntag.tag = nslug.id
+ ntag.name = otag["name"]
+ ntag.media_entry = obj_id_table[media._id]
+ session.add(ntag)
+
+ session.commit()
+ session.close()
+
+
+def convert_media_comments(mk_db):
+ session = Session()
+
+ for entry in mk_db.MediaComment.find():
+ print repr(entry.content)
+
+ new_entry = MediaComment()
+ copy_attrs(entry, new_entry,
+ ('created',
+ 'content', 'content_html',))
+ copy_reference_attr(entry, new_entry, "media_entry")
+ copy_reference_attr(entry, new_entry, "author")
+
+ session.add(new_entry)
+ session.flush()
+ add_obj_ids(entry, new_entry)
+
+ session.commit()
+ session.close()
+
+
+def main():
+ global_config, app_config = setup_global_and_app_config("mediagoblin.ini")
+
+ sql_conn, sql_db = sql_connect({'sql_engine': 'sqlite:///mediagoblin.db'})
+
+ mk_conn, mk_db = mongo_connect(app_config)
+
+ Base.metadata.create_all(sql_db.engine)
+
+ convert_users(mk_db)
+ Session.remove()
+ convert_media_entries(mk_db)
+ Session.remove()
+ convert_media_tags(mk_db)
+ Session.remove()
+ convert_media_comments(mk_db)
+ Session.remove()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/mediagoblin/db/sql/extratypes.py b/mediagoblin/db/sql/extratypes.py
new file mode 100644
index 00000000..88f556d9
--- /dev/null
+++ b/mediagoblin/db/sql/extratypes.py
@@ -0,0 +1,18 @@
+from sqlalchemy.types import TypeDecorator, Unicode
+
+
+class PathTupleWithSlashes(TypeDecorator):
+ "Represents a Tuple of strings as a slash separated string."
+
+ impl = Unicode
+
+ def process_bind_param(self, value, dialect):
+ if value is not None:
+ assert len(value), "Does not support empty lists"
+ value = '/'.join(value)
+ return value
+
+ def process_result_value(self, value, dialect):
+ if value is not None:
+ value = tuple(value.split('/'))
+ return value
diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py
new file mode 100644
index 00000000..91092f33
--- /dev/null
+++ b/mediagoblin/db/sql/models.py
@@ -0,0 +1,153 @@
+import datetime
+
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import (
+ Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey,
+ UniqueConstraint)
+from sqlalchemy.orm import relationship
+from sqlalchemy.orm.collections import attribute_mapped_collection
+from sqlalchemy.ext.associationproxy import association_proxy
+
+from mediagoblin.db.sql.extratypes import PathTupleWithSlashes
+from mediagoblin.db.sql.base import GMGTableBase
+from mediagoblin.db.mixin import UserMixin, MediaEntryMixin
+
+
+Base = declarative_base(cls=GMGTableBase)
+
+
+class SimpleFieldAlias(object):
+ """An alias for any field"""
+ def __init__(self, fieldname):
+ self.fieldname = fieldname
+
+ def __get__(self, instance, cls):
+ return getattr(instance, self.fieldname)
+
+ def __set__(self, instance, val):
+ setattr(instance, self.fieldname, val)
+
+
+class User(Base, UserMixin):
+ __tablename__ = "users"
+
+ id = Column(Integer, primary_key=True)
+ username = Column(Unicode, nullable=False, unique=True)
+ email = Column(Unicode, nullable=False)
+ created = Column(DateTime, nullable=False, default=datetime.datetime.now)
+ pw_hash = Column(Unicode, nullable=False)
+ email_verified = Column(Boolean)
+ status = Column(Unicode, default=u"needs_email_verification", nullable=False)
+ verification_key = Column(Unicode)
+ is_admin = Column(Boolean, default=False, nullable=False)
+ url = Column(Unicode)
+ bio = Column(UnicodeText) # ??
+ bio_html = Column(UnicodeText) # ??
+ fp_verification_key = Column(Unicode)
+ fp_token_expire = Column(DateTime)
+
+ ## TODO
+ # plugin data would be in a separate model
+
+ _id = SimpleFieldAlias("id")
+
+
+class MediaEntry(Base, MediaEntryMixin):
+ __tablename__ = "media_entries"
+
+ id = Column(Integer, primary_key=True)
+ uploader = Column(Integer, ForeignKey('users.id'), nullable=False)
+ title = Column(Unicode, nullable=False)
+ slug = Column(Unicode, nullable=False)
+ created = Column(DateTime, nullable=False, default=datetime.datetime.now)
+ description = Column(UnicodeText) # ??
+ description_html = Column(UnicodeText) # ??
+ media_type = Column(Unicode, nullable=False)
+ state = Column(Unicode, nullable=False) # or use sqlalchemy.types.Enum?
+
+ fail_error = Column(Unicode)
+ fail_metadata = Column(UnicodeText)
+
+ queued_media_file = Column(PathTupleWithSlashes)
+
+ queued_task_id = Column(Unicode)
+
+ __table_args__ = (
+ UniqueConstraint('uploader', 'slug'),
+ {})
+
+ get_uploader = relationship(User)
+
+ media_files_helper = relationship("MediaFile",
+ collection_class=attribute_mapped_collection("name"),
+ cascade="all, delete-orphan"
+ )
+ media_files = association_proxy('media_files_helper', 'file_path',
+ creator=lambda k,v: MediaFile(name=k, file_path=v)
+ )
+
+ ## TODO
+ # media_data
+ # attachment_files
+ # fail_error
+
+
+class MediaFile(Base):
+ __tablename__ = "mediafiles"
+
+ media_entry = Column(
+ Integer, ForeignKey(MediaEntry.id),
+ nullable=False, primary_key=True)
+ name = Column(Unicode, primary_key=True)
+ file_path = Column(PathTupleWithSlashes)
+
+ def __repr__(self):
+ return "<MediaFile %s: %r>" % (self.name, self.file_path)
+
+
+class Tag(Base):
+ __tablename__ = "tags"
+
+ id = Column(Integer, primary_key=True)
+ slug = Column(Unicode, nullable=False, unique=True)
+
+
+class MediaTag(Base):
+ __tablename__ = "media_tags"
+
+ id = Column(Integer, primary_key=True)
+ tag = Column(Integer, ForeignKey('tags.id'), nullable=False)
+ name = Column(Unicode)
+ media_entry = Column(
+ Integer, ForeignKey('media_entries.id'),
+ nullable=False)
+ # created = Column(DateTime, nullable=False, default=datetime.datetime.now)
+
+ __table_args__ = (
+ UniqueConstraint('tag', 'media_entry'),
+ {})
+
+
+class MediaComment(Base):
+ __tablename__ = "media_comments"
+
+ id = Column(Integer, primary_key=True)
+ media_entry = Column(
+ Integer, ForeignKey('media_entries.id'), nullable=False)
+ author = Column(Integer, ForeignKey('users.id'), nullable=False)
+ created = Column(DateTime, nullable=False, default=datetime.datetime.now)
+ content = Column(UnicodeText, nullable=False)
+ content_html = Column(UnicodeText)
+
+ get_author = relationship(User)
+
+
+def show_table_init():
+ from sqlalchemy import create_engine
+ engine = create_engine('sqlite:///:memory:', echo=True)
+
+ Base.metadata.create_all(engine)
+
+
+if __name__ == '__main__':
+ show_table_init()
diff --git a/mediagoblin/db/sql/open.py b/mediagoblin/db/sql/open.py
new file mode 100644
index 00000000..c682bd3b
--- /dev/null
+++ b/mediagoblin/db/sql/open.py
@@ -0,0 +1,33 @@
+from sqlalchemy import create_engine
+
+from mediagoblin.db.sql.base import Session
+from mediagoblin.db.sql.models import Base
+
+
+class DatabaseMaster(object):
+ def __init__(self, engine):
+ self.engine = engine
+
+ for k,v in Base._decl_class_registry.iteritems():
+ setattr(self, k, v)
+
+ def commit(self):
+ Session.commit()
+
+ def save(self, obj):
+ Session.add(obj)
+ Session.flush()
+
+ def reset_after_request(self):
+ Session.remove()
+
+
+def setup_connection_and_db_from_config(app_config):
+ engine = create_engine(app_config['sql_engine'], echo=True)
+ Session.configure(bind=engine)
+
+ return "dummy conn", DatabaseMaster(engine)
+
+
+def check_db_migrations_current(db):
+ pass
diff --git a/mediagoblin/db/util.py b/mediagoblin/db/util.py
index 84a6cbce..1df9494c 100644
--- a/mediagoblin/db/util.py
+++ b/mediagoblin/db/util.py
@@ -14,278 +14,5 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-"""
-Utilities for database operations.
-
-Some note on migration and indexing tools:
-
-We store information about what the state of the database is in the
-'mediagoblin' document of the 'app_metadata' collection. Keys in that
-document relevant to here:
-
- - 'migration_number': The integer representing the current state of
- the migrations
-"""
-
-import copy
-
-# Imports that other modules might use
-from pymongo import ASCENDING, DESCENDING
-from pymongo.errors import InvalidId
-from mongokit import ObjectId
-
-from mediagoblin.db.indexes import ACTIVE_INDEXES, DEPRECATED_INDEXES
-
-
-################
-# Indexing tools
-################
-
-
-def add_new_indexes(database, active_indexes=ACTIVE_INDEXES):
- """
- Add any new indexes to the database.
-
- Args:
- - database: pymongo or mongokit database instance.
- - active_indexes: indexes to possibly add in the pattern of:
- {'collection_name': {
- 'identifier': {
- 'index': [index_foo_goes_here],
- 'unique': True}}
- where 'index' is the index to add and all other options are
- arguments for collection.create_index.
-
- Returns:
- A list of indexes added in form ('collection', 'index_name')
- """
- indexes_added = []
-
- for collection_name, indexes in active_indexes.iteritems():
- collection = database[collection_name]
- collection_indexes = collection.index_information().keys()
-
- for index_name, index_data in indexes.iteritems():
- if not index_name in collection_indexes:
- # Get a copy actually so we don't modify the actual
- # structure
- index_data = copy.copy(index_data)
- index = index_data.pop('index')
- collection.create_index(
- index, name=index_name, **index_data)
-
- indexes_added.append((collection_name, index_name))
-
- return indexes_added
-
-
-def remove_deprecated_indexes(database, deprecated_indexes=DEPRECATED_INDEXES):
- """
- Remove any deprecated indexes from the database.
-
- Args:
- - database: pymongo or mongokit database instance.
- - deprecated_indexes: the indexes to deprecate in the pattern of:
- {'collection_name': {
- 'identifier': {
- 'index': [index_foo_goes_here],
- 'unique': True}}
-
- (... although we really only need the 'identifier' here, as the
- rest of the information isn't used in this case. But it's kept
- around so we can remember what it was)
-
- Returns:
- A list of indexes removed in form ('collection', 'index_name')
- """
- indexes_removed = []
-
- for collection_name, indexes in deprecated_indexes.iteritems():
- collection = database[collection_name]
- collection_indexes = collection.index_information().keys()
-
- for index_name, index_data in indexes.iteritems():
- if index_name in collection_indexes:
- collection.drop_index(index_name)
-
- indexes_removed.append((collection_name, index_name))
-
- return indexes_removed
-
-
-#################
-# Migration tools
-#################
-
-# The default migration registry...
-#
-# Don't set this yourself! RegisterMigration will automatically fill
-# this with stuff via decorating methods in migrations.py
-
-class MissingCurrentMigration(Exception): pass
-
-
-MIGRATIONS = {}
-
-
-class RegisterMigration(object):
- """
- Tool for registering migrations
-
- Call like:
-
- @RegisterMigration(33)
- def update_dwarves(database):
- [...]
-
- This will register your migration with the default migration
- registry. Alternately, to specify a very specific
- migration_registry, you can pass in that as the second argument.
-
- Note, the number of your migration should NEVER be 0 or less than
- 0. 0 is the default "no migrations" state!
- """
- def __init__(self, migration_number, migration_registry=MIGRATIONS):
- assert migration_number > 0, "Migration number must be > 0!"
- assert not migration_registry.has_key(migration_number), \
- "Duplicate migration numbers detected! That's not allowed!"
-
- self.migration_number = migration_number
- self.migration_registry = migration_registry
-
- def __call__(self, migration):
- self.migration_registry[self.migration_number] = migration
- return migration
-
-
-class MigrationManager(object):
- """
- Migration handling tool.
-
- Takes information about a database, lets you update the database
- to the latest migrations, etc.
- """
- def __init__(self, database, migration_registry=MIGRATIONS):
- """
- Args:
- - database: database we're going to migrate
- - migration_registry: where we should find all migrations to
- run
- """
- self.database = database
- self.migration_registry = migration_registry
- self._sorted_migrations = None
-
- def _ensure_current_migration_record(self):
- """
- If there isn't a database[u'app_metadata'] mediagoblin entry
- with the 'current_migration', throw an error.
- """
- if self.database_current_migration() is None:
- raise MissingCurrentMigration(
- "Tried to call function which requires "
- "'current_migration' set in database")
-
- @property
- def sorted_migrations(self):
- """
- Sort migrations if necessary and store in self._sorted_migrations
- """
- if not self._sorted_migrations:
- self._sorted_migrations = sorted(
- self.migration_registry.items(),
- # sort on the key... the migration number
- key=lambda migration_tuple: migration_tuple[0])
-
- return self._sorted_migrations
-
- def latest_migration(self):
- """
- Return a migration number for the latest migration, or 0 if
- there are no migrations.
- """
- if self.sorted_migrations:
- return self.sorted_migrations[-1][0]
- else:
- # If no migrations have been set, we start at 0.
- return 0
-
- def set_current_migration(self, migration_number):
- """
- Set the migration in the database to migration_number
- """
- # Add the mediagoblin migration if necessary
- self.database[u'app_metadata'].update(
- {u'_id': u'mediagoblin'},
- {u'$set': {u'current_migration': migration_number}},
- upsert=True)
-
- def install_migration_version_if_missing(self):
- """
- Sets the migration to the latest version if no migration
- version at all is set.
- """
- mgoblin_metadata = self.database[u'app_metadata'].find_one(
- {u'_id': u'mediagoblin'})
- if not mgoblin_metadata:
- latest_migration = self.latest_migration()
- self.set_current_migration(latest_migration)
-
- def database_current_migration(self):
- """
- Return the current migration in the database.
- """
- mgoblin_metadata = self.database[u'app_metadata'].find_one(
- {u'_id': u'mediagoblin'})
- if not mgoblin_metadata:
- return None
- else:
- return mgoblin_metadata[u'current_migration']
-
- def database_at_latest_migration(self):
- """
- See if the database is at the latest migration.
- Returns a boolean.
- """
- current_migration = self.database_current_migration()
- return current_migration == self.latest_migration()
-
- def migrations_to_run(self):
- """
- Get a list of migrations to run still, if any.
-
- Note that calling this will set your migration version to the
- latest version if it isn't installed to anything yet!
- """
- self._ensure_current_migration_record()
-
- db_current_migration = self.database_current_migration()
-
- return [
- (migration_number, migration_func)
- for migration_number, migration_func in self.sorted_migrations
- if migration_number > db_current_migration]
-
- def migrate_new(self, pre_callback=None, post_callback=None):
- """
- Run all migrations.
-
- Includes two optional args:
- - pre_callback: if called, this is a callback on something to
- run pre-migration. Takes (migration_number, migration_func)
- as arguments
- - pre_callback: if called, this is a callback on something to
- run post-migration. Takes (migration_number, migration_func)
- as arguments
- """
- # If we aren't set to any version number, presume we're at the
- # latest (which means we'll do nothing here...)
- self.install_migration_version_if_missing()
-
- for migration_number, migration_func in self.migrations_to_run():
- if pre_callback:
- pre_callback(migration_number, migration_func)
- migration_func(self.database)
- self.set_current_migration(migration_number)
- if post_callback:
- post_callback(migration_number, migration_func)
+from mediagoblin.db.mongo.util import (ObjectId, InvalidId,
+ DESCENDING)
diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py
index 6431d67e..4cf14a70 100644
--- a/mediagoblin/decorators.py
+++ b/mediagoblin/decorators.py
@@ -40,7 +40,7 @@ def require_active_login(controller):
request.user.get('status') == u'needs_email_verification':
return redirect(
request, 'mediagoblin.user_pages.user_home',
- user=request.user['username'])
+ user=request.user.username)
elif not request.user or request.user.get('status') != u'active':
return exc.HTTPFound(
location="%s?next=%s" % (
@@ -57,10 +57,10 @@ def user_may_delete_media(controller):
Require user ownership of the MediaEntry to delete.
"""
def wrapper(request, *args, **kwargs):
- uploader = request.db.MediaEntry.find_one(
- {'_id': ObjectId(request.matchdict['media'])}).uploader()
- if not (request.user['is_admin'] or
- request.user['_id'] == uploader['_id']):
+ uploader_id = request.db.MediaEntry.find_one(
+ {'_id': ObjectId(request.matchdict['media'])}).uploader
+ if not (request.user.is_admin or
+ request.user._id == uploader_id):
return exc.HTTPForbidden()
return controller(request, *args, **kwargs)
@@ -95,11 +95,10 @@ def get_user_media_entry(controller):
if not user:
return render_404(request)
-
media = request.db.MediaEntry.find_one(
{'slug': request.matchdict['media'],
'state': 'processed',
- 'uploader': user['_id']})
+ 'uploader': user._id})
# no media via slug? Grab it via ObjectId
if not media:
@@ -107,7 +106,7 @@ def get_user_media_entry(controller):
media = request.db.MediaEntry.find_one(
{'_id': ObjectId(request.matchdict['media']),
'state': 'processed',
- 'uploader': user['_id']})
+ 'uploader': user._id})
except InvalidId:
return render_404(request)
@@ -119,6 +118,7 @@ def get_user_media_entry(controller):
return _make_safe(wrapper, controller)
+
def get_media_entry_by_id(controller):
"""
Pass in a MediaEntry based off of a url component
@@ -138,4 +138,3 @@ def get_media_entry_by_id(controller):
return controller(request, media=media, *args, **kwargs)
return _make_safe(wrapper, controller)
-
diff --git a/mediagoblin/edit/__init__.py b/mediagoblin/edit/__init__.py
index 576bd0f5..ba347c69 100644
--- a/mediagoblin/edit/__init__.py
+++ b/mediagoblin/edit/__init__.py
@@ -13,5 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py
index 3d1d9fd4..d49b9b28 100644
--- a/mediagoblin/edit/forms.py
+++ b/mediagoblin/edit/forms.py
@@ -24,15 +24,21 @@ class EditForm(wtforms.Form):
title = wtforms.TextField(
_('Title'),
[wtforms.validators.Length(min=0, max=500)])
- description = wtforms.TextAreaField('Description of this work')
+ description = wtforms.TextAreaField(
+ _('Description of this work'),
+ description=_("""You can use
+ <a href="http://daringfireball.net/projects/markdown/basics">
+ Markdown</a> for formatting."""))
tags = wtforms.TextField(
_('Tags'),
- [tag_length_validator])
+ [tag_length_validator],
+ description=_(
+ "Separate tags by commas."))
slug = wtforms.TextField(
_('Slug'),
[wtforms.validators.Required(message=_("The slug can't be empty"))],
description=_(
- "The title part of this media's URL. "
+ "The title part of this media's address. "
"You usually don't need to change this."))
license = wtforms.SelectField(
_('License'),
@@ -41,11 +47,27 @@ class EditForm(wtforms.Form):
class EditProfileForm(wtforms.Form):
bio = wtforms.TextAreaField(
_('Bio'),
- [wtforms.validators.Length(min=0, max=500)])
+ [wtforms.validators.Length(min=0, max=500)],
+ description=_("""You can use
+ <a href="http://daringfireball.net/projects/markdown/basics">
+ Markdown</a> for formatting."""))
url = wtforms.TextField(
_('Website'),
[wtforms.validators.Optional(),
- wtforms.validators.URL(message='Improperly formed URL')])
+ wtforms.validators.URL(message="""This address contains errors""")])
+
+
+class EditAccountForm(wtforms.Form):
+ old_password = wtforms.PasswordField(
+ _('Old password'),
+ [wtforms.validators.Required()],
+ description=_(
+ "Enter your old password to prove you own this account."))
+ new_password = wtforms.PasswordField(
+ _('New password'),
+ [wtforms.validators.Required(),
+ wtforms.validators.Length(min=6, max=30)],
+ id="password")
class EditAttachmentsForm(wtforms.Form):
diff --git a/mediagoblin/edit/lib.py b/mediagoblin/edit/lib.py
index b722e9c1..a199cbf7 100644
--- a/mediagoblin/edit/lib.py
+++ b/mediagoblin/edit/lib.py
@@ -17,8 +17,8 @@
def may_edit_media(request, media):
"""Check, if the request's user may edit the media details"""
- if media['uploader'] == request.user['_id']:
+ if media.uploader == request.user._id:
return True
- if request.user['is_admin']:
+ if request.user.is_admin:
return True
return False
diff --git a/mediagoblin/edit/routing.py b/mediagoblin/edit/routing.py
index 34e9fd80..5216f7ca 100644
--- a/mediagoblin/edit/routing.py
+++ b/mediagoblin/edit/routing.py
@@ -20,4 +20,7 @@ from routes.route import Route
edit_routes = [
# Media editing view handled in user_pages/routing.py
Route('mediagoblin.edit.profile', '/profile/',
- controller="mediagoblin.edit.views:edit_profile")]
+ controller="mediagoblin.edit.views:edit_profile"),
+ Route('mediagoblin.edit.account', '/account/',
+ controller="mediagoblin.edit.views:edit_account")
+ ]
diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py
index f92eabac..6f4585cf 100644
--- a/mediagoblin/edit/views.py
+++ b/mediagoblin/edit/views.py
@@ -26,6 +26,7 @@ from werkzeug.utils import secure_filename
from mediagoblin import messages
from mediagoblin import mg_globals
+from mediagoblin.auth import lib as auth_lib
from mediagoblin.edit import forms
from mediagoblin.edit.lib import may_edit_media
from mediagoblin.decorators import require_active_login, get_user_media_entry
@@ -43,11 +44,11 @@ def edit_media(request, media):
return exc.HTTPForbidden()
defaults = dict(
- title=media['title'],
- slug=media['slug'],
- description=media['description'],
- tags=media_tags_as_string(media['tags']),
- license=media['license'])
+ title=media.title,
+ slug=media.slug,
+ description=media.description,
+ tags=media_tags_as_string(media.tags))
+ license=media.license)
form = forms.EditForm(
request.POST,
@@ -58,33 +59,34 @@ def edit_media(request, media):
# and userid.
existing_user_slug_entries = request.db.MediaEntry.find(
{'slug': request.POST['slug'],
- 'uploader': media['uploader'],
- '_id': {'$ne': media['_id']}}).count()
+ 'uploader': media.uploader,
+ '_id': {'$ne': media._id}}).count()
if existing_user_slug_entries:
form.slug.errors.append(
_(u'An entry with that slug already exists for this user.'))
else:
- media['title'] = unicode(request.POST['title'])
- media['description'] = unicode(request.POST.get('description'))
+ media.title = unicode(request.POST['title'])
+ media.description = unicode(request.POST.get('description'))
media['tags'] = convert_to_tag_list_of_dicts(
request.POST.get('tags'))
- media['description_html'] = cleaned_markdown_conversion(
- media['description'])
+ media.description_html = cleaned_markdown_conversion(
+ media.description)
- media['license'] = (
+ media.license = (
unicode(request.POST.get('license'))
or '')
- media['slug'] = unicode(request.POST['slug'])
+ media.slug = unicode(request.POST['slug'])
+
media.save()
return exc.HTTPFound(
location=media.url_for_self(request.urlgen))
- if request.user['is_admin'] \
- and media['uploader'] != request.user['_id'] \
+ if request.user.is_admin \
+ and media.uploader != request.user._id \
and request.method != 'POST':
messages.add_message(
request, messages.WARNING,
@@ -110,7 +112,7 @@ def edit_attachments(request, media):
attachment_public_filepath \
= mg_globals.public_store.get_unique_filepath(
- ['media_entries', unicode(media['_id']), 'attachment',
+ ['media_entries', unicode(media._id), 'attachment',
secure_filename(request.POST['attachment_file'].filename)])
attachment_public_file = mg_globals.public_store.get_file(
@@ -126,7 +128,7 @@ def edit_attachments(request, media):
name=request.POST['attachment_name'] \
or request.POST['attachment_file'].filename,
filepath=attachment_public_filepath,
- created=datetime.utcnow()
+ created=datetime.utcnow(),
))
media.save()
@@ -152,7 +154,7 @@ def edit_attachments(request, media):
def edit_profile(request):
# admins may edit any user profile given a username in the querystring
edit_username = request.GET.get('username')
- if request.user['is_admin'] and request.user['username'] != edit_username:
+ if request.user.is_admin and request.user.username != edit_username:
user = request.db.User.find_one({'username': edit_username})
# No need to warn again if admin just submitted an edited profile
if request.method != 'POST':
@@ -167,22 +169,64 @@ def edit_profile(request):
bio=user.get('bio'))
if request.method == 'POST' and form.validate():
- user['url'] = unicode(request.POST['url'])
- user['bio'] = unicode(request.POST['bio'])
+ user.url = unicode(request.POST['url'])
+ user.bio = unicode(request.POST['bio'])
- user['bio_html'] = cleaned_markdown_conversion(user['bio'])
+ user.bio_html = cleaned_markdown_conversion(user.bio)
- user.save()
+ user.save()
- messages.add_message(request,
- messages.SUCCESS,
- 'Profile edited!')
- return redirect(request,
- 'mediagoblin.user_pages.user_home',
- user=edit_username)
+ messages.add_message(request,
+ messages.SUCCESS,
+ _("Profile changes saved"))
+ return redirect(request,
+ 'mediagoblin.user_pages.user_home',
+ user=user['username'])
return render_to_response(
request,
'mediagoblin/edit/edit_profile.html',
{'user': user,
'form': form})
+
+
+@require_active_login
+def edit_account(request):
+ edit_username = request.GET.get('username')
+ user = request.user
+
+ form = forms.EditAccountForm(request.POST)
+
+ if request.method == 'POST' and form.validate():
+ password_matches = auth_lib.bcrypt_check_password(
+ request.POST['old_password'],
+ user.pw_hash)
+
+ if (request.POST['old_password'] or request.POST['new_password']) and not \
+ password_matches:
+ form.old_password.errors.append(_('Wrong password'))
+
+ return render_to_response(
+ request,
+ 'mediagoblin/edit/edit_account.html',
+ {'user': user,
+ 'form': form})
+
+ if password_matches:
+ user.pw_hash = auth_lib.bcrypt_gen_password_hash(
+ request.POST['new_password'])
+
+ user.save()
+
+ messages.add_message(request,
+ messages.SUCCESS,
+ _("Account settings saved"))
+ return redirect(request,
+ 'mediagoblin.user_pages.user_home',
+ user=user.username)
+
+ return render_to_response(
+ request,
+ 'mediagoblin/edit/edit_account.html',
+ {'user': user,
+ 'form': form})
diff --git a/mediagoblin/gmg_commands/__init__.py b/mediagoblin/gmg_commands/__init__.py
index 10c30385..04187ff2 100644
--- a/mediagoblin/gmg_commands/__init__.py
+++ b/mediagoblin/gmg_commands/__init__.py
@@ -29,7 +29,7 @@ SUBCOMMAND_MAP = {
'setup': 'mediagoblin.gmg_commands.migrate:migrate_parser_setup',
'func': 'mediagoblin.gmg_commands.migrate:migrate',
'help': 'Apply all unapplied bulk migrations to the database'},
- 'adduser':{
+ 'adduser': {
'setup': 'mediagoblin.gmg_commands.users:adduser_parser_setup',
'func': 'mediagoblin.gmg_commands.users:adduser',
'help': 'Creates an user'},
@@ -68,7 +68,7 @@ def main_cli():
subparsers = parser.add_subparsers(help='sub-command help')
for command_name, command_struct in SUBCOMMAND_MAP.iteritems():
- if command_struct.has_key('help'):
+ if 'help' in command_struct:
subparser = subparsers.add_parser(
command_name, help=command_struct['help'])
else:
@@ -94,4 +94,3 @@ def main_cli():
if __name__ == '__main__':
main_cli()
-
diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py
index 78d30713..7f699429 100644
--- a/mediagoblin/gmg_commands/import_export.py
+++ b/mediagoblin/gmg_commands/import_export.py
@@ -16,7 +16,6 @@
from mediagoblin import mg_globals
from mediagoblin.db.open import setup_connection_and_db_from_config
-from mediagoblin.init.config import read_mediagoblin_config
from mediagoblin.storage.filestorage import BasicFileStorage
from mediagoblin.init import setup_storage, setup_global_and_app_config
@@ -65,10 +64,10 @@ def _import_media(db, args):
queue_cache = BasicFileStorage(
args._cache_path['queue'])
- for entry in db.media_entries.find():
- for name, path in entry['media_files'].items():
+ for entry in db.MediaEntry.find():
+ for name, path in entry.media_files.items():
_log.info('Importing: {0} - {1}'.format(
- entry['title'],
+ entry.title,
name))
media_file = mg_globals.public_store.get_file(path, mode='wb')
@@ -88,7 +87,7 @@ def _import_database(db, args):
args.mongorestore_path,
'-d', db.name,
os.path.join(args._cache_path['database'], db.name)])
-
+
p.wait()
_log.info('...Database imported')
@@ -108,7 +107,7 @@ def env_import(args):
global_config, app_config = setup_global_and_app_config(args.conf_file)
connection, db = setup_connection_and_db_from_config(
- app_config, use_pymongo=True)
+ app_config)
tf = tarfile.open(
args.tar_file,
@@ -207,15 +206,17 @@ def _export_media(db, args):
queue_cache = BasicFileStorage(
args._cache_path['queue'])
- for entry in db.media_entries.find():
- for name, path in entry['media_files'].items():
- _log.info('Exporting {0} - {1}'.format(
- entry['title'],
+ for entry in db.MediaEntry.find():
+ for name, path in entry.media_files.items():
+ _log.info(u'Exporting {0} - {1}'.format(
+ entry.title,
name))
-
- mc_file = media_cache.get_file(path, mode='wb')
- mc_file.write(
- mg_globals.public_store.get_file(path, mode='rb').read())
+ try:
+ mc_file = media_cache.get_file(path, mode='wb')
+ mc_file.write(
+ mg_globals.public_store.get_file(path, mode='rb').read())
+ except Exception as e:
+ _log.error('Failed: {0}'.format(e))
_log.info('...Media exported')
@@ -226,7 +227,8 @@ def env_export(args):
'''
if args.cache_path:
if os.path.exists(args.cache_path):
- _log.error('The cache directory must not exist before you run this script')
+ _log.error('The cache directory must not exist '
+ 'before you run this script')
_log.error('Cache directory: {0}'.format(args.cache_path))
return False
@@ -242,9 +244,9 @@ def env_export(args):
globa_config, app_config = setup_global_and_app_config(args.conf_file)
setup_storage()
-
+
connection, db = setup_connection_and_db_from_config(
- app_config, use_pymongo=True)
+ app_config)
_export_database(db, args)
diff --git a/mediagoblin/gmg_commands/migrate.py b/mediagoblin/gmg_commands/migrate.py
index fad9b363..0a8ee7dc 100644
--- a/mediagoblin/gmg_commands/migrate.py
+++ b/mediagoblin/gmg_commands/migrate.py
@@ -16,12 +16,12 @@
import sys
-from mediagoblin.db import util as db_util
+from mediagoblin.db.mongo import util as db_util
from mediagoblin.db.open import setup_connection_and_db_from_config
-from mediagoblin.init.config import read_mediagoblin_config
+from mediagoblin.init import setup_global_and_app_config
# This MUST be imported so as to set up the appropriate migrations!
-from mediagoblin.db import migrations
+from mediagoblin.db.mongo import migrations
def migrate_parser_setup(subparser):
@@ -41,9 +41,9 @@ def _print_finished_migration(migration_number, migration_func):
def migrate(args):
- config, validation_result = read_mediagoblin_config(args.conf_file)
+ global_config, app_config = setup_global_and_app_config(args.conf_file)
connection, db = setup_connection_and_db_from_config(
- config['mediagoblin'], use_pymongo=True)
+ app_config, use_pymongo=True)
migration_manager = db_util.MigrationManager(db)
# Clear old indexes
@@ -53,13 +53,13 @@ def migrate(args):
for collection, index_name in removed_indexes:
print "Removed index '%s' in collection '%s'" % (
index_name, collection)
-
+
# Migrate
print "\n== Applying migrations... =="
migration_manager.migrate_new(
pre_callback=_print_started_migration,
post_callback=_print_finished_migration)
-
+
# Add new indexes
print "\n== Adding new indexes... =="
new_indexes = db_util.add_new_indexes(db)
diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py
index 345c3e5c..4bfe30a5 100644
--- a/mediagoblin/gmg_commands/users.py
+++ b/mediagoblin/gmg_commands/users.py
@@ -18,27 +18,30 @@ from mediagoblin.gmg_commands import util as commands_util
from mediagoblin.auth import lib as auth_lib
from mediagoblin import mg_globals
-
def adduser_parser_setup(subparser):
subparser.add_argument(
- 'username',
+ '--username','-u',
help="Username used to login")
subparser.add_argument(
- 'password',
- help="Your supersecret word to login")
+ '--password','-p',
+ help="Your supersecret word to login, beware of storing it in bash history")
subparser.add_argument(
- 'email',
- help="Email to recieve notifications")
+ '--email','-e',
+ help="Email to receive notifications")
def adduser(args):
#TODO: Lets trust admins this do not validate Emails :)
commands_util.setup_app(args)
+ args.username = commands_util.prompt_if_not_set(args.username, "Username:")
+ args.password = commands_util.prompt_if_not_set(args.password, "Password:",True)
+ args.email = commands_util.prompt_if_not_set(args.email, "Email:")
+
db = mg_globals.database
users_with_username = \
db.User.find({
- 'username': args.username.lower()
+ 'username': args.username.lower(),
}).count()
if users_with_username:
@@ -47,11 +50,11 @@ def adduser(args):
else:
# Create the user
entry = db.User()
- entry['username'] = unicode(args.username.lower())
- entry['email'] = unicode(args.email)
- entry['pw_hash'] = auth_lib.bcrypt_gen_password_hash(args.password)
- entry['status'] = u'active'
- entry['email_verified'] = True
+ entry.username = unicode(args.username.lower())
+ entry.email = unicode(args.email)
+ entry.pw_hash = auth_lib.bcrypt_gen_password_hash(args.password)
+ entry.status = u'active'
+ entry.email_verified = True
entry.save(validate=True)
print "User created (and email marked as verified)"
@@ -68,9 +71,9 @@ def makeadmin(args):
db = mg_globals.database
- user = db.User.one({'username':unicode(args.username.lower())})
+ user = db.User.one({'username': unicode(args.username.lower())})
if user:
- user['is_admin'] = True
+ user.is_admin = True
user.save()
print 'The user is now Admin'
else:
@@ -91,11 +94,10 @@ def changepw(args):
db = mg_globals.database
- user = db.User.one({'username':unicode(args.username.lower())})
+ user = db.User.one({'username': unicode(args.username.lower())})
if user:
- user['pw_hash'] = auth_lib.bcrypt_gen_password_hash(args.password)
+ user.pw_hash = auth_lib.bcrypt_gen_password_hash(args.password)
user.save()
print 'Password successfully changed'
else:
print 'The user doesn\'t exist'
-
diff --git a/mediagoblin/gmg_commands/util.py b/mediagoblin/gmg_commands/util.py
index 168a0760..3e26c53f 100644
--- a/mediagoblin/gmg_commands/util.py
+++ b/mediagoblin/gmg_commands/util.py
@@ -16,6 +16,7 @@
from mediagoblin import app
+import getpass
def setup_app(args):
@@ -25,3 +26,15 @@ def setup_app(args):
mgoblin_app = app.MediaGoblinApp(args.conf_file)
return mgoblin_app
+
+def prompt_if_not_set(variable, text, password=False):
+ """
+ Checks if the variable is None and prompt for a value if it is
+ """
+ if variable is None:
+ if not password:
+ variable=raw_input(text + u' ')
+ else:
+ variable=getpass.getpass(text + u' ')
+
+ return variable
diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
index 4e4e8863..1a7267e5 100644
--- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
index 548e971f..c53fc387 100644
--- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -21,27 +21,19 @@ msgstr ""
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "اسم المستخدم"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "كلمة السر"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "يجب أن تتطابق كلمتا السر."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "أكّد كلمة السر"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "اكتبها مرة أخرى هنا للتأكد من عدم وجود أخطاء إملائية."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "عنوان البريد الإلكتروني"
@@ -54,10 +46,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "عذرًا، لقد اختار مستخدم آخر هذا الاسم."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "عÙوًا، هذا العنوان البريدي مستخدم."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -65,15 +57,28 @@ msgstr ""
"تم التحقق من بريدك الإلكتروني. يمكنك الآن الولوج، وتحرير ملÙÙƒ الشخصي، ونشر "
"الصور!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Ù…ÙØªØ§Ø­ التحقق أو معر٠المستخدم خاطئ"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "أعدنا إرسال رسالة التحقق."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -81,74 +86,127 @@ msgstr ""
"تعذر إرسال رسالة استعادة كلمة السر لأن اسم المستخدم معطل أو لأننا لم نتحقق "
"من بريدك الإلكتروني."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "العنوان"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "وص٠هذا العمل."
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "الوسوم"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "المسار"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "لا يمكن ترك المسار ÙØ§Ø±ØºÙ‹Ø§"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"الجزء الذي يمثل عنوان المل٠ÙÙŠ المسار. لا حاجة إلى تغيير محتوى هذه الخانة "
-"عادةً."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "السيرة"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "الموقع الإلكتروني"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "يوجد مل٠آخر بهذا المسار لدى هذى المستخدم."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "أنت تحرّر وسائط مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "أنت تحرّر مل٠مستخدم آخر. كن حذرًا أثناء العملية."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "الملÙ"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "وص٠هذا العمل."
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "يجب أن تضع ملÙًا."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "لا يبدو أن هذا المل٠صورة!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "يا سلام! Ù†ÙØ´Ø±ÙŽØª!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "صورة قزم مرتبك"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "ويحي!"
@@ -163,33 +221,30 @@ msgid ""
msgstr ""
"إن كنت متأكدًا من صحة العنوان ÙØ±Ø¨Ù…ا تكون Ø§Ù„ØµÙØ­Ø© التي تريدها Ù†Ùقلت أو Ø­ÙØ°Ùت."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "صورة قزم مرتبك"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "غنو ميدياغوبلن"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "شعار ميدياغوبلن"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "أرسل وسائط"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "أض٠وسائط"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "أكّد بريدك"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Ù„ÙØ¬"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -199,81 +254,53 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "مرحبًا بكم يا محبي الوسائط! ميدياغوبلن هو..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "المكان الأنسب لوسائطك!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr "مكان يجتمع Ùيه الناس ليتعاونوا ويعرضوا إبداعاتهم الأصلية والمقتبسة!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr "مشروع حر، Ùنحن أحد مشاريع <a href=\"http://gnu.org\">غنو</a>."
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr "مشروع يحاول جعل عالمنا Ø£ÙØ¶Ù„ عن طريق اللامركزية (قريبًا!)."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"جاهز للتمدد. (Ø³ÙŠÙØ¶Ø§Ù دعم أنساق كثيرة من الوسائط قريبًا، كما سندعم الÙيديو!)."
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">أنشئ حسابًا مجانيًا</a>\n"
-" أو\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">ركّب ميدياغوبلن على خادومك الخاص</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "أحدث الوسائط"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "أدخل كلمة سرك الجديدة"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "أدخل اسم المستخدم أو بريدك الإلكتروني"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "لقد غÙيرت كلمة سرك. جرّب الولوج الآن."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr "تÙقد بريدك الإلكتروني. لقد أرسلنا رسالة بها وصلة لتغيير كلمة سرك."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -300,27 +327,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "ÙØ´Ù„ الولوج!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "ألا تملك حسابًا بعد؟"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "أنشئ حسابًا هنا!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "أنسيت كلمة سرك؟"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "غيّرها!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "أنشئ حسابًا!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "أنشئ"
@@ -352,36 +375,114 @@ msgid "Cancel"
msgstr "ألغÙ"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Ø§Ø­ÙØ¸ التغييرات"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "تحرير مل٠%(username)s الشخصي"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "الوسائط الموسومة بâ€"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "انشر وسائطك"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "أرسل"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "وسائط <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "عذرًا، تعذر العثور على مستخدم بهذا الاسم."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -413,35 +514,45 @@ msgstr "لا توجد وسائط تحت المعالجة"
msgid "These uploads failed to process:"
msgstr "ÙØ´Ù„ت معالجة هذه Ø§Ù„Ù…Ù„ÙØ§Øª:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "مل٠%(username)s الشخصي"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "عذرًا، تعذر العثور على مستخدم بهذا الاسم."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "يجب التحقق من البريد الإلكتروني"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "أوشكنا على الانتهاء! ما زال حسابك بحاجة إلى Ø§Ù„ØªÙØ¹ÙŠÙ„."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "ستصلك رسالة إلكترونية خلال لحظات بها التعليمات."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "إن لم تصل."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "أعد إرسال رسالة التحقق"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr "سجّل أحدهم حسابًا بهذا الاسم، ولكننا بانتظار Ø§Ù„ØªÙØ¹ÙŠÙ„ حتى الآن."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -450,40 +561,36 @@ msgstr ""
"إن كنت أنت ذلك الشخص لكنك Ùقدت رسالة التحقق، يمكنك <a "
"href=\"%(login_url)s\">الولوج</a> وإعادة إرسالها."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "مل٠%(username)s الشخصي"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "هذه زاوية لتخبر الآخرين Ùيها عن Ù†ÙØ³Ùƒ."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Ø­Ø±Ù‘ÙØ± المل٠الشخصي"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "لم يعبئ هذا العضو بيانات ملÙÙ‡ بعد."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Ø£Ø¸Ù‡ÙØ± كل وسائط %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "هنا ستظهر وسائطك، ولكن يبدو أنك لم تض٠شيئًا بعد."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "أض٠وسائط"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "لا يبدو أنه توجد أي وسائط هنا حتى الآن..."
@@ -495,31 +602,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "الأحدث"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "الأقدم"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "علّÙÙ‚"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "أنا متأكد من رغبتي بحذ٠هذا العمل"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "أنت على وشك حذ٠وسائط مستخدم آخر. كن حذرًا أثناء العملية."
diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
index 9b9e7e3b..45f2331f 100644
--- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
index e2cd8342..a5d6732b 100644
--- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po
@@ -1,15 +1,16 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# Al fred <devaleitzer@aim.com>, 2011.
# <devaleitzer@aim.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +20,19 @@ msgstr ""
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Aquest tipus de fitxer no és vàlid."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nom d'usuari"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Contrasenya"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Les contrasenyes han de coincidir"
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Confirmeu la contrasenya"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Adreça electrònica"
@@ -52,10 +45,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Lamentablement aquest usuari ja existeix."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Disculpeu, aquesta adreça electrònica ja s'està utilitzant."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,87 +56,155 @@ msgstr ""
"Ja s'ha verificat la vostra adreça electrònica. Ara podeu entrar, editar el "
"vostre perfil i penjar imatge!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
"La clau de verificació o la identificació de l'usuari no són correctes."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Torna'm a enviar el correu de verificació"
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Títol"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Etiquetes"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biografia"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Lloc web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Esteu editant fitxers d'un altre usuari. Aneu amb compte."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Esteu editant el perfil d'un usuari. Aneu amb compte"
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Aquest tipus de fitxer no és vàlid."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Fitxer"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr ""
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Heu d'escollir un fitxer."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "El fitxer no és una imatge"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Visca! S'ha enviat!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Imatge de la pantalla 404, el goblin no sap què fer..."
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Ups!"
@@ -159,33 +220,30 @@ msgstr ""
"Si esteu convençut que l'adreça és correcta, pot ser que la pàgina que "
"cerqueu s'hagi canviat d'ubicació o s'hagi eliminat."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Logo de mediagoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Envia fitxers"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Tots els fitxers"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "verifiqueu el correu electrònic"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Entra"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -195,85 +253,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Ei, fanàtic multimèdia! MediaGoblin és..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "El lloc fitxer pels teus fitxers!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Un lloc en el qual les persones poden col·laborar i mostrar les seves "
-"creacions originals o obres derivades."
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-"Amb l'objectiu de fer del món un lloc millor a través de la "
-"descentralització i (eventualment, aviat disponible!) La federació!"
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Construït per l'ampliació. (Múltiples tipus de fitxers en breu amb el "
-"programari, incloent el suport de vídeo!)"
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Desenvolupat per persones com vostè. ( <a "
-"href=\"http://mediagoblin.org/pages/join.html\"> Podeu ajudar a millorar "
-"aquest programari!</a> )"
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -294,27 +319,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Inici de sessió ha fallat!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Encara no teniu un compte?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Creeu-ne un aquí!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Creeu un compte!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Crea"
@@ -346,36 +367,114 @@ msgid "Cancel"
msgstr "Cancel·la"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Desa els canvis"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Etiquetat amb:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Envieu els vostres fitxers"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Envia"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>'s media"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Lamentablement no s'ha trobat l'usuari que cercàveu."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -397,7 +496,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
msgid "Media in-processing"
-msgstr ""
+msgstr "S'està processant el fitxer"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
@@ -405,37 +504,49 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
+msgstr "No s'han pogut penjar els següents fitxers:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Lamentablement no s'ha trobat l'usuari que cercàveu."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr ""
+msgstr "Cal que verifiqueu l'adreça electrònica"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
-msgstr ""
+msgstr "Gairebé esteu! Tan sols falta que activeu el vostre compte"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "Us hauria d'arribar un correu amb les instruccions per a fer-ho."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
-msgstr ""
+msgstr "Per si no hi fos:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Torna'm a enviar el correu de verificació"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
+"Algú ja ha registrat un compte amb aquest nom d'usuari, però encara l'ha "
+"d'activar."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -444,76 +555,98 @@ msgstr ""
"Si siu aqeust usuari però heu perdut el correu de verificació, podeu <a "
"href=\"%(login_url)s\">entrar</a> i tornar-lo a enviar."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Edita el perfil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
+msgstr "Aquest usuari encara no ha escrit res al seu perfil."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "View all of %(username)s's media"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
-msgstr ""
+msgstr "Icona RSS"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Comentari"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
index b65212eb..4f4bbfda 100644
--- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
index 5baab62e..1fb472f0 100644
--- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
@@ -1,12 +1,14 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
# <benjamin@lebsanft.org>, 2011.
# <cwebber@dustycloud.org>, 2011.
# Elrond <elrond+mediagoblin.org@samba-tng.org>, 2011.
+# <jakob.kramer@gmx.de>, 2011.
# Jan-Christoph Borchardt <JanCBorchardt@fsfe.org>, 2011.
+# Jan-Christoph Borchardt <jan@unhosted.org>, 2011.
# <kyoo@kyoo.ch>, 2011.
# <mediagoblin.org@samba-tng.org>, 2011.
# Rafael Maguiña <rafael.maguina@gmail.com>, 2011.
@@ -15,8 +17,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: German (http://www.transifex.net/projects/p/mediagoblin/team/de/)\n"
"MIME-Version: 1.0\n"
@@ -26,134 +28,193 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Benutzername"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Passwort"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Passwörter müssen übereinstimmen."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Passwort wiederholen"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Hier nochmal eintragen, um Tippfehler zu verhindern."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
-msgstr "Email-Adresse"
+msgstr "E-Mail-Adresse"
#: mediagoblin/auth/views.py:55
msgid "Sorry, registration is disabled on this instance."
-msgstr "Registrierung ist auf dieser Instanz leider deaktiviert."
+msgstr "Das Registrieren ist auf dieser Instanz leider deaktiviert."
#: mediagoblin/auth/views.py:73
msgid "Sorry, a user with that name already exists."
msgstr "Leider gibt es bereits einen Benutzer mit diesem Namen."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Tut und Leid, aber diese Email-Adresse wird bereits verwendet."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Leider gibt es bereits einen Benutzer mit dieser E-Mail-Adresse."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-"Deine Email-Adresse wurde bestätigt. Du kannst dich nun anmelden, Dein "
+"Deine E-Mail-Adresse wurde bestätigt. Du kannst dich nun anmelden, Dein "
"Profil bearbeiten und Bilder hochladen!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
-msgstr "Der Bestätigungssschlüssel oder die Nutzernummer ist falsch."
+msgstr "Der Bestätigungsschlüssel oder die Nutzernummer ist falsch."
+
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "Du musst angemeldet sein, damit wir wissen, wer die Email bekommt."
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Deine E-Mail-Adresse wurde bereits bestätigt."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
-msgstr "Bestätigungs-Email wurde erneut versandt."
+msgstr "Bestätigungs-E-Mail wurde erneut versandt."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
-"Konnte Email zur Wiederherstellung des Passworts nicht senden, weil dein "
-"Benutzername inaktiv oder deine Email-Adresse noch nicht verifiziert ist."
+"E-Mail zur Wiederherstellung des Passworts konnte nicht gesendet werden, "
+"weil dein Benutzername inaktiv oder deine E-Mail-Adresse noch nicht "
+"verifiziert ist."
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Beschreibung des Werkes"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Markierungen"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Kurztitel"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Bitte gib einen Kurztitel ein"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"Der Titelteil der Medienadresse. Normalerweise muss hier nichts geändert "
-"werden."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biographie"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Webseite"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Altes Passwort"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Diesen Kurztitel hast du bereits vergeben."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Du bearbeitest die Medien eines Anderen. Bitte sei vorsichtig."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Du bearbeitest das Profil eines Anderen. Bitte sei vorsichtig."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Falsches Passwort"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Datei"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Beschreibung des Werkes"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Du musst eine Datei angeben."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Diese Datei scheint kein Bild zu sein!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Yeeeaaah! Geschafft!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Bild eines angespannten Goblins"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Hoppla!"
@@ -169,33 +230,30 @@ msgstr ""
"Wenn du sicher bist, dass die Adresse stimmt, wurde die Seite eventuell "
"verschoben oder gelöscht."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Bild eines angespannten Goblins"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin-Logo"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Medien hochladen"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Medien hinzufügen"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Bitte bestätige deine E-Mail-Adresse!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Bitte bestätige deine Email-Adresse!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "Abmelden"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Anmelden"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -207,93 +265,57 @@ msgstr ""
msgid "Explore"
msgstr "Entdecke"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Hallo Medien-Liebhaber! MediaGoblin ist …"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Hallo du, willkommen auf dieser MediaGoblin-Seite!"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Der perfekte Platz für deine Medien!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Ein Platz für Zusammenarbeit und um Originale und abgeleitete Werke zu "
-"präsentieren!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Frei, wie in Freiheit. (Wir sind schließlich ein <a "
-"href=\"http://gnu.org\">GNU</a>-Projekt.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Weltverbesserer durch Dezentralisierung und (hoffentlich bald!) unabhängige "
-"Kommunikation!"
+"Diese Seite läuft mit <a href=\"http://mediagoblin.org\">MediaGoblin</a>, "
+"einer großartigen Software für Medienhosting."
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Gebaut für Erweiterungen. (Bald mit Unterstützung für verschiedene "
-"Medientypen inklusive Videos!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Betrieben von Leuten wie dir. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Du kannst uns dabei helfen, "
-"die Software zu verbessern!</a>)"
+"Melde dich mit deinem MediaGoblin-Konto an, um eigene Medien hinzuzufügen, "
+"zu kommentieren, Favoriten zu speichern und mehr."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Neugierig dich uns anzuschliessen?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Hast du noch keinen? Das geht ganz einfach!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Gratis ein Konto einrichten</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">MediaGoblin auf deinem eigenen Server einrichten</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Neuste Medien"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Neues Passwort eingeben"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Benutzername oder Email-Adresse eingeben"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Dein Passwort wurde geändert. Versuche dich jetzt einzuloggen."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Passwort wiederherstellen"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Prüfe deinen Posteingang. Wir haben dir eine Email geschickt mit einer URL, "
-"um dein Passwort zu ändern."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Anleitung senden"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -314,33 +336,29 @@ msgstr ""
"\n"
"%(verification_url)s\n"
"\n"
-"Wenn du denkst, dass das ein Fehler ist, ignoriere einfach diese Email und bleib ein glücklicher Goblin!"
+"Wenn du denkst, dass das ein Fehler ist, ignoriere einfach diese E-Mail und bleib ein glücklicher Goblin!"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "Anmeldevorgang fehlgeschlagen!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Hast du noch kein Konto?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Registriere dich hier!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Wechsle es!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Neues Konto registrieren!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Registrieren"
@@ -356,7 +374,7 @@ msgid ""
msgstr ""
"Hallo %(username)s,\n"
"\n"
-"um dein Konto bei GNU MediaGoblin zu aktivieren, musst du folgende Adresse in einem Webbrowser öffnen:\n"
+"um dein Konto bei GNU MediaGoblin zu aktivieren, musst du folgende Adresse in deinem Webbrowser öffnen:\n"
"\n"
"%(verification_url)s"
@@ -371,36 +389,114 @@ msgid "Cancel"
msgstr "Abbrechen"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Änderungen speichern"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "%(username)ss Profil bearbeiten"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Medien markiert mit:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Medien markiert mit: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Original"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Medien hochladen"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Bestätigen"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "%(username)ss Medien"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>s Medien"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Dieser Benutzer wurde leider nicht gefunden."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Löschen"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "bei"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -434,31 +530,41 @@ msgstr "Keine Medien in Bearbeitung"
msgid "These uploads failed to process:"
msgstr "Die folgenden Uploads sind fehlgeschlagen:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)ss Profil"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Dieser Benutzer konnte leider nicht gefunden werden."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr "Email-Bestätigung benötigt"
+msgstr "E-Mail-Bestätigung benötigt"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Fast fertig! Dein Konto muss noch freigeschaltet werden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
-"Gleich solltest du eine Email bekommen, die dir sagt, was du noch machen "
-"musst."
+"Gleich solltest du eine E-Mail erhalten, die dir erklärt, was du noch machen"
+" musst."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Wenn sie nicht ankommt:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Bestätigung erneut senden"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -466,7 +572,7 @@ msgstr ""
"Jemand hat bereits ein Konto mit diesem Benutzernamen registriert, aber es "
"muss noch aktiviert werden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -476,40 +582,36 @@ msgstr ""
" kannst du dich <a href=\"%(login_url)s\">anmelden</a> und sie erneut "
"senden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)ss Profil"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Hier kannst du Anderen etwas über dich erzählen."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Profil bearbeiten"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Dieser Benutzer hat (noch) keine Daten in seinem Profil."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Alle Medien von %(username)s anschauen"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "Hier erscheinen deine Medien. Sobald du etwas hochgeladen hast."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Medien hinzufügen"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Scheinbar gibt es hier noch nichts …"
@@ -521,31 +623,59 @@ msgstr "Feed-Symbol"
msgid "Atom feed"
msgstr "Atom-Feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Neuere"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Zu Seite:"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Ältere"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Kommentar"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Ja, wirklich löschen"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Ohh, der Kommentar war leer."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Dein Kommentar wurde gesendet!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Du hast das Medium gelöscht."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"Das Medium wurde nicht gelöscht. Du musst ankreuzen, dass du es wirklich "
+"löschen möchtest."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Du versuchst Medien eines anderen Nutzers zu löschen. Sei vorsichtig."
diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
index 5e1401f6..3584cd4f 100644
--- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
@@ -1,14 +1,14 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,27 +17,19 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
-msgid "Username"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
-msgid "Password"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
msgstr ""
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
+msgid "Username"
msgstr ""
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
+msgid "Password"
msgstr ""
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr ""
@@ -50,94 +42,164 @@ msgid "Sorry, a user with that name already exists."
msgstr ""
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
+msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your "
"profile, and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid "An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or "
"your account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr ""
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
-msgid "The title part of this media's URL. You usually don't need to change this."
+#: mediagoblin/edit/forms.py:39
+msgid ""
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/submit/forms.py:25
-msgid "File"
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
msgstr ""
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
msgstr ""
-#: mediagoblin/submit/views.py:46
-msgid "You must provide a file."
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
+#: mediagoblin/submit/forms.py:25
+msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:50
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr ""
@@ -151,33 +213,30 @@ msgid ""
"has been moved or deleted."
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:47
-msgid "MediaGoblin logo"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -187,78 +246,55 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, "
+"an extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you"
+" can log in with your MediaGoblin account."
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project,"
-" after all.)"
+msgid "Don't have one yet? It's easy!"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the "
-"software, including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve "
-"this software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a "
-"free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" "
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an "
+"account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" "
"href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on "
"your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid "Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -279,27 +315,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr ""
@@ -325,35 +357,113 @@ msgid "Cancel"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
+msgid "Add your media"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
+msgid "Add"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> "
+"for formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
@@ -385,74 +495,80 @@ msgstr ""
msgid "These uploads failed to process:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid "An email should arrive in a few moments with instructions on how to do so."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to"
" be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can "
"<a href=\"%(login_url)s\">log in</a> and resend it."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
@@ -464,31 +580,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
index c537c65e..d0c5f2bf 100644
--- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
index f6bb1cce..6536f4d5 100644
--- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -21,27 +21,19 @@ msgstr ""
"Language: eo\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "La provizita dosiero ne konformas al la informtipo."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Uzantnomo"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Pasvorto"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Pasvortoj devas esti egalaj."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Retajpu pasvorton"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Retajpu Äin por certigi, ke ne okazis mistajpoj."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "RetpoÅtadreso"
@@ -54,10 +46,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "BedaÅ­rinde, uzanto kun tiu nomo jam ekzistas."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Tiu retpoÅtadreso jam estas uzata."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Ni bedaÅ­ras, sed konto kun tiu retpoÅtadreso jam ekzistas."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -65,15 +57,28 @@ msgstr ""
"Via retpoÅtadreso estas konfirmita. Vi povas nun ensaluti, redakti vian "
"profilon, kaj alÅuti bildojn!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "La kontrol-kodo aÅ­ la uzantonomo ne estas korekta"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "Vi devas esti ensalutita, por ke ni sciu, al kiu sendi la retleteron!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Vi jam konfirmis vian retpoÅtadreson!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Resendi vian kontrol-mesaÄon."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -81,74 +86,127 @@ msgstr ""
"Ni ne povas sendi pasvortsavan retleteron, ĉar aŭ via konto estas neaktiva, "
"aÅ­ Äia retpoÅtadreso ne estis konfirmita."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titolo"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Priskribo de ĉi tiu verko"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Etikedoj"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "La distingiga adresparto"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "La distingiga adresparto ne povas esti malplena"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"La parto de la dosieradreso, bazita sur la dosiertitolo. Ordinare ne necesas"
-" Äin ÅanÄi."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Retejo"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "La malnova pasvorto"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Ĉi tiu uzanto jam havas dosieron kun tiu distingiga adresparto."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Vi priredaktas dosieron de alia uzanto. Agu singardeme."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Vi redaktas profilon de alia uzanto. Agu singardeme."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "La provizita dosiero ne konformas al la informtipo."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "MalÄusta pasvorto"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Dosiero"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Priskribo de ĉi tiu verko"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Vi devas provizi dosieron."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "La dosiero Åajnas ne esti bildo!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Hura! AlÅutitas!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Bildo de 404-koboldo penÅvitanta."
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Oj!"
@@ -164,33 +222,30 @@ msgstr ""
"Se vi estas certa, ke la adreso estas Äusta, eble la serĉata de vi paÄo "
"estis movita aÅ­ forigita."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Bildo de 404-koboldo penÅvitanta."
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Emblemo de MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "AlÅuti aÅ­d-vid-dosieron"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Aldoni dosieron"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Konfirmu viecon de la retpoÅtadreso!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "konfirmu vian retpoÅtadreson! "
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "elsaluti"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Ensaluti"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -200,93 +255,60 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:24
msgid "Explore"
-msgstr ""
+msgstr "Ĉirkaŭrigardi"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Saluton, artemulo! MediaGoblin estas…"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Saluton, kaj bonvenon al ĉi tiu MediaGoblina retpaÄaro!"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "La perfekta loko por viaj aÅ­d-vid-dosieroj!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Loko, kie homoj povas kunlabori, kaj elmeti originalajn kreaĵojn kaj "
-"derivaĵojn!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Libera verko. (Ni ja estas projekto de <a href=\"http://gnu.org\">GNU</a>.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Celanta plibonigi la mondon per sencentreco kaj (iam, baldaÅ­!) federateco!"
+"Ĉi tiu retpaÄaro funkcias per <a "
+"href=\"http://mediagoblin.org\">MediaGoblin</a>, eksterordinare bonega "
+"programaro por gastigado de aÅ­dâ€vidâ€dosieroj."
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Kreita por etendado. (BaldaÅ­ en la programo aperos subteno de pluraj "
-"informspecoj, inkluzive de filmoj!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Vivanta per homoj kiel vi. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Vi povas helpi al ni "
-"plibonigi la programon!</a>)"
+"Por aldoni viajn proprajn dosierojn, fari al vi liston de la plej plaĉaj, "
+"ks, vi povas ensaluti je via MediaGoblina konto."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Ĉu vi deziregas aliÄi nin?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Ĉu vi ankoraÅ­ ne havas tian? Ne malÄoju!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Kreu senpagan"
-" konton</a>⎠aŭ⎠<a class=\"header_submit\" "
-"href=\"http://wiki.mediagoblin.org/HackingHowto\">Kreu senpagan konton</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
-msgstr "Plej nove aldonitaj dosieroj"
+msgstr "Laste aldonitaj dosieroj"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Enigu vian novan pasvorton"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Enigu vian salutnomon aÅ­ retpoÅtadreson"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Via pasvorto estis ÅanÄita. Nun provu ensaluti."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Ekhavo de nova pasvorto"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Kontrolu vian retleterujon. Ni sendis retleteron kun retadreso por ÅanÄo de "
-"via pasvorto."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Sendi instrukcion"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -313,27 +335,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Ensaluto malsukcesis!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Ĉu ankoraŭ sen konto?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Kreu Äin ĉi tie!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Ĉu vi forgesis vian pasvorton?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "ÅœanÄu Äin!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Kreu konton!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Krei"
@@ -364,36 +382,114 @@ msgid "Cancel"
msgstr "Nuligi"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Konservi ÅanÄojn"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Redaktado de l’profilo de %(username)s'"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Dosieroj markitaj per:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Dosieroj kun etikedo: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Originalo"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "AlÅutu vian aÅ­d-vid-dosieron"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "AlÅuti"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Dosieroj de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Dosieroj de <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Uzanto ne trovita."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "ÅœanÄi"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Forigi"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "je"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -427,30 +523,40 @@ msgstr "Neniu dosieroj preparatas"
msgid "These uploads failed to process:"
msgstr "Preparado de ĉi tiuj alÅutaĵoj malsukcesis:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profilo de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Uzanto ne trovita."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Necesas konfirmo de retpoÅtadreso"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "PreskaÅ­ finite! Restas nur validigi vian konton."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Post kelkaj momentoj devas veni retletero kun instrukcio pri kiel tion fari."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Se tio ne okazas:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Resendi kontrolmesaÄon"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -458,7 +564,7 @@ msgstr ""
"Iu registris konton kun tiu ĉi uzantonomo, sed Äi devas ankoraÅ­ esti "
"aktivigita."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -467,41 +573,37 @@ msgstr ""
"Se vi estas tiu sed vi perdis vian kontrolmesaÄon, vi povas <a "
"href=\"%(login_url)s\">ensaluti</a> kaj resendi Äin."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profilo de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Jen estas spaceto por rakonti pri vi al aliaj."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Redakti profilon"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Ĉi tiu uzanto ne jam aldonis informojn pri si."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Rigardi ĉiujn dosierojn de %(username)s'"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
"Äœuste ĉi tie aperos viaj dosieroj, sed vi Åajne ankoraÅ­ nenion alÅutis."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Aldoni dosieron"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Ĉi tie Åajne estas ankoraÅ­ neniuj dosieroj…"
@@ -513,31 +615,59 @@ msgstr "flusimbolo"
msgid "Atom feed"
msgstr "Atom-a informfluo"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Plinovaj"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Malplinovaj"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Komento"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Iri al paÄo:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Mi estas certa, ke mi volas forigi ĉi tion"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Oj, via komento estis malplena."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Via komento estis afiÅita!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Vi forigis la dosieron."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"La dosiero ne estis forigita, ĉar vi ne konfirmis vian certecon per la "
+"markilo."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Vi estas forigonta dosieron de alia uzanto. Estu singardema."
diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
index 2d2b9243..b9f8eeed 100644
--- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
index a3c9939b..ab8c6b3f 100644
--- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -10,12 +10,13 @@
# <juangsub@gmail.com>, 2011.
# <juanma@kde.org.ar>, 2011.
# Mario Rodriguez <msrodriguez00@gmail.com>, 2011.
+# <mu@member.fsf.org>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mediagoblin/team/es/)\n"
"MIME-Version: 1.0\n"
@@ -25,28 +26,19 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Archivo inválido para el formato seleccionado."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nombre de usuario"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Contraseña"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Las contraseñas deben coincidir."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Confirma tu contraseña"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-"Escriba de nuevo aquí para asegurarse de que no hay faltas de ortografía."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Dirección de correo electrónico"
@@ -59,10 +51,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Lo sentimos, ya existe un usuario con ese nombre."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Lo sentimos, esa dirección de correo electrónico ya ha sido tomada."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Lo sentimos, ya existe un usuario con esa dirección de email."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -70,16 +62,31 @@ msgstr ""
"Tu dirección de correo electrónico ha sido verificada. ¡Ahora puedes "
"ingresar, editar tu perfil, y enviar imágenes!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
"La clave de verificación o la identificación de usuario son incorrectas"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"¡Debes iniciar sesión para que podamos saber a quién le enviamos el correo "
+"electrónico!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "¡Ya has verificado tu dirección de correo!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Se reenvió tu correo electrónico de verificación."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -88,76 +95,129 @@ msgstr ""
"porque su nombre de usuario está inactivo o la dirección de su cuenta de "
"correo electrónico no ha sido verificada."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Título"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Descripción de esta obra"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Etiquetas"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Ficha"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "La ficha no puede estar vacía"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"La parte del título de la URL de este contenido. Normalmente no necesitas "
-"cambiar esto."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Sitio web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Vieja contraseña"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Una entrada con esa ficha ya existe para este usuario."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Estás editando el contenido de otro usuario. Proceder con precaución."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Estás editando un perfil de usuario. Proceder con precaución."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Archivo inválido para el formato seleccionado."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Contraseña incorrecta"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Archivo"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Descripción de esta obra"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Debes proporcionar un archivo."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "¡El archivo no parece ser una imagen!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
-msgstr "¡Woohoo! ¡Enviado!"
+msgstr "¡Yujú! ¡Enviado!"
+
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Imagen de 404 goblin estresándose"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
-msgstr "Ups!"
+msgstr "¡Ups!"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
@@ -171,33 +231,30 @@ msgstr ""
"Si estás seguro que la dirección es correcta, puede ser que la pagina haya "
"sido movida o borrada."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Imagen de 404 goblin estresándose"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Logo de MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Enviar contenido"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Añadir contenido"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "¡Verifica tu email!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "¡Verifica tu correo electrónico!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "Cerrar sesión"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Conectarse"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -209,93 +266,58 @@ msgstr ""
msgid "Explore"
msgstr "Explorar"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "¡Hola, amante de los contenidos! MediaGoblin es ..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "¡El lugar ideal para tus contenidos!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Hola, ¡bienvenido a este sitio de MediaGoblin!"
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"¡Un lugar para colaborar y exhibir tus creaciones originales y derivadas!"
+"Este sitio está montado con <a "
+"href=\"http://mediagoblin.org\">MediaGoblin</a>, un programa libre buenísimo"
+" para gestionar contenido multimedia."
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Libre, como en la libertad. (Somos parte del proyecto <a "
-"href=\"http://gnu.org\">GNU</a> después de todo.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Queriendo hacer del mundo un mejor lugar a través de la descentralización y "
-"(eventualmente, muy pronto!) la federalización!"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Pensado para ser extensible. (Prontamente soporte para multiples formatos, "
-"incluyendo video!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Impulsado por gente como vos. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\"> Vos podés ayudarnos a "
-"mejorar este programa</a>)"
+"Para añadir tus propios contenidos, dejar comentarios, guardar tus favoritos"
+" y más, puedes iniciar sesión con tu cuenta de MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Te gustaría unirte a nosotros?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "¿Aún no tienes una? ¡Es fácil!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Crea una "
-"cuenta gratuita</a> o <a class=\"header_submit\" "
-"href=\"http://wiki.mediagoblin.org/HackingHowto\">Establece MediaGoblin en "
-"tu propio servidor</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "El contenido más reciente"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Ingrese su nueva contraseña"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Introduzca su nombre de usuario o correo electrónico"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Se cambió tu contraseña. Intenta iniciar sesión ahora."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Recuperar contraseña"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Revisa tu bandeja de entrada. Te enviamos un correo electrónico con una URL "
-"para cambiar tu contraseña."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Enviar instrucciones"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -310,36 +332,35 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
-"Hola %(username)s , para cambiar su contraseña de GNU MediaGoblin, abra la "
-"siguiente URL en su navegador: %(verification_url)s Si usted piensa que "
-"esto es un error, simplemente ignore este mensaje y siga siendo un duende "
-"feliz!"
+"Hola %(username)s,\n"
+"\n"
+"Para cambiar tu contraseña de GNU MediaGoblin, abre la siguiente URL en un navegador:\n"
+"\n"
+"%(verification_url)s \n"
+"\n"
+"Si piensas que esto es un error, simplemente ignora este mensaje y sigue siendo un trasgo feliz."
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "¡Falló el inicio de sesión!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "¿No tienes una cuenta?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "¡Crea una aquí!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "¿Olvidaste tu contraseña?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Cambiarlo!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "¡Crea una cuenta!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Crear"
@@ -362,7 +383,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:29
#, python-format
msgid "Editing %(media_title)s"
-msgstr "Edición %(media_title)s "
+msgstr "Editando %(media_title)s "
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
@@ -370,41 +391,119 @@ msgid "Cancel"
msgstr "Cancelar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Guardar cambios"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Editando el perfil de %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Contenido etiquetado con:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Contenido etiquetado con: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Original"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Envía tu contenido"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Enviar"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Contenidos de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Contenido de <a href=\"%(user_url)s\">%(username)s</a>'s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Lo sentimos, no se encontró ese usuario."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Editar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Borrar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "en"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr "Realmente deseas eliminar %(title)s ?"
+msgstr "¿Realmente deseas eliminar %(title)s?"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
msgid "Delete Permanently"
@@ -433,31 +532,41 @@ msgstr "No hay contenido siendo procesado."
msgid "These uploads failed to process:"
msgstr "Estos archivos no pudieron ser procesados:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Perfil de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Lo sentimos, no se encontró ese usuario."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Es necesario un correo electrónico de verificación"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
-msgstr "Casi terminas! Solo falta activar la cuenta."
+msgstr "¡Casi hemos terminado! Solo falta activar la cuenta."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"En unos momentos te debería llegar un correo electrónico con las "
"instrucciones para hacerlo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "En caso de que no:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Reenviar correo electrónico de verificación"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -465,7 +574,7 @@ msgstr ""
"Alguien ya registró una cuenta con ese nombre de usuario, pero todavía no "
"fue activada."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -474,41 +583,37 @@ msgstr ""
"Si tú eres esa persona, pero has perdido tu correo electrónico de "
"verificación, puedes <a href=\"%(login_url)s\">acceder</a> y reenviarlo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Perfil de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Aquí hay un lugar para que le cuentes a los demás sobre tí."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Editar perfil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Este usuario (todavia) no ha completado su perfil."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Ver todo el contenido de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
"Aquí es donde tú contenido estará, pero parece que aún no has agregado nada."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Añadir contenido"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Parece que aún no hay ningún contenido aquí..."
@@ -520,31 +625,57 @@ msgstr "ícono feed"
msgid "Atom feed"
msgstr "Atom feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Recientes"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Antiguas"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Comentario"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Ir a la página:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Estoy seguro de que quiero borrar esto"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Ups, tu comentario estaba vacío."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "¡Tu comentario ha sido publicado!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Eliminaste el contenido"
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "El contenido no se eliminó porque no marcaste que estabas seguro."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Estás a punto de eliminar un contenido de otro usuario. Proceder con "
diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
index eaa18426..b805cca5 100644
--- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
index 16939306..ba5c639d 100644
--- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
@@ -3,6 +3,8 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# <a5565930@nepwk.com>, 2011.
+# <chesuidayeur@yahoo.fr>, 2011.
# <joehillen@gmail.com>, 2011.
# <marktraceur@gmail.com>, 2011.
# <maxineb@members.fsf.org>, 2011.
@@ -12,9 +14,9 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
-"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"POT-Creation-Date: 2011-12-04 10:24-0600\n"
+"PO-Revision-Date: 2011-12-29 17:39+0000\n"
+"Last-Translator: ianux <a5565930@nepwk.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -23,6 +25,10 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Le fichier envoyé ne correspond pas au type de média."
+
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Nom d'utilisateur"
@@ -42,7 +48,7 @@ msgstr "Confirmer le mot de passe"
#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
-"Tapez-le à nouveau ici pour vous assurer qu'il n'ya pas de fautes "
+"Tapez-le à nouveau ici pour vous assurer qu'il n'y a pas de fautes "
"d'orthographe."
#: mediagoblin/auth/forms.py:42
@@ -58,8 +64,8 @@ msgid "Sorry, a user with that name already exists."
msgstr "Un utilisateur existe déjà avec ce nom, désolé."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Désolé, cette adresse courriel a déjà été prise."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Désolé, il existe déjà un utilisateur ayant cette adresse e-mail."
#: mediagoblin/auth/views.py:179
msgid ""
@@ -73,15 +79,26 @@ msgstr ""
msgid "The verification key or user id is incorrect"
msgstr "La clé de vérification ou le nom d'utilisateur est incorrect."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:203
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"Vous devez être authentifié afin que nous sachions à qui envoyer l'e-mail !"
+
+#: mediagoblin/auth/views.py:211
+msgid "You've already verified your email address!"
+msgstr "Votre adresse e-mail a déjà été vérifiée !"
+
+#: mediagoblin/auth/views.py:224
msgid "Resent your verification email."
msgstr "E-mail de vérification renvoyé."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:265
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+"Impossible d'envoyer un email de récupération de mot de passe : votre compte"
+" est inactif ou bien l'email de votre compte n'a pas été vérifiée."
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
@@ -91,46 +108,68 @@ msgstr "Titre"
msgid "Tags"
msgstr "Tags"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34
+msgid "Seperate tags by commas."
+msgstr "Séparez les tags par des virgules."
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Légende"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "La légende ne peut pas être laissée vide."
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:35
msgid ""
"The title part of this media's URL. You usually don't need to change this."
msgstr ""
+"Le nom de ce media dans l'URL. Vous n'avez normalement pas besoin de le "
+"changer"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Site web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:49
+msgid "Old password"
+msgstr "Ancien mot de passe."
+
+#: mediagoblin/edit/forms.py:52
+msgid "New Password"
+msgstr "Nouveau mot de passe"
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Une entrée existe déjà pour cet utilisateur avec la même légende."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
"Vous vous apprêtez à modifier le média d'un autre utilisateur. Veuillez "
"prendre garde."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
"Vous vous apprêtez à modifier le profil d'un utilisateur. Veuillez prendre "
"garde."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Invalide fichier donné pour le type de média."
+#: mediagoblin/edit/views.py:171
+msgid "Wrong password"
+msgstr "Mauvais mot de passe"
+
+#: mediagoblin/edit/views.py:192
+msgid "Profile edited!"
+msgstr "Profile mis à jour !"
+
+#: mediagoblin/media_types/__init__.py:65
+msgid "Could not find any file extension in \"{filename}\""
+msgstr "Impossible d'extraire une extension de fichier de \"{nomfichier}\""
#: mediagoblin/submit/forms.py:25
msgid "File"
@@ -138,27 +177,27 @@ msgstr "Fichier"
#: mediagoblin/submit/forms.py:30
msgid "Description of this work"
-msgstr ""
+msgstr "Descriptif pour ce travail"
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:49
msgid "You must provide a file."
msgstr "Il vous faut fournir un fichier."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Ce fichier ne semble pas être une image !"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:127
msgid "Woohoo! Submitted!"
msgstr "Youhou, c'est envoyé !"
+#: mediagoblin/submit/views.py:133
+msgid "Invalid file type."
+msgstr "Type de fichier invalide."
+
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
-msgstr "Zut!"
+msgstr "Zut !"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr "Il ne semble pas être une page à cette adresse. Désolé!"
+msgstr "Il ne semble pas y avoir de page à cette adresse. Désolé !"
#: mediagoblin/templates/mediagoblin/404.html:26
msgid ""
@@ -166,128 +205,113 @@ msgid ""
" been moved or deleted."
msgstr ""
"Si vous êtes sûr que l'adresse est correcte, peut-être la page que vous "
-"recherchez a été déplacé ou supprimé."
+"recherchez a été déplacée ou supprimée."
#: mediagoblin/templates/mediagoblin/404.html:32
msgid "Image of 404 goblin stressing out"
-msgstr "Image de 404 gobelin stresser"
+msgstr "Image de 404 gobelin angoissé"
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:49
msgid "MediaGoblin logo"
msgstr "Logo MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
+#: mediagoblin/templates/mediagoblin/base.html:54
msgid "Submit media"
msgstr "Soumettre un média"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "vérifiez votre adresse e-mail !"
+#: mediagoblin/templates/mediagoblin/base.html:65
+msgid "Verify your email!"
+msgstr "Vérifiez votre adresse e-mail !"
+
+#: mediagoblin/templates/mediagoblin/base.html:72
+msgid "log out"
+msgstr "déconnexion"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "S'identifier"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:91
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
-"Propulsé par <a href=\"http://mediagoblin.org\">MediaGoblin</a> , un <a "
-"href=\"http://gnu.org/\">GNU</a> de projet"
+"Propulsé par <a href=\"http://mediagoblin.org\">MediaGoblin</a> , un projet "
+"<a href=\"http://gnu.org/\">GNU</a>"
#: mediagoblin/templates/mediagoblin/root.html:24
msgid "Explore"
-msgstr ""
+msgstr "Explorer"
#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Salut à tous, amateur de médias! MediaGoblin est ..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "L'endroit idéal pour vos médias!"
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Bonjour, et bienvenu sur ce site MediaGoblin !"
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Un lieu pour les personnes de collaborer et de montrer des créations "
-"originales et dérivées!"
+"Ce site fait tourner <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un "
+"logiciel d'hébergement de média extraordinairement génial."
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Logiciel libre. (Nous sommes une <a href=\"http://gnu.org\">GNU</a> projet, "
-"après tout.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Visant à rendre le monde meilleur grâce à la décentralisation et "
-"(éventuellement, venir bientôt!) fédération!"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Construit pour l'extensibilité. (Plusieurs types de médias à venir au "
-"logiciel, y compris le support vidéo!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Propulsé par des gens comme vous. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Vous pouvez nous aider à "
-"améliorer ce logiciel!</a>)"
+"Ajoutez vos propres medias, commentez ceux des autres, sauvegardez vos "
+"préférés et plus encore ! Faites tout cela depuis votre compte MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Vous n'en avez pas ? C'est facile !"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Créez un compte sur ce site</a>\n"
+" ou\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Déployez MediaGoblin sur votre propre serveur</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:44
msgid "Most recent media"
-msgstr ""
+msgstr "Tout derniers media"
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
msgid "Enter your new password"
-msgstr ""
+msgstr "Entrez un nouveau mot de passe"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Submit"
+msgstr "Soumettre"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Récupérer le mot de passe"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Envoyer les instructions"
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
msgid "Your password has been changed. Try to log in now."
msgstr ""
+"Votre mot de passe a été changé. Essayez maintenant de vous identifier."
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
msgid ""
"Check your inbox. We sent an email with a URL for changing your password."
msgstr ""
+"Verifiez votre boîte de réception. Nous vous avons envoyé un email avec une "
+"URL vous permettant de changer votre mot de passe."
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -302,30 +326,35 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
+"Bonjour %(username)s,\n"
+"\n"
+"Pour changer votre mot de passe GNU MediaGoblin, ouvrez l'URL suivante dans \n"
+"votre navigateur internet :\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"Si vous pensez qu'il s'agit d'une erreur, ignorez simplement cet email et restez\n"
+"un goblin heureux !"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
-msgstr "Connexion a échoué!"
+msgstr "La connexion a échoué!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
-msgstr "Pas encore de compte?"
+msgstr "Pas encore de compte ?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
-msgstr "Créez-en un ici!"
+msgstr "Créez-en un ici !"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
+msgstr "Vous avez oublié votre mot de passe ?"
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
-msgstr "Créer un compte!"
+msgstr "Créer un compte !"
#: mediagoblin/templates/mediagoblin/auth/register.html:31
msgid "Create"
@@ -367,27 +396,54 @@ msgstr "Enregistrer les modifications"
msgid "Editing %(username)s's profile"
msgstr "Modification du profil de %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Média comportant les tags suivants :"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Médias taggés avec : %(tag_name)s "
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:19
+msgid "Original"
+msgstr "Original"
#: mediagoblin/templates/mediagoblin/submit/start.html:26
msgid "Submit yer media"
msgstr "Soumettez ce média"
-#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Soumettre"
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Medias de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Médias de <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Impossible de trouver cet utilisateur, désolé."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:57
+#, python-format
+msgid "By <a href=\"%(user_url)s\">%(username)s</a> on %(date)s"
+msgstr "Par <a href=\"%(user_url)s\">%(username)s</a> le %(date)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:67
+msgid "Post a comment"
+msgstr "Poster un commentaire"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:85
+msgid "at"
+msgstr "à"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
+msgid "Post comment!"
+msgstr "Poster le commentaire !"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:124
+msgid "Edit"
+msgstr "Éditer"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:130
+msgid "Delete"
+msgstr "Effacer"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -396,7 +452,7 @@ msgstr "Voulez-vous vraiment supprimer %(title)s ?"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
msgid "Delete Permanently"
-msgstr ""
+msgstr "Supprimer définitivement"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
@@ -419,33 +475,43 @@ msgstr "Aucun média en transformation"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
-msgstr "Ces ajouts n'etaient pas processé:"
+msgstr "Le traitement de ces ajouts a échoué :"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "profil de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Impossible de trouver cet utilisateur, désolé."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Vérification d'email nécessaire"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
-msgstr "Presque fini! Votre compte a encore besoin d'être activé."
+msgstr "Presque fini ! Votre compte a encore besoin d'être activé."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Un e-mail devrait vous parvenir dans quelques instants ; il vous indiquera "
"comment procéder."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Si la vérification n'est pas arrivée à bon port :"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Renvoyer l'e-mail de vérification"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -453,7 +519,7 @@ msgstr ""
"Quelqu'un a enregistré un compte avec ce nom, mais il doit encore être "
"activé."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -463,48 +529,43 @@ msgstr ""
"vérification, vous pouvez vous <a href=\"%(login_url)s\">identifier</a> et "
"le renvoyer."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "profil de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Voici un endroit pour parler aux autres de vous-même."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:119
msgid "Edit profile"
msgstr "Modifier le profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:107
msgid "This user hasn't filled in their profile (yet)."
-msgstr "Cet utilisateur n'a pas rempli leur profil (encore)."
+msgstr "Cet utilisateur n'a pas (encore) rempli son profil."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:133
#, python-format
msgid "View all of %(username)s's media"
msgstr "Voir tous les médias de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:146
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-"C'est là où vos médias apparaît, mais vous ne semblez pas avoir quoi que ce "
-"soit encore ajouté."
+"C'est là où vos médias apparaîssent, mais vous ne semblez pas avoir encore "
+"ajouté quoi que ce soit."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:152
msgid "Add media"
msgstr "Ajouter des médias"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:158
msgid "There doesn't seem to be any media here yet..."
-msgstr "Il ne semble pas être un média encore là ..."
+msgstr "Il ne semble pas y avoir de média là, pour l'instant ..."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
-msgstr "icon de flux"
+msgstr "icone de flux"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
@@ -512,11 +573,23 @@ msgstr "flux Atom"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
msgid "Newer"
-msgstr ""
+msgstr "Nouveaux"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
msgid "Older"
-msgstr ""
+msgstr "Anciens"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:50
+msgid "Go to page:"
+msgstr "Aller à la page :"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "Tagged with"
+msgstr "Taggé avec"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "and"
+msgstr "et"
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
@@ -524,17 +597,27 @@ msgstr "Commentaire"
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
-msgstr ""
+msgstr "Je suis sûr de vouloir supprimer cela"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Oups, votre commentaire était vide."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Votre commentaire a été posté !"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Vous avez supprimé le media."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"Ce media n'a pas été supprimé car vous n'avez pas confirmer que vous étiez "
+"sur."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Vous êtes sur le point de supprimer des médias d'un autre utilisateur. "
diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
index feb156ff..94b378d2 100644
--- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
index d9fdf8d6..56f74573 100644
--- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: ia\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nomine de usator"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Contrasigno"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Adresse de e-posta"
@@ -52,95 +44,163 @@ msgid "Sorry, a user with that name already exists."
msgstr ""
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
+msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titulo"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Sito web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/submit/forms.py:25
-msgid "File"
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
msgstr ""
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
msgstr ""
-#: mediagoblin/submit/views.py:46
-msgid "You must provide a file."
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
+#: mediagoblin/submit/forms.py:25
+msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:50
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr ""
@@ -154,33 +214,30 @@ msgid ""
" been moved or deleted."
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:47
-msgid "MediaGoblin logo"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Initiar session"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -190,76 +247,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
+msgid "Don't have one yet? It's easy!"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -280,27 +313,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Crear un conto!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr ""
@@ -326,35 +355,113 @@ msgid "Cancel"
msgstr "Cancellar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
+msgid "Add your media"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
+msgid "Add"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
@@ -387,75 +494,81 @@ msgstr ""
msgid "These uploads failed to process:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profilo de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profilo de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
@@ -467,31 +580,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Commento"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
index cc0ccbfa..d5fb3eac 100644
--- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
index 183d09ed..6a8b8b65 100644
--- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
@@ -1,15 +1,16 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# <pikappa469@alice.it>, 2011.
# <robi@nunnisoft.ch>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +20,19 @@ msgstr ""
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "documento non valido come tipo multimediale."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nome utente"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Password"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Le password devono coincidere"
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Conferma password"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Scrivilo ancora qui per assicurarti che non ci siano errori"
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Indirizzo email"
@@ -52,10 +45,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Spiacente, esiste già un utente con quel nome"
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Spiacente, quell'indirizzo email è già stato preso."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Siamo spiacenti, un utente con quell'indirizzo email esiste già."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,88 +56,159 @@ msgstr ""
"Il tuo indirizzo email è stato verificato. Puoi ora fare login, modificare "
"il tuo profilo, e inserire immagini!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "La chiave di verifica o l'id utente è sbagliato"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"Devi entrare col tuo profilo così possiamo sapere a chi inviare l'email!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Hai già verificato il tuo indirizzo email!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Rispedisci email di verifica"
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+"Impossibile inviare l'email di recupero password perchè il tuo nome utente è"
+" inattivo o il tuo account email non è stato verificato."
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titolo"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Descrizione di questo lavoro"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Tags"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Sito web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Password vecchia"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
"Stai modificando documenti multimediale di un altro utente. Procedi con "
"attenzione."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Stai modificando il profilo di un utente. Procedi con attenzione."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "documento non valido come tipo multimediale."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Password errata"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Documento"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Descrizione di questo lavoro"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Devi specificare un documento."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Il documento non sembra essere un'immagine!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Evviva! "
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Immagine di 404 folletti che stressano"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Oops!"
@@ -160,33 +224,30 @@ msgstr ""
"Se sei sicuro che l'indirizzo è corretto, forse la pagina che stai cercando "
"è stata spostata o cancellata."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Immagine di 404 folletti che stressano"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin logo"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Inoltra file multimediale"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Aggiungi documenti multimediali"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Verifica la tua email!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "verifica il tuo indirizzo email!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "disconnettiti"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Accedi"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -198,86 +259,59 @@ msgstr ""
msgid "Explore"
msgstr "Esplora"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Ciao, amante del multimedia! MediaGoblin è..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Ciao, benvenuto a questo sito MediaGoblin!"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Il posto perfetto per i tuoi documenti multimediali!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Un posto per collaborare con altri e mostrare le proprie creazioni originali"
-" e derivate!"
+"questo sito sta utilizzando <a "
+"href=\"http://mediagoblin.org\">Mediagoblin</a>, un ottimo programma di "
+"media hosting."
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Libero, come in libertà. (Siamo un progetto <a "
-"href=\"http://gnu.org\">GNU</a>, dopotutto.)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Con l'obbiettivo di rendere il mondo un posto migliore attraverso la "
-"decentrelizzazione e (finalmente, presto!) federazione!"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Fatto per estensibilità. (Numerosi tipi multimediali saranno presto aggiunti"
-" al programma, incluso il supporto video!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
+"Per aggiungere i tuoi file, scrivere commenti, salvare i tuoi preferiti e "
+"altro, devi entrare col tuo profilo MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Eccitato di unirti a noi?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Non ne hai già uno? E' semplice!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Documenti multimediali più recenti"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Inserisci la tua nuova password"
-
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Inserisci il tuo nome utente o email"
-
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Recupera Password"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Invia istruzioni"
+
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
msgid ""
@@ -291,32 +325,36 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
+"Ciao %(username)s,\n"
+"per cambiare la tua password MediaGoblin apri il seguente URL\n"
+"nel tuo web browser:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"Se pensi che sia un errore, ignora semplicemente questa email e continua ad essere \n"
+"un goblin felice!"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "Accesso fallito!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Non hai ancora un account?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Creane uno qui!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Hai dimenticato la password?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Crea un account!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Crea"
@@ -347,36 +385,114 @@ msgid "Cancel"
msgstr "Annulla"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Salva i cambiamenti"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Stai modificando il profilo di %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Media taggata con:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "file taggato con:%(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Originale"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Inoltra documento multimediale"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Conferma"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "file di %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Documenti multimediali di <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Mi dispiace, utente non trovato"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Modifica"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Elimina"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "a"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -408,30 +524,40 @@ msgstr "Nessun documento multimediale in elaborazione"
msgid "These uploads failed to process:"
msgstr "L'elaborazione di questi upload è fallita:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "profilo di %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Mi dispiace, utente non trovato"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "è necessario verificare email"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Quasi finito! Il tuo account deve ancora essere attivato."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"In breve dovresti ricevere un email contenente istruzioni su come fare."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Nel caso non fosse:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Rispedisci email di verifica"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -439,7 +565,7 @@ msgstr ""
"Qualcuno ha registrato un account con questo nome utente, ma deve ancora "
"essere attivato."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -448,30 +574,29 @@ msgstr ""
"Se sei quella persona ma hai perso l'email di verifica, puoi <a "
"href=\"%(login_url)s\">accedere</a> e rispedirlo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "profilo di %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Ecco un posto dove raccontare agli altri di te."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Modifica profilo"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Questo utente non ha (ancora) compilato il proprio profilo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Visualizza tutti i file multimediali di %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
@@ -479,11 +604,8 @@ msgstr ""
"Questo è dove i tuoi documenti multimediali appariranno, ma sembra che tu "
"non abbia ancora aggiunto niente."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Aggiungi documenti multimediali"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Non sembra ci sia ancora nessun documento multimediali qui.."
@@ -495,31 +617,58 @@ msgstr "feed icon"
msgid "Atom feed"
msgstr "Atom feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Più nuovo"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Più vecchio"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Commento"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Vai alla pagina:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Sono sicuro di volerlo cancellare"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Oops, il tuo commento era vuoto."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Il tuo commento è stato aggiunto!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Hai cancellato il file"
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"Il file non è stato eliminato perchè non hai confermato di essere sicuro."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Stai cancellando un documento multimediale di un altro utente. Procedi con "
diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
index 5267eddc..21aeed26 100644
--- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
index 59262d82..7ed8652b 100644
--- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "ユーザãƒãƒ¼ãƒ "
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "パスワード"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "パスワードãŒä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "パスワードを確èª"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "メールアドレス"
@@ -52,95 +44,163 @@ msgid "Sorry, a user with that name already exists."
msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãã®åå‰ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã™ã§ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚"
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
+msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "メアドãŒç¢ºèªã•れã¦ã„ã¾ã™ã€‚ã“れã§ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãƒ—ロファイルを編集ã—ã€ç”»åƒã‚’æå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "検証キーã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼IDãŒé–“é•ã£ã¦ã„ã¾ã™"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "検証メールをå†é€ã—ã¾ã—ãŸã€‚"
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "タイトル"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "ã‚¿ã‚°"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "スラグ"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "スラグã¯å¿…è¦ã§ã™ã€‚"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "自己紹介"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "URL"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "ãã®ã‚¹ãƒ©ã‚°ã‚’æŒã¤ã‚¨ãƒ³ãƒˆãƒªã¯ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "ã‚ãªãŸã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集ã—ã¦ã„ã¾ã™ã€‚ã”æ³¨æ„ãã ã•ã„。"
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "ã‚ãªãŸã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ—ロファイルを編集ã—ã¦ã„ã¾ã™ã€‚ã”æ³¨æ„ãã ã•ã„。"
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "ファイル"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr ""
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "ファイルをæä¾›ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "ファイルãŒç”»åƒã§ã¯ãªã„よã†ã§ã™ï¼"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "投稿終了ï¼"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr ""
@@ -154,33 +214,30 @@ msgid ""
" been moved or deleted."
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
-msgid "MediaGoblin logo"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "コンテンツを投稿"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "メアドを確èªã—ã¦ãã ã•ã„ï¼"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "ログイン"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -190,76 +247,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
+msgid "Don't have one yet? It's easy!"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -280,27 +313,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "ã¾ã ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’æŒã£ã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "ã“ã“ã§ä½œæˆï¼"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "アカウントを作æˆï¼"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr ""
@@ -331,36 +360,114 @@ msgid "Cancel"
msgstr "キャンセル"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "投稿ã™ã‚‹"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "%(username)sã•ã‚“ã®ãƒ—ロフィールを編集中"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "タグ付ã‘ã•れãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "コンテンツを投稿"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "é€ä¿¡"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>ã•ã‚“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -392,75 +499,81 @@ msgstr ""
msgid "These uploads failed to process:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)sã•ã‚“ã®ãƒ—ロフィール"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "メールã¯ã€ãã®æ–¹æ³•ã®æŒ‡ç¤ºã§ã„ãã¤ã‹ã®çž¬é–“ã«åˆ°ç€ã—ã¾ã™ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "到ç€ã—ãªã„å ´åˆã¯ã€"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "確èªãƒ¡ãƒ¼ãƒ«ã‚’å†é€ä¿¡"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr "ã‚ãªãŸã®ç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’紛失ã—ãŸå ´åˆã€<a href=\"%(login_url)s\">ログイン</a>ã—ã¦å†é€ã§ãã¾ã™ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)sã•ã‚“ã®ãƒ—ロフィール"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "プロフィールを編集"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "%(username)sã•ã‚“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’ã™ã¹ã¦è¦‹ã‚‹"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
@@ -472,31 +585,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
index e6d1976b..4d03c586 100644
--- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
index 618daf6f..7b63a859 100644
--- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
@@ -3,14 +3,14 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# <mail@jefvanschendel.nl>, 2011.
+# <mail@jefvanschendel.nl>, 2011, 2012.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
-"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"POT-Creation-Date: 2011-12-04 10:24-0600\n"
+"PO-Revision-Date: 2012-01-04 18:42+0000\n"
+"Last-Translator: schendje <mail@jefvanschendel.nl>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,6 +19,10 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Verkeerd bestandsformaat voor mediatype opgegeven."
+
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Gebruikersnaam"
@@ -37,7 +41,7 @@ msgstr "Bevestig wachtwoord"
#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
+msgstr "Typ het hier nog een keer om spelfouten te voorkomen."
#: mediagoblin/auth/forms.py:42
msgid "Email address"
@@ -52,8 +56,8 @@ msgid "Sorry, a user with that name already exists."
msgstr "Sorry, er bestaat al een gebruiker met die naam."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Sorry, dat e-mailadres is al ingenomen."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Sorry, een gebruiker met dat e-mailadres bestaat al."
#: mediagoblin/auth/views.py:179
msgid ""
@@ -67,15 +71,27 @@ msgstr ""
msgid "The verification key or user id is incorrect"
msgstr "De verificatie sleutel of gebruikers-ID is onjuist"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:203
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"Je moet ingelogd zijn, anders weten we niet waar we de e-mail naartoe moeten"
+" sturen!"
+
+#: mediagoblin/auth/views.py:211
+msgid "You've already verified your email address!"
+msgstr "Je hebt je e-mailadres al geverifieerd!"
+
+#: mediagoblin/auth/views.py:224
msgid "Resent your verification email."
msgstr "Verificatie e-mail opnieuw opgestuurd."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:265
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+"Email kon niet verstuurd worden omdat je gebruikersnaam inactief is of omdat"
+" je e-mailadres nog niet geverifieerd is."
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
@@ -85,45 +101,67 @@ msgstr "Titel"
msgid "Tags"
msgstr "Etiket"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34
+msgid "Seperate tags by commas."
+msgstr "Scheidt labels met komma's."
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
-msgstr ""
+msgstr "Slug"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
-msgstr ""
+msgstr "De slug kan niet leeg zijn"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:35
msgid ""
"The title part of this media's URL. You usually don't need to change this."
msgstr ""
+"Het titeldeel van het adres van deze media. Meestal hoef je dit niet aan te "
+"passen."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Website"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:49
+msgid "Old password"
+msgstr "Oud wachtwoord"
+
+#: mediagoblin/edit/forms.py:52
+msgid "New Password"
+msgstr "Nieuw wachtwoord"
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
-msgstr ""
+msgstr "Er bestaat al een met die slug voor deze gebruiker."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
"U bent de media van een andere gebruiker aan het aanpassen. Ga voorzichtig "
"te werk."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
"U bent een gebruikersprofiel aan het aanpassen. Ga voorzichtig te werk."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr ""
+#: mediagoblin/edit/views.py:171
+msgid "Wrong password"
+msgstr "Verkeerd wachtwoord"
+
+#: mediagoblin/edit/views.py:192
+msgid "Profile edited!"
+msgstr "Profiel aangepast!"
+
+#: mediagoblin/media_types/__init__.py:65
+msgid "Could not find any file extension in \"{filename}\""
+msgstr "Kon geen bestandsformaat voor \"{filename}\" vinden"
#: mediagoblin/submit/forms.py:25
msgid "File"
@@ -131,141 +169,141 @@ msgstr "Bestand"
#: mediagoblin/submit/forms.py:30
msgid "Description of this work"
-msgstr ""
+msgstr "Beschrijving van dit werk"
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:49
msgid "You must provide a file."
msgstr "U moet een bestand aangeven."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Het lijkt erop dat dit bestand geen afbeelding is!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:127
msgid "Woohoo! Submitted!"
msgstr "Mooizo! Toegevoegd!"
+#: mediagoblin/submit/views.py:133
+msgid "Invalid file type."
+msgstr "Ongeldig bestandstype"
+
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
-msgstr ""
+msgstr "Oeps!"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr ""
+msgstr "Het lijkt erop dat er geen pagina bestaat op dit adres. Sorry!"
#: mediagoblin/templates/mediagoblin/404.html:26
msgid ""
"If you're sure the address is correct, maybe the page you're looking for has"
" been moved or deleted."
msgstr ""
+"Als je zeker weet dat het adres klopt is de pagina misschien verplaatst of "
+"verwijderd."
#: mediagoblin/templates/mediagoblin/404.html:32
msgid "Image of 404 goblin stressing out"
-msgstr ""
+msgstr "Afbeelding van de 404 goblin onder stress"
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:49
msgid "MediaGoblin logo"
-msgstr ""
+msgstr "MediaGoblin logo"
-#: mediagoblin/templates/mediagoblin/base.html:52
+#: mediagoblin/templates/mediagoblin/base.html:54
msgid "Submit media"
msgstr "Voeg media toe"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Controleer uw e-mail!"
+#: mediagoblin/templates/mediagoblin/base.html:65
+msgid "Verify your email!"
+msgstr "Verifieer je e-mailadres!"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:72
+msgid "log out"
+msgstr "uitloggen"
+
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Inloggen"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:91
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+"Aangedreven door &lt;a "
+"href=\"http://mediagoblin.org\"&gt;MediaGoblin&lt;/a&gt; , een &lt;a "
+"href=\"http://gnu.org/\"&gt;GNU-project&lt;/a&gt;"
#: mediagoblin/templates/mediagoblin/root.html:24
msgid "Explore"
-msgstr ""
+msgstr "Verkennen"
#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr ""
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Hoi, welkom op deze MediaGoblin website!"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
+"Deze website draait <a href=\"http://mediagoblin.org\">MediaGoblin</a>, een "
+"buitengewoon goed stuk software voor mediahosting."
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
+"Om je eigen media toe te voegen, berichten te plaatsen, favorieten op te "
+"slaan en meer, kun je inloggen met je MediaGoblin account."
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
+msgid "Don't have one yet? It's easy!"
+msgstr "Heb je er nog geen? Het is heel eenvoudig!"
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Creëer een account op deze website</a>\n"
+" of\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Gebruik MediaGoblin op je eigen server</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:44
msgid "Most recent media"
-msgstr ""
+msgstr "Nieuwste media"
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
msgid "Enter your new password"
-msgstr ""
+msgstr "Voer je nieuwe wachtwoord in"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Submit"
+msgstr "Voeg toe"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Wachtwoord herstellen"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Stuur instructies"
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
msgid "Your password has been changed. Try to log in now."
-msgstr ""
+msgstr "Je wachtwoord is veranderd. Probeer om opnieuw in te loggen."
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
msgid ""
"Check your inbox. We sent an email with a URL for changing your password."
msgstr ""
+"Check je inbox. Er is een e-mail verstuurd waarmee je je wachtwoord kunt "
+"veranderen."
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -280,26 +318,29 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
+"Hoi %(username)s,\n"
+"\n"
+"Om je wachtwoord voor GNU MediaGoblin te veranderen, moet je dit adres in je webbrowser openen:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"Als je denkt dat dit niet klopt, kun je deze e-mail gewoon negeren."
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
-msgstr ""
+msgstr "Inloggen is mislukt!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Heeft u nog geen account?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Maak er hier een!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
+msgstr "Wachtwoord vergeten?"
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
@@ -307,7 +348,7 @@ msgstr "Maak een account aan!"
#: mediagoblin/templates/mediagoblin/auth/register.html:31
msgid "Create"
-msgstr ""
+msgstr "Creëer"
#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19
#, python-format
@@ -342,89 +383,128 @@ msgstr "Wijzigingen opslaan"
msgid "Editing %(username)s's profile"
msgstr "Het profiel aanpassen van %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Media met het etiket:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Media met het label: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:19
+msgid "Original"
+msgstr "Origineel"
#: mediagoblin/templates/mediagoblin/submit/start.html:26
msgid "Submit yer media"
msgstr "Voeg media toe"
-#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Voeg toe"
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Media van %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Media van <a href=\"%(user_url)s\"> %(username)s </a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Sorry, die gebruiker kon niet worden gevonden."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:57
+#, python-format
+msgid "By <a href=\"%(user_url)s\">%(username)s</a> on %(date)s"
+msgstr "Door <a href=\"%(user_url)s\">%(username)s</a> op %(date)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:67
+msgid "Post a comment"
+msgstr "Plaats een bericht"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:85
+msgid "at"
+msgstr "op"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
+msgid "Post comment!"
+msgstr "Plaats bericht!"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:124
+msgid "Edit"
+msgstr "Pas aan"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:130
+msgid "Delete"
+msgstr "Verwijderen"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "Zeker weten dat je %(title)s wil verwijderen?"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
msgid "Delete Permanently"
-msgstr ""
+msgstr "Permanent verwijderen"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
-msgstr ""
+msgstr "Mediaverwerkingspaneel"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
msgid ""
"You can track the state of media being processed for your gallery here."
-msgstr ""
+msgstr "Hier kun je de status zien van de media die verwerkt worden."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
msgid "Media in-processing"
-msgstr ""
+msgstr "Media te verwerken"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
-msgstr ""
+msgstr "Geen media om te verwerken"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
-msgstr ""
+msgstr "Deze toevoegingen konden niet verwerkt worden:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profiel van %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Sorry, die gebruiker kon niet worden gevonden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr ""
+msgstr "Emailverificatie is nodig"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
-msgstr ""
+msgstr "Bijna klaar! Je account moet nog geactiveerd worden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Een e-mail zou in een paar ogenblikken aan moeten komen met instructies "
"hiertoe."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Zoniet:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Stuur de verificatie e-mail opnieuw op."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
+"Iemand heeft een account met deze gebruikersnaam gemaakt, maar hij moet nog "
+"geactiveerd worden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -433,58 +513,67 @@ msgstr ""
"Als u die persoon bent, maar de verificatie e-mail verloren hebt, kunt u <a "
"href=\"%(login_url)s\">inloggen</a> en hem nogmaals verzenden."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profiel van %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
-msgstr ""
+msgstr "Hier is een plekje om anderen over jezelf te vertellen."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:119
msgid "Edit profile"
msgstr "Profiel aanpassen."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:107
msgid "This user hasn't filled in their profile (yet)."
-msgstr ""
+msgstr "Deze gebruiker heeft zijn of haar profiel (nog) niet ingevuld."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:133
#, python-format
msgid "View all of %(username)s's media"
msgstr "Bekijk alle media van %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:146
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
+"Dit is waar je nieuwe media zal verschijnen, maar het lijkt erop dat je nog "
+"niets heb toegevoegd."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:152
msgid "Add media"
-msgstr ""
+msgstr "Voeg media toe"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:158
msgid "There doesn't seem to be any media here yet..."
-msgstr ""
+msgstr "Het lijkt erop dat er nog geen media is."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
-msgstr ""
+msgstr "feed icoon"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
-msgstr ""
+msgstr "Atom feed"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
msgid "Newer"
-msgstr ""
+msgstr "Nieuwer"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
msgid "Older"
-msgstr ""
+msgstr "Ouder"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:50
+msgid "Go to page:"
+msgstr "Ga naar pagina:"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "Tagged with"
+msgstr "Gelabeld met"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "and"
+msgstr "en"
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
@@ -492,18 +581,29 @@ msgstr "Commentaar"
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
-msgstr ""
+msgstr "Ik weet zeker dat ik dit wil verwijderen."
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Oeps, je bericht was leeg."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Je bericht is geplaatst!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Je hebt deze media verwijderd."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
+"Deze media was niet verwijderd omdat je niet hebt aangegeven dat je het "
+"zeker weet."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+"Je staat op het punt de media van iemand anders te verwijderen. Pas op."
diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
index ba427c29..11b00041 100644
--- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
index c74e1dd0..dcc82f90 100644
--- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: nn_NO\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Ugyldig fil for mediatypen."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Brukarnamn"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Passord"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Passorda må vera like."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Gjenta passord"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Skriv passordet omatt for å unngå stavefeil."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Epost"
@@ -52,10 +44,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Ein konto med dette brukarnamnet finst allereide."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Den epostadressa er allereide teken."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,87 +55,155 @@ msgstr ""
"Kontoen din er stadfesta. Du kan no logga inn, endra profilen din og lasta "
"opp filer."
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Stadfestingsnykelen eller brukar-ID-en din er feil."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Send ein ny stadfestingsepost."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
"Kunne ikkje senda epost. Brukarnamnet ditt er inaktivt eller uverifisert."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Tittel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Skildring av mediefila"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Merkelappar"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Nettnamn"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Nettnamnet kan ikkje vera tomt"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
-msgstr "Nettnamnet (adressetittel) for mediefila di. Trengst ikkje endrast."
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Presentasjon"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Heimeside"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Eit innlegg med denne adressetittelen finst allereie."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Trå varsamt, du endrar nokon andre sine mediefiler."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Trå varsamt, du endrar nokon andre sin profil."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Ugyldig fil for mediatypen."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Skildring av mediefila"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Du må velja ei fil."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Fila verkar ikkje å vera ei gyldig biletefil."
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Johoo! Opplasta!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Bilete av stressa 404-tusse."
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Oops."
@@ -159,33 +219,30 @@ msgstr ""
"Er du sikker på at adressa er korrekt, so er sida truleg flytta eller "
"sletta."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Bilete av stressa 404-tusse."
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Last opp"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Legg til mediefiler"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Stadfest epostadressa di"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Logg inn"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -197,91 +254,53 @@ msgstr ""
msgid "Explore"
msgstr "Utforsk"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Hei der mediaentusiast, MediaGoblin..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Er ein perfekt plass for mediet ditt!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-"Er ein plass for folk å samarbeida og visa fram sjølvlaga og vidarebygde "
-"verk."
-#: mediagoblin/templates/mediagoblin/root.html:31
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr "Fri som i fridom (me er eit <a href=\"http://gnu.org\">GNU</a>-prosjekt)."
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Arbeidar for å gjera verda ein betre stad gjennom desentralisering og (til "
-"slutt, kjem snart!) federering, enkelt forklart deling og sending av "
-"mediefiler og kommentarar over fleire nettstader."
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr "Bygd for utviding (fleire medietypar kjem snart, m.a. video)."
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Driven av folk som deg. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Du kan hjelpa med å forbetra"
-" MediaGoblin</a>)"
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Lyst til å bli med oss?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Opprett ein "
-"gratis konto</a> eller <a class=\"header_submit\" "
-"href=\"http://wiki.mediagoblin.org/HackingHowto\">installer MediaGoblin på "
-"eigen tenar</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Nyaste mediefiler"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Fyll inn passord"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Fyll inn brukarnamn eller epost"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Passordet endra. Prøv å logga inn no."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
-"Sjekk innboksen din. Me har sendt deg ein epost med ei netadresse for "
-"passordendring."
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -308,27 +327,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Innlogging feila"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Har du ingen konto?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Lag ein!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Gløymd passordet?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Endra"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Lag ein konto."
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Opprett"
@@ -359,36 +374,114 @@ msgid "Cancel"
msgstr "Bryt av"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Lagra"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Endrar profilen til %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Merkelappar:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Last opp"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Send"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a> sine mediefiler"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Fann ingen slik brukar"
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -420,35 +513,45 @@ msgstr "Ingen media under handsaming"
msgid "These uploads failed to process:"
msgstr "Klarte ikkje handsama desse opplasta filene:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)s sin profil"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Fann ingen slik brukar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Epostverifisering trengst."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Nesten ferdig. Du treng berre aktivera kontoen."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "Ein epost med instruksjonar kjem straks."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "I tilfelle det ikkje skjer:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Send ein ny epost"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr "Dette brukarnamnet finst allereie, men det er ikkje aktivert."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -457,40 +560,36 @@ msgstr ""
"Viss dette er deg, kan du <a href=\"%(login_url)s\">logga inn</a> for å få "
"tilsendt ny epost med stadfestingslenkje."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)s sin profil"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Her kan du fortelja om deg sjølv."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Endra profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Brukaren har ikkje fylt ut profilen sin (enno)."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Sjå alle %(username)s sine mediefiler"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
-msgstr "Her kjem mediefilene dine. Ser ikkje ut til at du har lagt til noko."
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Legg til mediefiler"
+msgstr "Her kjem mediefilene dine."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Ser ikkje ut til at det finst nokon mediefiler her nett no."
@@ -502,31 +601,57 @@ msgstr " "
msgid "Atom feed"
msgstr "Atom-kjelde"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Nyare"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Eldre"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Innspel"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Eg er sikker eg vil sletta dette"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Du er i ferd med å sletta ein annan brukar sine mediefiler. Trå varsamt."
diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
index 31cb860c..5b7445f7 100644
--- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
index 047e598b..11400a2f 100644
--- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/mediagoblin/team/pt_BR/)\n"
"MIME-Version: 1.0\n"
@@ -20,28 +20,19 @@ msgstr ""
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Arquivo inválido para esse tipo de mídia"
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nome de Usuário"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Senha"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Senhas devem ser iguais."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Confirmar senha"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-"Digite novamente aqui para ter certeza que não houve erros de digitação"
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Endereço de email"
@@ -54,10 +45,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Desculpe, um usuário com este nome já existe."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Desculpe, esse endereço de email já está em uso."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Desculpe, um usuário com esse email já esta cadastrado"
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -65,15 +56,28 @@ msgstr ""
"O seu endereço de e-mail foi verificado. Você pode agora fazer login, editar"
" seu perfil, e enviar imagens!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "A chave de verificação ou nome usuário estão incorretos."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr " "
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Você já verifico seu email!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "O email de verificação foi reenviado."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -81,73 +85,127 @@ msgstr ""
"Não foi possível enviar o email de recuperação de senha, pois seu nome de "
"usuário está inativo ou o email da sua conta não foi confirmado."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Título"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Descrição desse trabalho"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Etiquetas"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Arquivo"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "O arquivo não pode estar vazio"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"A parte título da URL dessa mídia. Geralmente não é necessário alterar isso."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biografia"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Website"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Senha antiga"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Uma entrada com esse arquivo já existe para esse usuário"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Você está editando a mídia de outro usuário. Tenha cuidado."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Você está editando um perfil de usuário. Tenha cuidado."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Arquivo inválido para esse tipo de mídia"
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Senha errada"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Arquivo"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Descrição desse trabalho"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Você deve fornecer um arquivo."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "O arquivo não parece ser uma imagem!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Eba! Enviado!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Imagem do goblin 404 aparecendo"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Oops"
@@ -163,33 +221,30 @@ msgstr ""
"Se você está certo de que o endereço está correto, talvez a página que "
"esteja procurando tenha sido apagada ou mudou de endereço"
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Imagem do goblin 404 aparecendo"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Logo MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Enviar mídia"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Adicionar mídia"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
msgstr "Verifique seu email!"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "Sair"
+
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Entrar"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -201,93 +256,53 @@ msgstr ""
msgid "Explore"
msgstr "Explorar"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Olá amante de mídias. MediaGoblin é..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "O lugar perfeito para sua mídia!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Olá, bemvindo ao site de MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Um lugar para as pessoas colaborarem e mostrarem suas criações originais e "
-"derivadas!"
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Livre como a liberdade. (Afinal, somos um projeto <a "
-"href=\"http://gnu.org\">GNU</a>)"
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Com o objetivo de fazer um mundo melhor através da descentralização e "
-"(eventualmente, em breve) federação!"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Construído para extensibilidade. (Múltiplos tipos de mídia em breve, "
-"incluindo suporte a vídeo) "
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-"Desenvolvido por pessoas como você. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Você pode ajudar a melhorar "
-"esse software</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
+msgstr " "
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Animado para juntar-se a nós?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr " "
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\"> Crie uma conta grátis </a>\n"
-" ou <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Configure seu próprio servidor MediaGoblin</a>\n"
-" "
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Mídia mais recente"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Digite sua nova senha"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Digite seu nome de usuário ou email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Sua senha foi alterada. Tente entrar agora."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Recuperar senha"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Verifique sua caixa de entrada. Mandamos um email com a URL para troca da "
-"senha"
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Mandar instruções"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -315,27 +330,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Autenticação falhou"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Ainda não tem conta?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Crie uma aqui!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Esqueceu sua senha?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Altere-a"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Criar uma conta!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Criar"
@@ -366,36 +377,114 @@ msgid "Cancel"
msgstr "Cancelar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Salvar mudanças"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Editando perfil de %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Mídia marcada como:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Original"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Envie sua mídia"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Enviar"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Mídia de <a href=\"%(user_url)s\"> %(username)s </a> "
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Desculpe, esse usuário não foi encontrado."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Editar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Apagar"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -428,29 +517,39 @@ msgstr "Nenhuma mídia em processo"
msgid "These uploads failed to process:"
msgstr "Esses envios não foram processados:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Perfil de %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Desculpe, esse usuário não foi encontrado."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Verificação de email necessária"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Quase pronto! Sua conta ainda precisa ser ativada"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "Um email deve chegar em instantes com instruções de como fazê-lo."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Caso contrário:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Reenviar email de verificação"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -458,7 +557,7 @@ msgstr ""
"Alguém registrou uma conta com esse nome de usuário, mas ainda precisa ser "
"ativada."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -467,30 +566,29 @@ msgstr ""
"Se você é essa pessoa, mas você perdeu seu e-mail de verificação, você pode "
"<a href=\"%(login_url)s\">efetuar login</a> e reenviá-la."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Perfil de %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Aqui é o lugar onde você fala de si para os outros."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Editar perfil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Esse usuário não preencheu seu perfil (ainda)."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Ver todas as mídias de %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
@@ -498,11 +596,8 @@ msgstr ""
"Aqui é onde sua mídia vai aparecer, mas parece que você não adicionou nada "
"ainda."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Adicionar mídia"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Aparentemente não há nenhuma mídia aqui ainda..."
@@ -514,31 +609,57 @@ msgstr "ícone feed"
msgid "Atom feed"
msgstr "Atom feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Mais novo"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Mais velho"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Comentário"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Ir a página:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Eu tenho certeza de que quero pagar isso"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Opa, seu comentáio estava vazio."
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Seu comentário foi postado!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Você deletou a mídia."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Você vai apagar uma mídia de outro usuário. Tenha cuidado."
diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
index 6e9c8897..5a711266 100644
--- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
index 2598f795..4981e988 100644
--- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
@@ -1,15 +1,16 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
# <gapop@hotmail.com>, 2011.
+# George Pop <gapop@hotmail.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +20,19 @@ msgstr ""
"Language: ro\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Formatul fișierului nu corespunde cu tipul de media selectat."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Nume de utilizator"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Parolă"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Parolele trebuie să fie identice."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Reintrodu parola"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Introdu parola din nou pentru verificare."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "Adresa de e-mail"
@@ -52,108 +45,174 @@ msgid "Sorry, a user with that name already exists."
msgstr "Ne pare rău, există deja un utilizator cu același nume."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Ne pare rău, această adresă de e-mail este deja rezervată."
+msgid "Sorry, a user with that email address already exists."
+msgstr "Există deja un utilizator înregistrat cu această adresă de e-mail."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-"Adresa ta de e-mail a fost confirmată. Poți să te autentifici, să îți "
+"Adresa ta de e-mail a fost verificată. Poți să te autentifici, să îți "
"completezi profilul și să trimiți imagini!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Cheie de verificare sau user ID incorect."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "Trebuie să fii autentificat ca să știm cui să trimitem mesajul!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Adresa ta de e-mail a fost deja verificată!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "E-mail-ul de verificare a fost retrimis."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
"E-mailul pentru recuperarea parolei nu a putut fi trimis deoarece contul tău"
-" e inactiv sau adresa ta de e-mail nu a fost confirmată."
+" e inactiv sau adresa ta de e-mail nu a fost verificată."
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titlu"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Descrierea acestui fișier"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
-msgstr "Etichete"
+msgstr "Tag-uri"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Identificator"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Identificatorul nu poate să lipsească"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"Partea din adresa acestui fișier corespunzătoare titlului. De regulă nu "
-"trebuie modificată."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biografie"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Sit Web"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Vechea parolă"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
"Există deja un entry cu același identificator pentru acest utilizator."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Editezi fișierul unui alt utilizator. Se recomandă prudență."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Editezi profilul unui utilizator. Se recomandă prudență."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Formatul fișierului nu corespunde cu tipul de media selectat."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Parolă incorectă"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Fișier"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Descrierea acestui fișier"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Trebuie să selectezi un fișier."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Fișierul nu pare a fi o imagine!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
-msgstr "Gata, trimis!"
+msgstr "Ura! Trimis!"
+
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Imagine cu elful 404 stresat."
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
-msgstr "Oops!"
+msgstr "Hopa!"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr "Ne pare rău, nu există nicio pagină la această adresă."
+msgstr "Nu există nicio pagină la această adresă. Ne pare rău!"
#: mediagoblin/templates/mediagoblin/404.html:26
msgid ""
@@ -163,33 +222,30 @@ msgstr ""
"Dacă ești sigur că adresa e corectă, poate că pagina pe care o cauți a fost "
"mutată sau ștearsă."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Imagine cu elful 404 stresat."
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "logo MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Transmite un fișier media"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Trimite fișier"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Verifică adresa de e-mail!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "verifică e-mail-ul!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "ieșire"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Autentificare"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -201,92 +257,57 @@ msgstr ""
msgid "Explore"
msgstr "Explorează"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Bună! MediaGoblin este..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Locul perfect pentru fișierele tale media!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Un loc unde oamenii colaborează și își expun creațiile originale și "
-"derivate!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Liber. (Suntem un proiect <a href=\"http://gnu.org\">GNU</a>, până la urmă.)"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Salut, bine ai venit pe acest site MediaGoblin!"
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Un pas spre o lume mai bună prin descentralizare și (în curând) "
-"federalizare!"
+"Acest site folosește <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un "
+"software excepțional pentru găzduirea fișierelor media."
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"Proiectat să fie extensibil. (Software-ul va avea în curând suport pentru "
-"mai multe formate de media, inclusiv pentru video!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Animat de oameni ca tine. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Ne poți ajuta să îmbunătățim"
-" acest software!</a>)"
+"Ca să adăugi propriile tale fișiere, să scrii comentarii, să salvezi "
+"favoritele tale și multe altele, autentifică-te cu contul tău MediaGoblin."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Vrei să ni te alături?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Încă nu ai unul? E simplu!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Creează gratuit un cont</a>\n"
-" sau\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">instalează MediaGoblin pe serverul tău</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Cele mai recente fișiere"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Introdu noua parolă"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Introdu numele de utilizator sau adresa de e-mail"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Parola a fost schimbată. Încearcă să te autentifici acum."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Recuperează parola"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Verifică-ți căsuța de e-mail. Ți-am trimis un mesaj cu link-ul pentru "
-"schimbarea parolei."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Trimite instrucțiuni"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -313,27 +334,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Autentificare eșuată!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Nu ai un cont?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Creează-l aici!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Ai uitat parola?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Schimb-o!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Creează un cont!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Creează"
@@ -364,36 +381,114 @@ msgid "Cancel"
msgstr "Anulare"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Salvează modificările"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Editare profil %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Etichete:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Fișier etichetat cu tag-urile: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Original"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Trimite fișierele tale media"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Trimite"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Fișierele lui %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Fișierele media ale lui <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Ne pare rău, nu am găsit utilizatorul căutat."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Editare"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Șterge"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "la"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -425,29 +520,39 @@ msgstr "Niciun fișier în curs de procesare"
msgid "These uploads failed to process:"
msgstr "Aceste fișiere nu au putut fi procesate:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profil %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Ne pare rău, nu am găsit utilizatorul căutat."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
-msgstr "Este necesară confirmarea adresei de e-mail"
+msgstr "Este necesară verificarea adresei de e-mail"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Aproape gata! Mai trebuie doar să activezi contul."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "Vei primi în scurt timp un e-mail cu instrucțiuni."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Dacă nu-l primești:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Retrimite mesajul de verificare"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -455,7 +560,7 @@ msgstr ""
"Cineva a înregistrat un cont cu acest nume de utilizator, dar contul nu a "
"fost încă activat."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -464,30 +569,29 @@ msgstr ""
"Dacă tu ești persoana respectivă și nu mai ai e-mail-ul de verificare, poți "
"să te <a href=\"%(login_url)s\">autentifici</a> pentru a-l retrimite."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profil %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Aici poți spune altora ceva despre tine."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Editare profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Acest utilizator nu și-a completat (încă) profilul."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Vezi toate fișierele media ale lui %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
@@ -495,11 +599,8 @@ msgstr ""
"Aici vor apărea fișierele tale media, dar se pare că încă nu ai trimis "
"nimic."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Trimite fișier"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Nu pare să existe niciun fișier media deocamdată..."
@@ -511,31 +612,57 @@ msgstr "icon feed"
msgid "Atom feed"
msgstr "feed Atom"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Mai noi"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Mai vechi"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Scrie un comentariu"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Salt la pagina:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Sunt sigur că doresc să șterg"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Hopa, ai uitat să scrii comentariul."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Comentariul tău a fost trimis!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Ai șters acest fișier"
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "Fișierul nu a fost șters deoarece nu ai confirmat că ești sigur."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
"Urmează să ștergi fișierele media ale unui alt utilizator. Se recomandă "
diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
index 7cfc0b61..3ddb0c8e 100644
--- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
index aacd5ec8..38748a97 100644
--- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: ru\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Ðеправильный формат файла."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Логин"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Пароль"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Пароли должны Ñовпадать."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Подтвердите пароль"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Ðаберите его ещё раз здеÑÑŒ, чтобы избежать опечаток."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
@@ -52,10 +44,12 @@ msgid "Sorry, a user with that name already exists."
msgstr "Извините, пользователь Ñ Ñтим именем уже зарегиÑтрирован."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Извините, Ñтот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты уже занÑÑ‚."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
+"Сожалеем, но на Ñтот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты уже зарегиÑтрирована Ð´Ñ€ÑƒÐ³Ð°Ñ "
+"ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,15 +57,28 @@ msgstr ""
"ÐÐ´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ¹ Ñлектронной потвержден. Ð’Ñ‹ теперь можете войти и начать "
"редактировать Ñвой профиль и загружать новые изображениÑ!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Ðеверный ключ проверки или идентификатор пользователÑ"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "Вам надо предÑтавитьÑÑ, чтобы мы знали, кому отправлÑть Ñообщение!"
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Ð’Ñ‹ уже потвердили Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "ПереÑлать Ñообщение Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ аккаунта."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -80,75 +87,128 @@ msgstr ""
"ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ неактивна, либо указанный в ней Ð°Ð´Ñ€ÐµÑ Ñлектронной почты не "
"был подтверждён."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Ðазвание"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "ОпиÑание Ñтого произведениÑ"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Метки"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñть адреÑа"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñть адреÑа необходима"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-"ЧаÑть адреÑа Ñтого файла, Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð½Ð°Ñ Ð¾Ñ‚ его названиÑ. Её обычно не нужно "
-"изменÑть."
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "БиографиÑ"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Сайт"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Старый пароль"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
"У Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ¶Ðµ еÑть файл Ñ Ñ‚Ð°ÐºÐ¾Ð¹ отличительной чаÑтью адреÑа."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Ð’Ñ‹ редактируете файлы другого пользователÑ. Будьте оÑторожны."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Ð’Ñ‹ редактируете профиль пользователÑ. Будьте оÑторожны."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Ðеправильный формат файла."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Ðеправильный пароль"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Файл"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "ОпиÑание Ñтого произведениÑ"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Вы должны загрузить файл."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Файл, похоже, не ÑвлÑетÑÑ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¾Ð¹!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Ура! Файл загружен!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Изображение 404 нервничающего гоблина"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Ой!"
@@ -160,35 +220,32 @@ msgstr "КажетÑÑ, такой Ñтраницы не ÑущеÑтвует. Ð
msgid ""
"If you're sure the address is correct, maybe the page you're looking for has"
" been moved or deleted."
-msgstr "Возможно, Ñтраница которую вы ищете была удалена или переехала."
-
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Изображение 404 нервничающего гоблина"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
+msgstr "Возможно, Ñтраница, которую вы ищете, была удалена или переехала."
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Символ MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Загрузить файл"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Добавить файлы"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "завершение ÑеанÑа"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Войти"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -198,89 +255,61 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:24
msgid "Explore"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Привет, любитель мультимедиа! MediaGoblin…"
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Отличное меÑто Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… файлов!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"МеÑто Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы ÑовмеÑтно работать или проÑто показать Ñвои "
-"оригинальные и/или заимÑтвованные ÑозданиÑ!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr "Свободное ПО. (Мы же проект <a href=\"http://gnu.org\">GNU</a>.)"
+msgstr "Смотреть"
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-"Попытка Ñделать мир лучше Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ децентрализации и (надеемÑÑ, что Ñкоро!)"
-" интеграции!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Привет! Добро пожаловать на наш MediaGoblin’овый Ñайт!"
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"РаÑÑчитан на раÑширÑемоÑть. (Ð’ программе Ñкоро должна поÑвитьÑÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° "
-"других видов мультимедиа, таких как видео!)"
+"Этот Ñайт работает на <a href=\"http://mediagoblin.org\">MediaGoblin</a>, "
+"необыкновенно замечательном ПО Ð´Ð»Ñ Ñ…Ð¾Ñтинга мультимедийных файлов."
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"ПоддерживаетÑÑ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ же, как и ты. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Ты можешь помочь Ñделать Ñто"
-" ПО лучше!</a>)"
+"Ð”Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑобÑтвенных файлов, комментированиÑ, Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑпиÑка любимых "
+"файлов и Ñ‚. п. вы можете предÑтавитьÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вашей MediaGoblin’овой "
+"учётной запиÑи."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "У Ð²Ð°Ñ ÐµÑ‘ ещё нет? Ðе проблема!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Самые новые файлы"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Введите Ñвой новый пароль"
-
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Введите Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
-
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Отправить инÑтрукцию"
+
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
msgid ""
@@ -294,32 +323,37 @@ msgid ""
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
+"Привет, %(username)s,\n"
+"\n"
+"чтобы Ñменить Ñвой пароль от GNU MediaGoblin, откройте\n"
+"Ñледующий URL вашим вебâ€Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"ЕÑли вы думаете, что Ñто какаÑâ€Ñ‚о ошибка, то игнорируйте\n"
+"Ñто Ñообщение и продолжайте быть ÑчаÑтливым гоблином!"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½ÐµÑƒÑпешна!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Ещё нету аккаунта?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Создайте здеÑÑŒ!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Забыли Ñвой пароль?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Смените его!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Создать аккаунт!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Создать"
@@ -350,36 +384,114 @@ msgid "Cancel"
msgstr "Отменить"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Сохранить изменениÑ"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Редактирование Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Файлы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Файлы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Оригинал"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Загрузить файл(ы)"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Подтвердить"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Файлы %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Файлы Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Извините, но такой пользователь не найден."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Изменить"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Удалить"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "в"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -412,38 +524,48 @@ msgstr "Ðету файлов Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸"
msgid "These uploads failed to process:"
msgstr "Обработка Ñтих файлов вызвала ошибку:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Профиль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Извините, но такой пользователь не найден."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Ðужно подтверждение почтового адреÑа"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Почти закончили! Теперь надо активировать ваш аккаунт."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Через пару мгновений на Ð°Ð´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ¹ Ñлектронной почты должно прийти "
"Ñообщение Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐ¸Ð¼Ð¸ инÑтрукциÑми."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "РеÑли нет, то:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr ""
"Повторно отправить Ñообщение Ð´Ð»Ñ Ð¿Ð¾Ð´Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr "Ктоâ€Ñ‚о Ñоздал аккаунт Ñ Ñтим именем, но его еще надо активировать."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -452,40 +574,36 @@ msgstr ""
"ЕÑли Ñто были вы, и еÑли вы потерÑли Ñообщение Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°, "
"то вы можете <a href=\"%(login_url)s\">войти</a> и отправить его повторно."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Профиль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "ЗдеÑÑŒ вы можете раÑÑказать о Ñебе."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Редактировать профиль"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Это пользователь не заполнил Ñвой профайл (пока)."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Смотреть вÑе файлы %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "Ваши файлы поÑвÑÑ‚ÑÑ Ð·Ð´ÐµÑÑŒ, когда вы их добавите."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Добавить файлы"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Пока что тут файлов нет…"
@@ -497,31 +615,57 @@ msgstr "значок ленты"
msgid "Atom feed"
msgstr "лента в формате Atom"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Более новые"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Более Ñтарые"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Комментарий"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Перейти к Ñтранице:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Я уверен, что хочу удалить Ñто"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Ой, ваш комментарий был пуÑÑ‚."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Ваш комментарий размещён!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Вы удалили файл."
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "Файл не удалён, так как вы не подтвердили Ñвою уверенноÑть галочкой."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Ð’Ñ‹ на пороге ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° другого пользователÑ. Будьте оÑторожны."
diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
index 684c850a..2d3f505f 100644
--- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
index d3196b9c..53ad3080 100644
--- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: sk\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Odovzdaný nesprávny súbor pre daný typ média."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Prihlasovacie meno"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Heslo"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Heslá sa musia zhodovať."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Potvrdiť heslo"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Prepíš ho sem opätovne kvôli uisteniu, že nedošlo k preklepu."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "E-mailová adresa"
@@ -52,10 +44,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "PrepáÄ, rovnaké prihlasovacie meno už niekto používa."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "PrepáÄ, daná e-mailová adresa už bola pri registrácii využitá."
+msgid "Sorry, a user with that email address already exists."
+msgstr "PrepáÄ, používateľ s rovnakou e-mailovou adresou už existuje."
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,88 +55,158 @@ msgstr ""
"Tvoja e-mailová adresa bola úspeÅ¡ne overená. MôžeÅ¡ sa hneÄ prihlásiÅ¥, "
"upraviť svoj profil a vkladať výtvory! "
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
-msgstr "Nesprávny overovací kÄ¾ÃºÄ alebo používateľské ID"
+msgstr "Nesprávny overovací kÄ¾ÃºÄ alebo používateľský identifikátor"
+
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+"Aby sme ti mohli zaslať e-mailovú správu, je potrebné byť prihláseným!"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr "Tvoja e-mailová adresa už bola raz overená!"
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
-msgstr "Opätovne zaslať overovaciu správu."
+msgstr "Opätovne zaslať overovaciu správu na e-mail."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
-"Nebolo ti možné zaslať správu ohľadom obnovy hesla, nakoľko je tvoje "
-"používateľské meno buÄ neaktívne alebo e-mailová adresa úÄtu neoverená."
+"Nebolo ti možné zaslať e-mailovú správu ohľadom obnovy hesla, nakoľko je "
+"tvoje používateľské meno buÄ neaktívne alebo e-mailová adresa úÄtu "
+"neoverená."
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Nadpis"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Charakteristika tohto diela"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
-msgstr "Štítky"
+msgstr "ZnaÄky"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Unikátna ÄasÅ¥ adresy"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
-msgstr "Unikátna ÄasÅ¥ adresy musí byÅ¥ vyplnená"
+msgstr "Unikátna ÄasÅ¥ adresy nesmie byÅ¥ prázdna"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
-msgstr "Titulná ÄasÅ¥ URL odkazu média. ZvyÄajne to meniÅ¥ nemusíš."
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Webstránka"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr "Staré heslo"
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Položku s rovnakou unikátnou ÄasÅ¥ou adresy už niekde máš."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
-msgstr "Upravuješ médiá niekoho iného. Pristupuj opatrne."
+msgstr "Upravuješ médiá niekoho iného. Dbaj na to."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
-msgstr "Upravuješ používateľský profil. Pristupuj opatrne."
+msgstr "Upravuješ používateľský profil. Dbaj na to."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Odovzdaný nesprávny súbor pre daný typ média."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr "Nesprávne heslo"
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Súbor"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Charakteristika diela"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
-msgstr "Poskytni súbor."
-
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Súbor najskôr nie je obrázkom!"
+msgstr "Musíš poskytnúť súbor."
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Juchú! Úspešne vložené!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Obrázok stresujúceho goblina pri chybovom kóde Ä. 404"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Ajaj!"
@@ -160,33 +222,30 @@ msgstr ""
"Ak vieš s istotou, že adresa je správna, tak najskôr bola hľadaná stánka "
"presunutá alebo zmazaná."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Obrázok stresujúceho goblina pri chybovom kóde Ä. 404"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin logo"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Vložiť výtvor"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Pridať výtvor"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr "Over si e-mailovú adresu!"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "over si svoj e-mail!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr "odhlásiť sa"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Prihlásenie"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -198,93 +257,57 @@ msgstr ""
msgid "Explore"
msgstr "Preskúmať"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Vitaj medzi nami, kreatívne stvorenie! MediaGoblin je..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Parádne miesto pre tvoje výtvory!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Miesto pre ľudí, vhodné na spoluprácu a vystavovanie tak originálnych, ako "
-"aj odvodených kreácií!"
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-"Voľné, vo význame slobody. (Koniec-koncov, sme predsa <a "
-"href=\"http://gnu.org\">GNU</a> projekt.)"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "Ahoj, vitaj na tejto MediaGoblin stránke!"
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Zo snahou spraviÅ¥ svet lepším miestom vÄaka decentralizácii a (eventuálne, "
-"už Äoskoro!) federácii!"
+"Táto stránka používa <a href=\"http://mediagoblin.org\">MediaGoblin</a>, "
+"výnimoÄne skvelý kus softvéru na hostovanie médií."
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-"S dôrazom na rozšíriteľnosÅ¥. (Podpora pre rozliÄné typy médií v tomto "
-"softvéri už Äoskoro, nevynímajúc videá!)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Existujeme aj vÄaka ľudom ako si ty. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Môžeš nám pomôcť softvér "
-"vylepšiť!</a>)"
+"Pre pridanie vlastných výtvorov, vloženie komentárov, uloženie svojich "
+"obľúbených položiek a viac, sa musíš prihlásiÅ¥ so svojim MediaGoblin úÄtom."
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Tak Äo, chceÅ¡ sa pridaÅ¥?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr "Ešte žiaden nemáš? Je to jednoduché!"
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">VytvoriÅ¥ bezplatný úÄet</a>\n"
-" alebo\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Sprevádzkovať MediaGoblin na vlastnom serveri</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "NajÄerstvejÅ¡ie výtvory"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Vlož svoje nové heslo"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Vlož svoje používateľské meno alebo e-mailovú adresu"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Heslo ti bolo zmenené. Skús sa prihlásiť teraz."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "Obnoviť heslo"
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
-msgstr ""
-"Skontroluj si e-mailovú schránku. Bol ti zaslaná správa s URL odkazom pre "
-"zmenu tvojho hesla."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "Zaslať postup"
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -301,38 +324,33 @@ msgid ""
msgstr ""
"Ahoj %(username)s,\n"
"\n"
-"pre zmenu svojho hesla k GNU MediaGoblin úÄtu, otvor nasledujúci URL odkaz vo \n"
-"svojom prehliadaÄi:\n"
+"pre zmenu svojho hesla k GNU MediaGoblin úÄtu, otvor nasledujúci odkaz vo svojom prehliadaÄi:\n"
"\n"
"%(verification_url)s\n"
"\n"
-"Pokiaľ si myslíš, že došlo k omylu, tak jednoducho ignoruj túto správu a neprestávaj byť šťastným goblinom!"
+"Pokiaľ si myslíš, že doÅ¡lo k omylu, tak jednoducho ignoruj túto správu a buÄ Å¡Å¥astným goblinom!"
#: mediagoblin/templates/mediagoblin/auth/login.html:30
msgid "Logging in failed!"
msgstr "Prihlásenie zlyhalo!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "EÅ¡te nemáš úÄet?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
-msgstr "Vytvoriť jeden tu!"
+msgstr "Vytvor si jeden tu!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Zabudnuté heslo?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Zmeniť ho!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "VytvoriÅ¥ úÄet!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Vytvoriť"
@@ -348,7 +366,7 @@ msgid ""
msgstr ""
"Ahoj %(username)s,\n"
"\n"
-"pre aktiváciu tvojho GNU MediaGoblin úÄtu, otvor nasledujúci URL odkaz vo\n"
+"pre aktiváciu tvojho GNU MediaGoblin úÄtu, otvor nasledujúci odkaz vo\n"
"svojom prehliadaÄi:\n"
"\n"
"%(verification_url)s"
@@ -364,36 +382,114 @@ msgid "Cancel"
msgstr "Zrušiť"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Uložiť zmeny"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Úprava profilu, ktorý vlastní %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Výtvor znaÄený Å¡títkami:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "Výtvory oznaÄené ako: %(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr "Originál"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Vlož svoj výtvor"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Vložiť"
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "Výtvory, ktoré vlastní %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
-msgstr "<a href=\"%(user_url)s\">Výtvory, ktoré vlastní %(username)s</a>"
+msgstr "Výtvory, ktoré vlastní <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "PrepáÄ, používateľské meno nenájdené."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr "Upraviť"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr "Odstrániť"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr "o"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -406,48 +502,58 @@ msgstr "Odstrániť navždy"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
-msgstr "Sekcia spracovania médií"
+msgstr "Sekcia spracovania výtvorov"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
msgid ""
"You can track the state of media being processed for your gallery here."
-msgstr "Tu môžeš sledovať priebeh spracovania médií pre svoju galériu."
+msgstr "Tu môžeš sledovať priebeh spracovania výtvorov pre svoju galériu."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
msgid "Media in-processing"
-msgstr "Médiá v procese spracovania"
+msgstr "Výtvory sa spracúvajú"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
-msgstr "Žiadne médiá v procese spracovania"
+msgstr "Žiadne výtvory sa nespracúvajú"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
-msgstr "Nasledovné vloženia neprešli spracovaním:"
+msgstr "Nasledovné nahratia neprešli spracovaním:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profil, ktorý vlastní %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "PrepáÄ, zadané používateľské meno nenájdené."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Potrebné overenie e-mailovej adresy"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Takmer hotovo! EÅ¡te ti musí byÅ¥ aktivovaný úÄet."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
-msgstr "E-mailová správa s popisom ako to spraviť, by mala onedlho doraziť."
+msgstr "E-mailová správa s popisom ako to spraviť, by mal zanedlho doraziť."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "V prípade, že sa tak nestalo:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
-msgstr "Opätovne zaslať overovaciu správu"
+msgstr "Opätovne zaslať overovaciu správu na e-mail"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -455,52 +561,48 @@ msgstr ""
"ÚÄet s týmto prihlasovacím menom je už registrovaný, avÅ¡ak eÅ¡te stále "
"neaktívny."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr ""
-"Pokiaľ si to ty, ale už nemáš overovaciu správu, tak sa môžeš <a "
+"Pokiaľ si to ty, ale už nemáš overovaciu e-mailovú správu, tak sa môžeš <a "
"href=\"%(login_url)s\">prihlásiť</a> a preposlať si ju."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profil, ktorý vlastní %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
-msgstr "Povedz tu o sebe ostatným."
+msgstr "Miesto, kde smieÅ¡ povedaÅ¥ Äo to o sebe ostatným."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Upraviť profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
-msgstr "DotyÄná osoba eÅ¡te nevyplnila svoj profil (zatiaľ)."
+msgstr "DotyÄný používateľ eÅ¡te nevyplnil svoj profil (zatiaľ)."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Zhliadnuť všetky výtvory, ktoré vlastní %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
"VÅ¡etky tvoje výtvory sa objavia práve tu, ale zatiaľ nemáš niÄ pridané."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Pridať výtvor"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
-msgstr "Najskôr tu ešte nebudú žiadne výtvory..."
+msgstr "Najskôr sa tu ešte nenachádzajú žiadne výtvory..."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
@@ -510,32 +612,58 @@ msgstr "ikona ÄítaÄky"
msgid "Atom feed"
msgstr "ČítaÄka Atom"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Novšie"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr "Prejsť na stránku:"
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Staršie"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Komentár"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "JednoznaÄne to chcem odstrániÅ¥"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "Ajaj, tvoj komentár bol prázdny."
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "Tvoj komentár bol zaslaný!"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "Výtvor bol tebou odstránený."
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "Výtvor nebol odstránený, nakoľko chýbalo tvoje potvrdenie."
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
-msgstr "Chystáš sa odstrániť výtvory niekoho iného. Pristupuj opatrne."
+msgstr "Chystáš sa odstrániť výtvory niekoho iného. Dbaj na to."
diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
index 52e3d632..73bb4113 100644
--- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
index cba4fdd0..c5d3104c 100644
--- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -19,27 +19,19 @@ msgstr ""
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Za vrsto vsebine je bila podana napaÄna datoteka."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Uporabniško ime"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Geslo"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Gesli morata biti enaki."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Potrdite geslo"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "E-poštni naslov"
@@ -52,10 +44,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "Oprostite, uporabnik s tem imenom že obstaja."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Oprostite, ta e-poštni naslov je že v uporabi."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -63,86 +55,154 @@ msgstr ""
"Vaš e-poštni naslov je bil potrjen. Sedaj se lahko prijavite, uredite svoj "
"profil in pošljete slike."
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Potrditveni kljuÄ ali uporabniÅ¡ka identifikacija je napaÄna"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Ponovno pošiljanje potrditvene e-pošte."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Naslov"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Oznake"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Oznaka"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Oznaka ne sme biti prazna"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Biografija"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Spletna stran"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Vnos s to oznako za tega uporabnika že obstaja."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Urejate vsebino drugega uporabnika. Nadaljujte pazljivo."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Urejate uporabniški profil. Nadaljujte pazljivo."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Za vrsto vsebine je bila podana napaÄna datoteka."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Datoteka"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr ""
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Podati morate datoteko."
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Kot kaže datoteka ni slika."
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Juhej! Poslano."
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Slika napake 404 s paniÄnim Å¡kratom"
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Opa!"
@@ -158,33 +218,30 @@ msgstr ""
"ÄŒe ste v toÄnost naslova prepriÄani, je bila iskana stran morda premaknjena "
"ali pa izbrisana."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Slika napake 404 s paniÄnim Å¡kratom"
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "Logotip MediaGoblin"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Pošlji vsebino"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Dodaj vsebino"
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Preverite svojo e-pošto."
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Prijava"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -194,85 +251,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Pozdravljen, ljubitelj veÄpredstavnostnih vsebin! MediaGoblin je ..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Popolno mesto za vaÅ¡e veÄpredstavnostne vsebine."
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Mesto, kjer ljudje lahko sodelujejo in razkazujejo originalne in predelane "
-"stvaritve."
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-"Ustvarjen z namenom izboljÅ¡ati svet, s pomoÄjo decentralizacije in (kmalu) "
-"federacije."
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Zgrajen za razÅ¡irjanje. (Kmalu bodo na voljo dodatne vrste vsebin, vkljuÄno "
-"podpora za video)"
-#: mediagoblin/templates/mediagoblin/root.html:34
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Sad dela ljudi, kot ste vi. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Pri izboljševanju nam lahko "
-"pomagate tudi vi.</a>)"
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -293,27 +317,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Prijava ni uspela."
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Å e nimate raÄuna?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Ustvarite si ga."
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Ustvarite raÄun."
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Ustvari"
@@ -345,36 +365,114 @@ msgid "Cancel"
msgstr "PrekliÄi"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Shrani spremembe"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Urejanje profila – %(username)s"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Vsebina oznaÄena z:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Pošljite svojo vsebino"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Pošlji"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "Vsebina uporabnika <a href=\"%(user_url)s\">%(username)s</a>"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Oprostite, tega uporabnika ni bilo moÄ najti."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -406,29 +504,39 @@ msgstr "V obdelavi ni nobene vsebine"
msgid "These uploads failed to process:"
msgstr "Teh vsebin ni bilo moÄ obdelati:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "Profil – %(username)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Oprostite, tega uporabnika ni bilo moÄ najti."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "Potrebna je potrditev prek e-pošte"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Skoraj ste zakljuÄili. Svoj raÄun morate le Å¡e aktivirati."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "V kratkem bi morali prejeti e-pošto z navodili, kako to storiti."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "ÄŒe je ne prejmete:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Ponovno pošlji potrditveno e-pošto"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -436,7 +544,7 @@ msgstr ""
"Nekdo je s tem uporabniÅ¡kim imenom že registriral raÄun, vendar mora biti Å¡e"
" aktiviran."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -445,40 +553,36 @@ msgstr ""
"Če ste ta oseba vi, a ste izgubili potrditveno e-pošto, se lahko <a "
"href=\"%(login_url)s\">prijavite</a> in jo ponovno pošljete."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "Profil – %(username)s"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Na tem mestu lahko drugim poveste nekaj o sebi."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Uredi profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Ta uporabnik še ni izpolnil svojega profila."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Prikaži vso vsebino uporabnika %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "Tu bo prikazana vaÅ¡a vsebina, a trenutno Å¡e niste dodali niÄ."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Dodaj vsebino"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Videti je, da tu še ni nobene vsebine ..."
@@ -490,31 +594,57 @@ msgstr "Ikona vira"
msgid "Atom feed"
msgstr "Ikona Atom"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Komentar"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
index d2649938..2a99cb53 100644
--- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
index b4b2fb7b..cdfdad05 100644
--- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\n"
"MIME-Version: 1.0\n"
@@ -18,27 +18,19 @@ msgstr ""
"Language: sr\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
-msgid "Username"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
-msgid "Password"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
msgstr ""
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
+msgid "Username"
msgstr ""
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
+msgid "Password"
msgstr ""
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr ""
@@ -51,95 +43,163 @@ msgid "Sorry, a user with that name already exists."
msgstr ""
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
+msgid "Sorry, a user with that email address already exists."
msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr ""
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
msgstr ""
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr ""
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr ""
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
+"The title part of this media's address. You usually don't need to change "
+"this."
msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr ""
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
msgstr ""
-#: mediagoblin/submit/forms.py:25
-msgid "File"
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
msgstr ""
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
msgstr ""
-#: mediagoblin/submit/views.py:46
-msgid "You must provide a file."
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
msgstr ""
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
+#: mediagoblin/submit/forms.py:25
+msgid "File"
msgstr ""
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:50
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr ""
@@ -153,33 +213,30 @@ msgid ""
" been moved or deleted."
msgstr ""
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:47
-msgid "MediaGoblin logo"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -189,76 +246,52 @@ msgstr ""
msgid "Explore"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
+msgid "Don't have one yet? It's easy!"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
@@ -279,27 +312,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr ""
@@ -325,35 +354,113 @@ msgid "Cancel"
msgstr ""
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr ""
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
+msgid "Add your media"
msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
+msgid "Add"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
@@ -386,75 +493,81 @@ msgstr ""
msgid "These uploads failed to process:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr ""
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr ""
@@ -466,31 +579,57 @@ msgstr ""
msgid "Atom feed"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
index 2ae7c510..d647e373 100644
--- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
index 3ee44b18..acace870 100644
--- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
@@ -1,5 +1,5 @@
# Translations template for PROJECT.
-# Copyright (C) 2011 ORGANIZATION
+# Copyright (C) 2012 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n"
"MIME-Version: 1.0\n"
@@ -20,27 +20,19 @@ msgstr ""
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "Ogiltig fil för mediatypen."
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
msgid "Username"
msgstr "Användarnamn"
-#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
msgid "Password"
msgstr "Lösenord"
-#: mediagoblin/auth/forms.py:35
-msgid "Passwords must match."
-msgstr "Lösenorden måste vara identiska."
-
-#: mediagoblin/auth/forms.py:37
-msgid "Confirm password"
-msgstr "Bekräfta lösenord"
-
-#: mediagoblin/auth/forms.py:39
-msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr "Skriv in det igen för att undvika stavfel."
-
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:34
msgid "Email address"
msgstr "E-postadress"
@@ -53,10 +45,10 @@ msgid "Sorry, a user with that name already exists."
msgstr "En användare med det användarnamnet finns redan."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "Den e-postadressen är redan tagen."
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
-#: mediagoblin/auth/views.py:179
+#: mediagoblin/auth/views.py:180
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -64,15 +56,28 @@ msgstr ""
"Din e-postadress är verifierad. Du kan nu logga in, redigera din profil och "
"ladda upp filer!"
-#: mediagoblin/auth/views.py:185
+#: mediagoblin/auth/views.py:186
msgid "The verification key or user id is incorrect"
msgstr "Verifieringsnyckeln eller användar-IDt är fel."
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
msgid "Resent your verification email."
msgstr "Skickade ett nytt verifierings-email."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -80,72 +85,127 @@ msgstr ""
"Kunde inte skicka e-poståterställning av lösenord eftersom ditt användarnamn"
" är inaktivt eller kontots e-postadress har inte verifierats."
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Beskrivning av verket"
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
msgid "Tags"
msgstr "Taggar"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
msgid "Slug"
msgstr "Sökvägsnamn"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:38
msgid "The slug can't be empty"
msgstr "Sökvägsnamnet kan inte vara tomt"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:39
msgid ""
-"The title part of this media's URL. You usually don't need to change this."
-msgstr "Sökvägstitlen för din media. Du brukar inte behöva ändra denna."
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:46
msgid "Bio"
msgstr "Presentation"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
msgid "Website"
msgstr "Hemsida"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "Ett inlägg med det sökvägsnamnet existerar redan."
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "Var försiktig, du redigerar någon annans inlägg."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Var försiktig, du redigerar en annan användares profil."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "Ogiltig fil för mediatypen."
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Fil"
-#: mediagoblin/submit/forms.py:30
-msgid "Description of this work"
-msgstr "Beskrivning av verket"
-
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:50
msgid "You must provide a file."
msgstr "Du måste ange en fil"
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "Filen verkar inte vara en giltig bildfil!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:128
msgid "Woohoo! Submitted!"
msgstr "Tjohoo! Upladdat!"
-#: mediagoblin/templates/mediagoblin/404.html:21
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr "Bild av stressat 404-troll."
+
+#: mediagoblin/templates/mediagoblin/404.html:23
msgid "Oops!"
msgstr "Ojoj!"
@@ -161,33 +221,30 @@ msgstr ""
"Om du är säker på att adressen stämmer så kanske sidan du letar efter har "
"flyttats eller tagits bort."
-#: mediagoblin/templates/mediagoblin/404.html:32
-msgid "Image of 404 goblin stressing out"
-msgstr "Bild av stressat 404-troll."
-
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:48
msgid "MediaGoblin logo"
msgstr "MediaGoblin-logotyp"
-#: mediagoblin/templates/mediagoblin/base.html:52
-msgid "Submit media"
-msgstr "Ladda upp"
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr "Lägg till media"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "Verifiera din e-postadress!"
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:74
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "Logga in"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:86
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -199,97 +256,53 @@ msgstr ""
msgid "Explore"
msgstr "Utforska"
-#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Hej där mediaentusiast, MediaGoblin..."
-
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "Är ett perfekt ställe för din media!"
-
-#: mediagoblin/templates/mediagoblin/root.html:30
-msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr ""
-"Är ett ställe för människor att samarbeta och visa upp originella och "
-"härrörande verk."
-
-#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
msgstr ""
-"Är fritt som i frihet. (Vi är ju ett <a "
-"href=\"http://gnu.org\">GNU</a>-projekt.)"
-#: mediagoblin/templates/mediagoblin/root.html:32
+#: mediagoblin/templates/mediagoblin/root.html:28
msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
msgstr ""
-"Arbetar för att göra världen till ett bättre ställe genom decentralisering "
-"och (så småningom, kommer snart!) -- Google Translate säger "
-"\"sammanslutning\", <em>en: <a "
-"href=\"http://en.wikipedia.org/wiki/Federation_(information_technology)\">federation</a></em>"
-" "
-#: mediagoblin/templates/mediagoblin/root.html:33
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
msgstr ""
-"Byggd för utbyggbarhet. (Flera mediatyper kommer snart till MediaGoblin, "
-"bland annat video!)"
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
msgstr ""
-"Drivs av människor som du. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">Du kan hjälpa os forbättra "
-"MediaGoblin!</a>)"
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "Nyfiken att gå med oss?"
-
-#: mediagoblin/templates/mediagoblin/root.html:39
+#: mediagoblin/templates/mediagoblin/root.html:32
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Skapa ett konto gratis</a>\n"
-"\n"
-" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Installera MediaGoblin på din egen server</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:40
msgid "Most recent media"
msgstr "Senast medier"
-#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29
-msgid "Enter your new password"
-msgstr "Fyll i ditt lösenord"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "Fyll i ditt användarnamn eller lösenord"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
-msgid "Your password has been changed. Try to log in now."
-msgstr "Ditt lösenord är nu ändrat. Testa att logga in nu."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
-msgid ""
-"Check your inbox. We sent an email with a URL for changing your password."
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
msgstr ""
-"Kolla din inkorg. Vi har skickat ett e-postmeddelande med en webbadress för "
-"att ändra ditt lösenord."
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
@@ -317,27 +330,23 @@ msgstr ""
msgid "Logging in failed!"
msgstr "Inloggning misslyckades!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "Har du inget konto än?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "Skapa ett här!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "Glömt ditt lösenord?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "Ändra!"
-
-#: mediagoblin/templates/mediagoblin/auth/register.html:27
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
msgid "Create an account!"
msgstr "Skapa ett konto!"
-#: mediagoblin/templates/mediagoblin/auth/register.html:31
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
msgid "Create"
msgstr "Skapa"
@@ -368,36 +377,114 @@ msgid "Cancel"
msgstr "Avbryt"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
msgid "Save changes"
msgstr "Spara ändringar"
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
msgstr "Redigerar %(username)ss profil"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "Media taggat med:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:26
-msgid "Submit yer media"
-msgstr "Ladda upp"
+msgid "Add your media"
+msgstr ""
#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "Skicka"
+msgid "Add"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>s media"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "Ledsen, hittar ingen sådan användare."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -429,30 +516,40 @@ msgstr "Ingen media under behandling"
msgid "These uploads failed to process:"
msgstr "De här behandlingarna misslyckades:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)ss profil"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "Ledsen, hittar ingen sådan användare."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "E-postadressverifiering krävs."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "Nästan klar! Ditt konto behöver bara aktiveras."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
"Ett e-postmeddelande med instruktioner kommer att hamna hos dig inom kort."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "Om det inte skulle göra det:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "Skicka ett nytt e-postmeddelande"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
@@ -460,7 +557,7 @@ msgstr ""
"Någon har redan registrerat ett konto med det här användarnamnet men det har"
" inte aktiverats."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
@@ -470,30 +567,29 @@ msgstr ""
"detaljer om hur du verifierar ditt konto så kan du <a "
"href=\"%(login_url)s\">logga in</a> och begära ett nytt."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)ss profil"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "Här kan du berätta för andra om dig själv."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
msgid "Edit profile"
msgstr "Redigera profil"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
msgid "This user hasn't filled in their profile (yet)."
msgstr "Den här användaren har inte fyllt i sin profilsida ännu."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
#, python-format
msgid "View all of %(username)s's media"
msgstr "Se all media från %(username)s"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
@@ -501,11 +597,8 @@ msgstr ""
"Här kommer din media att dyka upp, du verkar inte ha lagt till någonting "
"ännu."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
-msgid "Add media"
-msgstr "Lägg till media"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
msgid "There doesn't seem to be any media here yet..."
msgstr "Det verkar inte finnas någon media här ännu."
@@ -517,31 +610,57 @@ msgstr "feed-ikon"
msgid "Atom feed"
msgstr "Atom-feed"
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
-msgid "Newer"
-msgstr "Nyare"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
-#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
-msgid "Older"
-msgstr "Äldre"
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
-#: mediagoblin/user_pages/forms.py:24
-msgid "Comment"
-msgstr "Kommentar"
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Jag är säker på att jag vill radera detta"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
msgstr ""
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
msgstr ""
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "Du tänker radera en annan användares media. Var försiktig."
diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..5480404c
--- /dev/null
+++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po
new file mode 100644
index 00000000..14e12315
--- /dev/null
+++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,637 @@
+# Translations template for PROJECT.
+# Copyright (C) 2012 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# వీవెనౠ<veeven@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU MediaGoblin\n"
+"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
+"POT-Creation-Date: 2012-01-07 13:47-0600\n"
+"PO-Revision-Date: 2012-01-07 19:44+0000\n"
+"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+"Language: te\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr ""
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41
+msgid "Username"
+msgstr "వాడà±à°•à°°à°¿ పేరà±"
+
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45
+msgid "Password"
+msgstr "సంకేతపదం"
+
+#: mediagoblin/auth/forms.py:34
+msgid "Email address"
+msgstr "ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾"
+
+#: mediagoblin/auth/views.py:55
+msgid "Sorry, registration is disabled on this instance."
+msgstr ""
+
+#: mediagoblin/auth/views.py:73
+msgid "Sorry, a user with that name already exists."
+msgstr ""
+
+#: mediagoblin/auth/views.py:77
+msgid "Sorry, a user with that email address already exists."
+msgstr ""
+
+#: mediagoblin/auth/views.py:180
+msgid ""
+"Your email address has been verified. You may now login, edit your profile, "
+"and submit images!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:186
+msgid "The verification key or user id is incorrect"
+msgstr ""
+
+#: mediagoblin/auth/views.py:204
+msgid "You must be logged in so we know who to send the email to!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:212
+msgid "You've already verified your email address!"
+msgstr ""
+
+#: mediagoblin/auth/views.py:225
+msgid "Resent your verification email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:260
+msgid ""
+"An email has been sent with instructions on how to change your password."
+msgstr ""
+
+#: mediagoblin/auth/views.py:270
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
+#: mediagoblin/auth/views.py:282
+msgid "Couldn't find someone with that username or email."
+msgstr ""
+
+#: mediagoblin/auth/views.py:330
+msgid "You can now log in using your new password."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27
+msgid "Title"
+msgstr "శీరà±à°·à°¿à°•"
+
+#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35
+msgid "Tags"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37
+msgid "Separate tags by commas."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:37
+msgid "Slug"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:38
+msgid "The slug can't be empty"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:39
+msgid ""
+"The title part of this media's address. You usually don't need to change "
+"this."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:46
+msgid "Bio"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:48
+msgid ""
+"You can use\n"
+" <a href=\"http://daringfireball.net/projects/markdown/basics\">\n"
+" Markdown</a> for formatting."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:53
+msgid "Website"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:60
+msgid "Old password"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:62
+msgid "Enter your old password to prove you own this account."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:65
+msgid "New password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:65
+msgid "An entry with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:86
+msgid "You are editing another user's media. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:156
+msgid "You are editing a user's profile. Proceed with caution."
+msgstr ""
+
+#: mediagoblin/edit/views.py:174
+msgid "Profile changes saved"
+msgstr ""
+
+#: mediagoblin/edit/views.py:200
+msgid "Wrong password"
+msgstr ""
+
+#: mediagoblin/edit/views.py:216
+msgid "Account settings saved"
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:77
+msgid "Could not extract any file extension from \"{filename}\""
+msgstr ""
+
+#: mediagoblin/media_types/__init__.py:88
+msgid "Sorry, I don't support that file type :("
+msgstr ""
+
+#: mediagoblin/submit/forms.py:25
+msgid "File"
+msgstr ""
+
+#: mediagoblin/submit/views.py:50
+msgid "You must provide a file."
+msgstr ""
+
+#: mediagoblin/submit/views.py:128
+msgid "Woohoo! Submitted!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:22
+msgid "Image of 404 goblin stressing out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:23
+msgid "Oops!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:24
+msgid "There doesn't seem to be a page at this address. Sorry!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/404.html:26
+msgid ""
+"If you're sure the address is correct, maybe the page you're looking for has"
+" been moved or deleted."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:48
+msgid "MediaGoblin logo"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:53
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:157
+msgid "Add media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:64
+msgid "Verify your email!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:71
+msgid "log out"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:74
+#: mediagoblin/templates/mediagoblin/auth/login.html:27
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
+msgid "Log in"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/base.html:86
+msgid ""
+"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU</a> project"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:26
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:29
+msgid ""
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:31
+msgid "Don't have one yet? It's easy!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:32
+#, python-format
+msgid ""
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
+" or\n"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:40
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32
+msgid "Set your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35
+msgid "Set password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
+#, python-format
+msgid ""
+"Hi %(username)s,\n"
+"\n"
+"to change your GNU MediaGoblin password, open the following URL in \n"
+"your web browser:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"If you think this is an error, just ignore this email and continue being\n"
+"a happy goblin!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:30
+msgid "Logging in failed!"
+msgstr "à°ªà±à°°à°µà±‡à°¶à°‚ విఫలమయà±à°¯à°¿à°‚ది!"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
+msgid "Don't have an account yet?"
+msgstr "మీకౠఇంకా ఖాతా లేదా?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
+msgid "Create one here!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
+msgid "Forgot your password?"
+msgstr "మీ సంకేతపదానà±à°¨à°¿ మరà±à°šà°¿à°ªà±‹à°¯à°¾à°°à°¾?"
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:32
+msgid "Create an account!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:36
+msgid "Create"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19
+#, python-format
+msgid ""
+"Hi %(username)s,\n"
+"\n"
+"to activate your GNU MediaGoblin account, open the following URL in\n"
+"your web browser:\n"
+"\n"
+"%(verification_url)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:29
+#, python-format
+msgid "Editing %(media_title)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
+msgid "Cancel"
+msgstr "à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
+msgid "Save changes"
+msgstr "మారà±à°ªà±à°²à°¨à± à°­à°¦à±à°°à°ªà°°à°šà±"
+
+#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34
+#, python-format
+msgid "Changing %(username)s's account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
+#, python-format
+msgid "Editing %(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:46
+msgid "Original"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:33
+msgid ""
+"Sorry, this video will not work because \n"
+"\t your web browser does not support HTML5 \n"
+"\t video."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:36
+msgid ""
+"You can get a modern web browser that \n"
+"\t can play this video at <a href=\"http://getfirefox.com\">\n"
+"\t http://getfirefox.com</a>!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:26
+msgid "Add your media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Add"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
+#, python-format
+msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:60
+#, python-format
+msgid "Added on %(date)s."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:69
+msgid "Edit"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:73
+msgid "Delete"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:79
+#, python-format
+msgid "%(comment_count)s comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:81
+#, python-format
+msgid "%(comment_count)s comments"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:83
+msgid "No comments yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:91
+msgid "Add one"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:100
+msgid ""
+"Type your comment here. You can use <a "
+"href=\"http://daringfireball.net/projects/markdown/basics\">Markdown</a> for"
+" formatting."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:104
+msgid "Add this comment"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:126
+msgid "at"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:141
+#, python-format
+msgid "<p>â– Browsing media by <a href=\"%(user_url)s\">%(username)s</a></p>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
+msgid "Media processing panel"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
+msgid ""
+"You can track the state of media being processed for your gallery here."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
+msgid "Media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
+msgid "No media in-processing"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
+msgid "These uploads failed to process:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
+msgid "Email verification needed"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
+msgid "Almost done! Your account still needs to be activated."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
+msgid ""
+"An email should arrive in a few moments with instructions on how to do so."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+msgid "In case it doesn't:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
+msgid "Resend verification email"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
+msgid ""
+"Someone has registered an account with this username, but it still has to be"
+" activated."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
+#, python-format
+msgid ""
+"If you are that person but you've lost your verification email, you can <a "
+"href=\"%(login_url)s\">log in</a> and resend it."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+msgid "Here's a spot to tell others about yourself."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:118
+msgid "Edit profile"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:106
+msgid "This user hasn't filled in their profile (yet)."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:125
+msgid "Change account settings"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:138
+#, python-format
+msgid "View all of %(username)s's media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:151
+msgid ""
+"This is where your media will appear, but you don't seem to have added "
+"anything yet."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:163
+#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72
+msgid "There doesn't seem to be any media here yet..."
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
+msgid "feed icon"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
+msgid "Atom feed"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:39
+msgid "↠Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:45
+msgid "Older →"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:48
+msgid "Go to page:"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32
+msgid "newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38
+#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43
+msgid "older"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "View more media tagged with"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "or"
+msgstr ""
+
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:198
+msgid "You are about to delete another user's media. Proceed with caution."
+msgstr ""
+
+
diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
index e3751aeb..a7820c49 100644
--- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
+++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
Binary files differ
diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
index c664adbe..2864ef8a 100644
--- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
@@ -4,14 +4,14 @@
#
# Translators:
# <chc@citi.sinica.edu.tw>, 2011.
-# Harry Chen <harryhow@gmail.com>, 2011.
+# Harry Chen <harryhow@gmail.com>, 2011, 2012.
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-11-01 23:14-0500\n"
-"PO-Revision-Date: 2011-11-02 04:13+0000\n"
-"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
+"POT-Creation-Date: 2011-12-04 10:24-0600\n"
+"PO-Revision-Date: 2012-01-03 16:35+0000\n"
+"Last-Translator: Harry Chen <harryhow@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,6 +20,10 @@ msgstr ""
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0\n"
+#: mediagoblin/processing.py:143
+msgid "Invalid file given for media type."
+msgstr "指定錯誤的媒體類別ï¼"
+
#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "使用者å稱"
@@ -53,8 +57,8 @@ msgid "Sorry, a user with that name already exists."
msgstr "抱歉, 這個使用者å稱已經存在."
#: mediagoblin/auth/views.py:77
-msgid "Sorry, that email address has already been taken."
-msgstr "抱歉,這個電å­éƒµä»¶å·²ç¶“被其他人使用了。"
+msgid "Sorry, a user with that email address already exists."
+msgstr "抱歉,此電å­éƒµä»¶å·²è¢«è¨»å†Šäº†ã€‚"
#: mediagoblin/auth/views.py:179
msgid ""
@@ -66,11 +70,19 @@ msgstr "你的電å­éƒµä»¶ä½å€å·²è¢«èªè­‰. ä½ ç¾åœ¨å°±å¯ä»¥ç™»å…¥, 編輯ä½
msgid "The verification key or user id is incorrect"
msgstr "èªè­‰ç¢¼æˆ–是使用者帳號錯誤"
-#: mediagoblin/auth/views.py:207
+#: mediagoblin/auth/views.py:203
+msgid "You must be logged in so we know who to send the email to!"
+msgstr "你必須登入,我們æ‰çŸ¥é“ä¿¡è¦é€çµ¦èª°ï¼"
+
+#: mediagoblin/auth/views.py:211
+msgid "You've already verified your email address!"
+msgstr "你的電å­éƒµä»¶å·²ç¶“確èªäº†ï¼"
+
+#: mediagoblin/auth/views.py:224
msgid "Resent your verification email."
msgstr "é‡é€èªè­‰ä¿¡."
-#: mediagoblin/auth/views.py:248
+#: mediagoblin/auth/views.py:265
msgid ""
"Could not send password recovery email as your username is inactive or your "
"account's email address has not been verified."
@@ -84,42 +96,62 @@ msgstr "標題"
msgid "Tags"
msgstr "標籤"
-#: mediagoblin/edit/forms.py:31
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34
+msgid "Seperate tags by commas."
+msgstr "用逗點分開標籤。"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "自訂字串"
-#: mediagoblin/edit/forms.py:32
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "自訂字串ä¸èƒ½ç©ºç™½"
-#: mediagoblin/edit/forms.py:33
+#: mediagoblin/edit/forms.py:35
msgid ""
"The title part of this media's URL. You usually don't need to change this."
msgstr "此媒體網å€çš„å稱。你通常ä¸éœ€è¦è®Šå‹•這個的。"
-#: mediagoblin/edit/forms.py:40
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "自我介紹"
-#: mediagoblin/edit/forms.py:43
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "網站"
-#: mediagoblin/edit/views.py:64
+#: mediagoblin/edit/forms.py:49
+msgid "Old password"
+msgstr "舊的密碼"
+
+#: mediagoblin/edit/forms.py:52
+msgid "New Password"
+msgstr "新的密碼"
+
+#: mediagoblin/edit/views.py:65
msgid "An entry with that slug already exists for this user."
msgstr "這個自訂字串已經被其他人用了"
-#: mediagoblin/edit/views.py:85
+#: mediagoblin/edit/views.py:86
msgid "You are editing another user's media. Proceed with caution."
msgstr "你正在編輯他人的媒體檔案. 請謹慎處ç†."
-#: mediagoblin/edit/views.py:155
+#: mediagoblin/edit/views.py:156
msgid "You are editing a user's profile. Proceed with caution."
msgstr "你正在編輯一ä½ç”¨æˆ¶çš„æª”案. 請謹慎處ç†."
-#: mediagoblin/process_media/errors.py:44
-msgid "Invalid file given for media type."
-msgstr "指定錯誤的媒體類別ï¼"
+#: mediagoblin/edit/views.py:171
+msgid "Wrong password"
+msgstr "密碼錯誤"
+
+#: mediagoblin/edit/views.py:192
+msgid "Profile edited!"
+msgstr "個人資料已被編輯了ï¼"
+
+#: mediagoblin/media_types/__init__.py:65
+msgid "Could not find any file extension in \"{filename}\""
+msgstr "找ä¸åˆ°ä»»ä½• \"{filename}\" 的附檔å。"
#: mediagoblin/submit/forms.py:25
msgid "File"
@@ -129,18 +161,18 @@ msgstr "檔案"
msgid "Description of this work"
msgstr "這個作å“çš„æè¿°"
-#: mediagoblin/submit/views.py:46
+#: mediagoblin/submit/views.py:49
msgid "You must provide a file."
msgstr "ä½ å¿…é ˆæä¾›ä¸€å€‹æª”案"
-#: mediagoblin/submit/views.py:49
-msgid "The file doesn't seem to be an image!"
-msgstr "æª”æ¡ˆä¼¼ä¹Žä¸æ˜¯ä¸€å€‹åœ–片喔!"
-
-#: mediagoblin/submit/views.py:121
+#: mediagoblin/submit/views.py:127
msgid "Woohoo! Submitted!"
msgstr "呼呼! é€å‡ºåŽ»åš•!"
+#: mediagoblin/submit/views.py:133
+msgid "Invalid file type."
+msgstr "䏿­£ç¢ºçš„æª”案格å¼"
+
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
msgstr "糟糕ï¼"
@@ -159,29 +191,29 @@ msgstr "如果你確定這個ä½å€æ˜¯æ­£ç¢ºçš„,或許你在找的網é å·²ç¶“
msgid "Image of 404 goblin stressing out"
msgstr "Image of 404 goblin stressing out"
-#: mediagoblin/templates/mediagoblin/base.html:22
-msgid "GNU MediaGoblin"
-msgstr "GNU MediaGoblin"
-
-#: mediagoblin/templates/mediagoblin/base.html:47
+#: mediagoblin/templates/mediagoblin/base.html:49
msgid "MediaGoblin logo"
msgstr "MediaGoblin 標誌"
-#: mediagoblin/templates/mediagoblin/base.html:52
+#: mediagoblin/templates/mediagoblin/base.html:54
msgid "Submit media"
msgstr "éžäº¤åª’é«”"
-#: mediagoblin/templates/mediagoblin/base.html:63
-msgid "verify your email!"
-msgstr "ç¢ºèªæ‚¨çš„é›»å­éƒµä»¶!"
+#: mediagoblin/templates/mediagoblin/base.html:65
+msgid "Verify your email!"
+msgstr "確èªä½ çš„é›»å­éƒµä»¶"
+
+#: mediagoblin/templates/mediagoblin/base.html:72
+msgid "log out"
+msgstr "登出"
-#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/base.html:75
#: mediagoblin/templates/mediagoblin/auth/login.html:27
-#: mediagoblin/templates/mediagoblin/auth/login.html:35
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Log in"
msgstr "登入"
-#: mediagoblin/templates/mediagoblin/base.html:89
+#: mediagoblin/templates/mediagoblin/base.html:91
msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
@@ -194,62 +226,39 @@ msgid "Explore"
msgstr "探索"
#: mediagoblin/templates/mediagoblin/root.html:27
-msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "å—¨ï¼å¤šåª’體檔案愛好者ï¼MediaGoblin是..."
+msgid "Hi there, welcome to this MediaGoblin site!"
+msgstr "å˜¿ï¼æ­¡è¿Žä¾†åˆ° 媒體怪ç¸(MediaGoblin) 網站"
-#: mediagoblin/templates/mediagoblin/root.html:29
-msgid "The perfect place for your media!"
-msgstr "你的媒體檔案的最佳所在ï¼"
+#: mediagoblin/templates/mediagoblin/root.html:28
+msgid ""
+"This site is running <a href=\"http://mediagoblin.org\">MediaGoblin</a>, an "
+"extraordinarily great piece of media hosting software."
+msgstr ""
+"此網站正é‹è¡Œ <a href=\"http://mediagoblin.org\">媒體怪ç¸(MediaGoblin)</a>, "
+"他是一個超讚的媒體分享架站軟體."
-#: mediagoblin/templates/mediagoblin/root.html:30
+#: mediagoblin/templates/mediagoblin/root.html:29
msgid ""
-"A place for people to collaborate and show off original and derived "
-"creations!"
-msgstr "這是一個å¯ä»¥è®“人們共åŒå±•示他們的創作ã€è¡ç”Ÿä½œå“的地方ï¼"
+"To add your own media, place comments, save your favourites and more, you "
+"can log in with your MediaGoblin account."
+msgstr "ä½ å¯ä»¥ç”¨ åª’é«”æ€ªç¸ å¸³è™Ÿç™»å…¥ï¼ŒåŠ å…¥ä½ è‡ªå·±çš„åª’é«”æª”æ¡ˆï¼ŒåŠ å…¥è©•èªžï¼ŒæŠŠä½ çš„æœ€æ„›å„²å­˜èµ·ä¾†ã€‚"
#: mediagoblin/templates/mediagoblin/root.html:31
-msgid ""
-"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
-"after all.)"
-msgstr "å…費但是我們更é‡è¦–自由 (畢竟我們是個 <a href=\"http://gnu.org\">GNU</a> 專案)"
+msgid "Don't have one yet? It's easy!"
+msgstr "還沒有嗎?其實éžå¸¸ç°¡å–®ï¼"
#: mediagoblin/templates/mediagoblin/root.html:32
-msgid ""
-"Aiming to make the world a better place through decentralization and "
-"(eventually, coming soon!) federation!"
-msgstr "目的是è¦é€éŽåˆ†æ•£å¼ä¸”自由的方å¼è®“這個世界更美好ï¼(總有一天,它很快會到來的ï¼)"
-
-#: mediagoblin/templates/mediagoblin/root.html:33
-msgid ""
-"Built for extensibility. (Multiple media types coming soon to the software,"
-" including video support!)"
-msgstr "天生的擴充性。(軟體將支æ´å¤šç¨®å¤šåª’體格å¼, 也支æ´å½±éŸ³æª”案ï¼)"
-
-#: mediagoblin/templates/mediagoblin/root.html:34
-msgid ""
-"Powered by people like you. (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
-" software!</a>)"
-msgstr ""
-"ç”±åƒä½ ä¸€æ¨£çš„人們製作 (<a "
-"href=\"http://mediagoblin.org/pages/join.html\">ä½ å¯ä»¥å¹«æˆ‘們改進軟體!</a>)"
-
-#: mediagoblin/templates/mediagoblin/root.html:38
-msgid "Excited to join us?"
-msgstr "è¿«ä¸äºŸå¾…想è¦åŠ å…¥æˆ‘å€‘ï¼Ÿ"
-
-#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">Create an account at this site</a>\n"
" or\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
-"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">建立一個å…費帳號</a>\n"
+"<a class=\"button_action_highlight\" href=\"%(register_url)s\">在這網站建立帳號</a>\n"
" 或是\n"
-" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">在你的伺æœå™¨ä¸Šè¨­ç«‹ MediaGoblin</a>"
+" <a class=\"button_action\" href=\"http://wiki.mediagoblin.org/HackingHowto\">建立一個自己的媒體怪ç¸(MedaiGoblin)</a>"
-#: mediagoblin/templates/mediagoblin/root.html:53
+#: mediagoblin/templates/mediagoblin/root.html:44
msgid "Most recent media"
msgstr "最新的媒體"
@@ -257,9 +266,18 @@ msgstr "最新的媒體"
msgid "Enter your new password"
msgstr "輸入你的新密碼"
-#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29
-msgid "Enter your username or email"
-msgstr "輸入你的帳號或是電å­éƒµä»¶"
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33
+#: mediagoblin/templates/mediagoblin/submit/start.html:30
+msgid "Submit"
+msgstr "é€å‡º"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Recover password"
+msgstr "找回密碼"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30
+msgid "Send instructions"
+msgstr "é€å‡ºæŒ‡ç¤º"
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
msgid "Your password has been changed. Try to log in now."
@@ -295,22 +313,18 @@ msgstr ""
msgid "Logging in failed!"
msgstr "登入失敗ï¼"
-#: mediagoblin/templates/mediagoblin/auth/login.html:43
+#: mediagoblin/templates/mediagoblin/auth/login.html:35
msgid "Don't have an account yet?"
msgstr "還沒有帳號嗎?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:46
+#: mediagoblin/templates/mediagoblin/auth/login.html:36
msgid "Create one here!"
msgstr "在這裡建立一個å§!"
-#: mediagoblin/templates/mediagoblin/auth/login.html:49
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Forgot your password?"
msgstr "忘了密碼嗎?"
-#: mediagoblin/templates/mediagoblin/auth/login.html:52
-msgid "Change it!"
-msgstr "變更ï¼"
-
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "建立一個帳號!"
@@ -355,27 +369,54 @@ msgstr "儲存變更"
msgid "Editing %(username)s's profile"
msgstr "編輯 %(username)s'的檔案中"
-#: mediagoblin/templates/mediagoblin/listings/tag.html:31
-msgid "Media tagged with:"
-msgstr "媒體檔案被標籤為:"
+#: mediagoblin/templates/mediagoblin/listings/tag.html:30
+#: mediagoblin/templates/mediagoblin/listings/tag.html:35
+#, python-format
+msgid "Media tagged with: %(tag_name)s"
+msgstr "此媒體被標識為:%(tag_name)s"
+
+#: mediagoblin/templates/mediagoblin/media_displays/video.html:19
+msgid "Original"
+msgstr "原始的"
#: mediagoblin/templates/mediagoblin/submit/start.html:26
msgid "Submit yer media"
msgstr "éžäº¤ä½ çš„媒體檔案"
-#: mediagoblin/templates/mediagoblin/submit/start.html:30
-msgid "Submit"
-msgstr "é€å‡º"
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30
+#, python-format
+msgid "%(username)s's media"
+msgstr "%(username)s的媒體"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
msgstr "<a href=\"%(user_url)s\">%(username)s</a>的媒體檔案"
-#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
-msgid "Sorry, no such user found."
-msgstr "抱歉,找ä¸åˆ°é€™å€‹ä½¿ç”¨è€…."
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:57
+#, python-format
+msgid "By <a href=\"%(user_url)s\">%(username)s</a> on %(date)s"
+msgstr "ç”± <a href=\"%(user_url)s\">%(username)s</a> æ–¼ %(date)s"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:67
+msgid "Post a comment"
+msgstr "刊登評論"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:85
+msgid "at"
+msgstr "在"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:102
+msgid "Post comment!"
+msgstr "刊登評論ï¼"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:124
+msgid "Edit"
+msgstr "編輯"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media.html:130
+msgid "Delete"
+msgstr "刪除"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
@@ -407,75 +448,80 @@ msgstr "沒有正在處ç†ä¸­çš„媒體"
msgid "These uploads failed to process:"
msgstr "無法處ç†é€™äº›æ›´æ–°"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:31
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:89
+#, python-format
+msgid "%(username)s's profile"
+msgstr "%(username)s的個人檔案"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:43
+msgid "Sorry, no such user found."
+msgstr "抱歉,找ä¸åˆ°é€™å€‹ä½¿ç”¨è€…."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:50
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:70
msgid "Email verification needed"
msgstr "需è¦èªè­‰é›»å­éƒµä»¶"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:53
msgid "Almost done! Your account still needs to be activated."
msgstr "幾乎完æˆäº†ï¼ä½†ä½ çš„帳號ä»ç„¶éœ€è¦è¢«å•Ÿç”¨ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:58
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr "馬上會有一å°é›»å­éƒµä»¶å‘Šè¨´ä½ å¦‚何åš."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid "In case it doesn't:"
msgstr "å‡è¨­å®ƒç„¡æ³•:"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:65
msgid "Resend verification email"
msgstr "é‡é€èªè­‰ä¿¡"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:73
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr "有人用了這個帳號登錄了,但是這個帳號ä»éœ€è¦è¢«å•Ÿç”¨ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:79
#, python-format
msgid ""
"If you are that person but you've lost your verification email, you can <a "
"href=\"%(login_url)s\">log in</a> and resend it."
msgstr "如果你就是那個人, 但是éºå¤±äº†èªè­‰ä¿¡, ä½ å¯ä»¥<a href=\"%(login_url)s\">登入</a> 然後é‡é€ä¸€æ¬¡."
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
-#, python-format
-msgid "%(username)s's profile"
-msgstr "%(username)s的個人檔案"
-
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "Here's a spot to tell others about yourself."
msgstr "這是一個地方,能讓你å‘他人介紹自己。"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:101
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:119
msgid "Edit profile"
msgstr "編輯個人檔案"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:107
msgid "This user hasn't filled in their profile (yet)."
msgstr "這個使用者還沒(來得åŠ)填寫個人檔案。"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:133
#, python-format
msgid "View all of %(username)s's media"
msgstr "查看%(username)s的全部媒體檔案"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:146
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr "這個地方是你的媒體檔案會出ç¾çš„地方,但是你似乎還沒有加入任何æ±è¥¿ã€‚"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:152
msgid "Add media"
msgstr "新增媒體檔案"
-#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:158
msgid "There doesn't seem to be any media here yet..."
msgstr "似乎還沒有任何的媒體檔案..."
@@ -495,6 +541,18 @@ msgstr "新一點"
msgid "Older"
msgstr "舊一點"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:50
+msgid "Go to page:"
+msgstr "è·³åˆ°é æ•¸ï¼š"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:20
+msgid "Tagged with"
+msgstr "被標籤為"
+
+#: mediagoblin/templates/mediagoblin/utils/tags.html:25
+msgid "and"
+msgstr "且"
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "è©•è«–"
@@ -503,15 +561,23 @@ msgstr "è©•è«–"
msgid "I am sure I want to delete this"
msgstr "我確定我想è¦åˆªé™¤"
-#: mediagoblin/user_pages/views.py:142
-msgid "Empty comments are not allowed."
-msgstr ""
+#: mediagoblin/user_pages/views.py:155
+msgid "Oops, your comment was empty."
+msgstr "啊,你的留言是空的。"
-#: mediagoblin/user_pages/views.py:148
-msgid "Comment posted!"
-msgstr ""
+#: mediagoblin/user_pages/views.py:161
+msgid "Your comment has been posted!"
+msgstr "你的留言已經刊登ï¼"
+
+#: mediagoblin/user_pages/views.py:183
+msgid "You deleted the media."
+msgstr "你已刪除此媒體檔案。"
+
+#: mediagoblin/user_pages/views.py:190
+msgid "The media was not deleted because you didn't check that you were sure."
+msgstr "此媒體檔案尚未被刪除因為你還沒有確èªä½ çœŸçš„è¦åˆªé™¤ã€‚"
-#: mediagoblin/user_pages/views.py:181
+#: mediagoblin/user_pages/views.py:198
msgid "You are about to delete another user's media. Proceed with caution."
msgstr "你在刪除其他人的媒體檔案。請å°å¿ƒè™•ç†å–”。"
diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py
index b7f52595..23c1c26d 100644
--- a/mediagoblin/init/__init__.py
+++ b/mediagoblin/init/__init__.py
@@ -23,14 +23,18 @@ from mediagoblin.init.config import (
read_mediagoblin_config, generate_validation_report)
from mediagoblin import mg_globals
from mediagoblin.mg_globals import setup_globals
-from mediagoblin.db.open import setup_connection_and_db_from_config
-from mediagoblin.db.util import MigrationManager
+from mediagoblin.db.open import setup_connection_and_db_from_config, \
+ check_db_migrations_current
from mediagoblin.workbench import WorkbenchManager
from mediagoblin.storage import storage_system_from_config
-class Error(Exception): pass
-class ImproperlyConfigured(Error): pass
+class Error(Exception):
+ pass
+
+
+class ImproperlyConfigured(Error):
+ pass
def setup_global_and_app_config(config_path):
@@ -52,32 +56,14 @@ def setup_global_and_app_config(config_path):
def setup_database():
app_config = mg_globals.app_config
- # This MUST be imported so as to set up the appropriate migrations!
- from mediagoblin.db import migrations
-
# Set up the database
connection, db = setup_connection_and_db_from_config(app_config)
- # Init the migration number if necessary
- migration_manager = MigrationManager(db)
- migration_manager.install_migration_version_if_missing()
-
- # Tiny hack to warn user if our migration is out of date
- if not migration_manager.database_at_latest_migration():
- db_migration_num = migration_manager.database_current_migration()
- latest_migration_num = migration_manager.latest_migration()
- if db_migration_num < latest_migration_num:
- print (
- "*WARNING:* Your migrations are out of date, "
- "maybe run ./bin/gmg migrate?")
- elif db_migration_num > latest_migration_num:
- print (
- "*WARNING:* Your migrations are out of date... "
- "in fact they appear to be from the future?!")
+ check_db_migrations_current(db)
setup_globals(
- db_connection = connection,
- database = db)
+ db_connection=connection,
+ database=db)
return connection, db
@@ -99,10 +85,10 @@ def get_jinja_loader(user_template_path=None):
def get_staticdirector(app_config):
- if app_config.has_key('direct_remote_path'):
+ if 'direct_remote_path' in app_config:
return staticdirect.RemoteStaticDirect(
app_config['direct_remote_path'].strip())
- elif app_config.has_key('direct_remote_paths'):
+ elif 'direct_remote_paths' in app_config:
direct_remote_path_lines = app_config[
'direct_remote_paths'].strip().splitlines()
return staticdirect.MultiRemoteStaticDirect(
@@ -126,8 +112,8 @@ def setup_storage():
queue_store = storage_system_from_config(global_config[key_long])
setup_globals(
- public_store = public_store,
- queue_store = queue_store)
+ public_store=public_store,
+ queue_store=queue_store)
return public_store, queue_store
@@ -137,7 +123,7 @@ def setup_workbench():
workbench_manager = WorkbenchManager(app_config['workbench_path'])
- setup_globals(workbench_manager = workbench_manager)
+ setup_globals(workbench_manager=workbench_manager)
def setup_beaker_cache():
diff --git a/mediagoblin/init/celery/__init__.py b/mediagoblin/init/celery/__init__.py
index c58b1305..1eb21d7a 100644
--- a/mediagoblin/init/celery/__init__.py
+++ b/mediagoblin/init/celery/__init__.py
@@ -18,7 +18,7 @@ import os
import sys
-MANDATORY_CELERY_IMPORTS = ['mediagoblin.process_media']
+MANDATORY_CELERY_IMPORTS = ['mediagoblin.processing']
DEFAULT_SETTINGS_MODULE = 'mediagoblin.init.celery.dummy_settings_module'
@@ -40,25 +40,25 @@ def setup_celery_from_config(app_config, global_config,
- set_environ: if set, this will CELERY_CONFIG_MODULE to the
settings_module
"""
- if global_config.has_key('celery'):
+ if 'celery' in global_config:
celery_conf = global_config['celery']
else:
celery_conf = {}
-
+
celery_settings = {}
# set up mongodb stuff
celery_settings['CELERY_RESULT_BACKEND'] = 'mongodb'
- if not celery_settings.has_key('BROKER_BACKEND'):
+ if 'BROKER_BACKEND' not in celery_settings:
celery_settings['BROKER_BACKEND'] = 'mongodb'
celery_mongo_settings = {}
- if app_config.has_key('db_host'):
+ if 'db_host' in app_config:
celery_mongo_settings['host'] = app_config['db_host']
if celery_settings['BROKER_BACKEND'] == 'mongodb':
celery_settings['BROKER_HOST'] = app_config['db_host']
- if app_config.has_key('db_port'):
+ if 'db_port' in app_config:
celery_mongo_settings['port'] = app_config['db_port']
if celery_settings['BROKER_BACKEND'] == 'mongodb':
celery_settings['BROKER_PORT'] = app_config['db_port']
@@ -84,6 +84,6 @@ def setup_celery_from_config(app_config, global_config,
for key, value in celery_settings.iteritems():
setattr(this_module, key, value)
-
+
if set_environ:
os.environ['CELERY_CONFIG_MODULE'] = settings_module
diff --git a/mediagoblin/init/celery/from_celery.py b/mediagoblin/init/celery/from_celery.py
index 3e5adb98..05669b67 100644
--- a/mediagoblin/init/celery/from_celery.py
+++ b/mediagoblin/init/celery/from_celery.py
@@ -44,7 +44,7 @@ def setup_self(check_environ_for_conf=True, module_name=OUR_MODULENAME,
if not os.path.exists(mgoblin_conf_file):
raise IOError(
"MEDIAGOBLIN_CONFIG not set or file does not exist")
-
+
# By setting the environment variable here we should ensure that
# this is the module that gets set up.
os.environ['CELERY_CONFIG_MODULE'] = module_name
diff --git a/mediagoblin/init/config.py b/mediagoblin/init/config.py
index 029a0956..ae232e91 100644
--- a/mediagoblin/init/config.py
+++ b/mediagoblin/init/config.py
@@ -73,7 +73,7 @@ def read_mediagoblin_config(config_path, config_spec=CONFIG_SPEC_PATH):
# For now the validator just works with the default functions,
# but in the future if we want to add additional validation/configuration
# functions we'd add them to validator.functions here.
- #
+ #
# See also:
# http://www.voidspace.org.uk/python/validate.html#adding-functions
validator = Validator()
diff --git a/mediagoblin/listings/routing.py b/mediagoblin/listings/routing.py
index b72bd015..234f2595 100644
--- a/mediagoblin/listings/routing.py
+++ b/mediagoblin/listings/routing.py
@@ -25,4 +25,3 @@ tag_routes = [
Route('mediagoblin.listings.tag_atom_feed', "/{tag}/atom/",
controller="mediagoblin.listings.views:tag_atom_feed"),
]
-
diff --git a/mediagoblin/listings/views.py b/mediagoblin/listings/views.py
index 01aad803..ca8e8229 100644
--- a/mediagoblin/listings/views.py
+++ b/mediagoblin/listings/views.py
@@ -47,7 +47,7 @@ def tag_listing(request, page):
{u'state': u'processed',
u'tags.slug': tag_slug})
cursor = cursor.sort('created', DESCENDING)
-
+
pagination = Pagination(page, cursor)
media_entries = pagination()
@@ -64,6 +64,7 @@ def tag_listing(request, page):
ATOM_DEFAULT_NR_OF_UPDATED_ITEMS = 15
+
def tag_atom_feed(request):
"""
generates the atom feed with the tag images
@@ -76,17 +77,33 @@ def tag_atom_feed(request):
cursor = cursor.sort('created', DESCENDING)
cursor = cursor.limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS)
+ """
+ ATOM feed id is a tag URI (see http://en.wikipedia.org/wiki/Tag_URI)
+ """
feed = AtomFeed(
"MediaGoblin: Feed for tag '%s'" % tag_slug,
feed_url=request.url,
- url=request.host_url)
-
+ id='tag:'+request.host+',2011:gallery.tag-%s' % tag_slug,
+ links=[{'href': request.urlgen(
+ 'mediagoblin.listings.tags_listing',
+ qualified=True, tag=tag_slug ),
+ 'rel': 'alternate',
+ 'type': 'text/html'}])
for entry in cursor:
feed.add(entry.get('title'),
entry.get('description_html'),
+ id=entry.url_for_self(request.urlgen,qualified=True),
content_type='html',
- author=entry.uploader()['username'],
+ author={'name': entry.get_uploader.username,
+ 'uri': request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ qualified=True, user=entry.get_uploader.username)},
updated=entry.get('created'),
- url=entry.url_for_self(request.urlgen))
+ links=[{
+ 'href':entry.url_for_self(
+ request.urlgen,
+ qualified=True),
+ 'rel': 'alternate',
+ 'type': 'text/html'}])
return feed.get_response()
diff --git a/mediagoblin/meddleware/__init__.py b/mediagoblin/meddleware/__init__.py
new file mode 100644
index 00000000..7ba70d87
--- /dev/null
+++ b/mediagoblin/meddleware/__init__.py
@@ -0,0 +1,32 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ENABLED_MEDDLEWARE = (
+ 'mediagoblin.meddleware.noop:NoOpMeddleware',
+ 'mediagoblin.meddleware.csrf:CsrfMeddleware',
+ )
+
+
+class BaseMeddleware(object):
+
+ def __init__(self, mg_app):
+ self.app = mg_app
+
+ def process_request(self, request, controller):
+ pass
+
+ def process_response(self, request, response):
+ pass
diff --git a/mediagoblin/middleware/csrf.py b/mediagoblin/meddleware/csrf.py
index 7a5e352e..a4e4e5c6 100644
--- a/mediagoblin/middleware/csrf.py
+++ b/mediagoblin/meddleware/csrf.py
@@ -21,6 +21,7 @@ from webob.exc import HTTPForbidden
from wtforms import Form, HiddenField, validators
from mediagoblin import mg_globals
+from mediagoblin.meddleware import BaseMeddleware
# Use the system (hardware-based) random number generator if it exists.
# -- this optimization is lifted from Django
@@ -30,6 +31,13 @@ else:
getrandbits = random.getrandbits
+def csrf_exempt(func):
+ """Decorate a Controller to exempt it from CSRF protection."""
+
+ func.csrf_enabled = False
+ return func
+
+
class CsrfForm(Form):
"""Simple form to handle rendering a CSRF token and confirming it
is included in the POST."""
@@ -42,13 +50,16 @@ def render_csrf_form_token(request):
"""Render the CSRF token in a format suitable for inclusion in a
form."""
+ if 'CSRF_TOKEN' not in request.environ:
+ return None
+
form = CsrfForm(csrf_token=request.environ['CSRF_TOKEN'])
return form.csrf_token
-class CsrfMiddleware(object):
- """CSRF Protection Middleware
+class CsrfMeddleware(BaseMeddleware):
+ """CSRF Protection Meddleware
Adds a CSRF Cookie to responses and verifies that it is present
and matches the form token for non-safe requests.
@@ -57,10 +68,7 @@ class CsrfMiddleware(object):
CSRF_KEYLEN = 64
SAFE_HTTP_METHODS = ("GET", "HEAD", "OPTIONS", "TRACE")
- def __init__(self, mg_app):
- self.app = mg_app
-
- def process_request(self, request):
+ def process_request(self, request, controller):
"""For non-safe requests, confirm that the tokens are present
and match.
"""
@@ -77,9 +85,11 @@ class CsrfMiddleware(object):
# if this is a non-"safe" request (ie, one that could have
# side effects), confirm that the CSRF tokens are present and
# valid
- if request.method not in self.SAFE_HTTP_METHODS \
- and ('gmg.verify_csrf' in request.environ or
- 'paste.testing' not in request.environ):
+ if (getattr(controller, 'csrf_enabled', True) and
+ request.method not in self.SAFE_HTTP_METHODS and
+ ('gmg.verify_csrf' in request.environ or
+ 'paste.testing' not in request.environ)
+ ):
return self.verify_tokens(request)
@@ -98,7 +108,7 @@ class CsrfMiddleware(object):
httponly=True)
# update the Vary header
- response.vary = (response.vary or []) + ['Cookie']
+ response.vary = (getattr(response, 'vary', None) or []) + ['Cookie']
def _make_token(self, request):
"""Generate a new token to use for CSRF protection."""
diff --git a/mediagoblin/middleware/noop.py b/mediagoblin/meddleware/noop.py
index 28380232..f5376494 100644
--- a/mediagoblin/middleware/noop.py
+++ b/mediagoblin/meddleware/noop.py
@@ -14,12 +14,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-class NoOpMiddleware(object):
- def __init__(self, mg_app):
- self.app = mg_app
+from mediagoblin.meddleware import BaseMeddleware
- def process_request(self, request):
+
+class NoOpMeddleware(BaseMeddleware):
+
+ def process_request(self, request, controller):
pass
def process_response(self, request, response):
diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py
new file mode 100644
index 00000000..e7eb1dde
--- /dev/null
+++ b/mediagoblin/media_types/__init__.py
@@ -0,0 +1,88 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import os
+import sys
+
+from mediagoblin import mg_globals
+from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
+
+
+class FileTypeNotSupported(Exception):
+ pass
+
+class InvalidFileType(Exception):
+ pass
+
+
+def get_media_types():
+ """
+ Generator, yields the available media types
+ """
+ for media_type in mg_globals.app_config['media_types']:
+ yield media_type
+
+
+def get_media_managers():
+ '''
+ Generator, yields all enabled media managers
+ '''
+ for media_type in get_media_types():
+ __import__(media_type)
+
+ yield media_type, sys.modules[media_type].MEDIA_MANAGER
+
+
+def get_media_manager(_media_type):
+ '''
+ Get the MEDIA_MANAGER based on a media type string
+
+ Example::
+ get_media_type('mediagoblin.media_types.image')
+ '''
+ if not _media_type:
+ return False
+
+ for media_type, manager in get_media_managers():
+ if media_type in _media_type:
+ return manager
+
+ # Nope? Then raise an error
+ raise FileTypeNotSupported(
+ "MediaManager not in enabled types. Check media_types in config?")
+
+
+def get_media_type_and_manager(filename):
+ '''
+ Get the media type and manager based on a filename
+ '''
+ if filename.find('.') > 0:
+ # Get the file extension
+ ext = os.path.splitext(filename)[1].lower()
+ else:
+ raise InvalidFileType(
+ _(u'Could not extract any file extension from "{filename}"').format(
+ filename=filename))
+
+ for media_type, manager in get_media_managers():
+ # Omit the dot from the extension and match it against
+ # the media manager
+ if ext[1:] in manager['accepted_extensions']:
+ return media_type, manager
+ else:
+ raise FileTypeNotSupported(
+ # TODO: Provide information on which file types are supported
+ _(u'Sorry, I don\'t support that file type :('))
diff --git a/mediagoblin/media_types/ascii/__init__.py b/mediagoblin/media_types/ascii/__init__.py
new file mode 100644
index 00000000..21b31d0e
--- /dev/null
+++ b/mediagoblin/media_types/ascii/__init__.py
@@ -0,0 +1,27 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from mediagoblin.media_types.ascii.processing import process_ascii
+
+
+MEDIA_MANAGER = {
+ "human_readable": "ASCII",
+ "processor": process_ascii, # alternately a string,
+ # 'mediagoblin.media_types.image.processing'?
+ "display_template": "mediagoblin/media_displays/ascii.html",
+ "default_thumb": "images/media_thumbs/ascii.jpg",
+ "accepted_extensions": [
+ "txt"]}
diff --git a/mediagoblin/media_types/ascii/asciitoimage.py b/mediagoblin/media_types/ascii/asciitoimage.py
new file mode 100644
index 00000000..39c75a19
--- /dev/null
+++ b/mediagoblin/media_types/ascii/asciitoimage.py
@@ -0,0 +1,172 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import Image
+import ImageFont
+import ImageDraw
+import logging
+import pkg_resources
+import os
+
+_log = logging.getLogger(__name__)
+
+class AsciiToImage(object):
+ '''
+ Converter of ASCII art into image files, preserving whitespace
+
+ kwargs:
+ - font: Path to font file
+ default: fonts/Inconsolata.otf
+ - font_size: Font size, ``int``
+ default: 11
+ '''
+
+ # Font file path
+ _font = None
+
+ _font_size = 11
+
+ # ImageFont instance
+ _if = None
+
+ # ImageFont
+ _if_dims = None
+
+ # Image instance
+ _im = None
+
+ def __init__(self, **kw):
+ if kw.get('font'):
+ self._font = kw.get('font')
+ else:
+ self._font = pkg_resources.resource_filename(
+ 'mediagoblin.media_types.ascii',
+ os.path.join('fonts', 'Inconsolata.otf'))
+
+ if kw.get('font_size'):
+ self._font_size = kw.get('font_size')
+
+ _log.info('Setting font to {0}, size {1}'.format(
+ self._font,
+ self._font_size))
+
+ self._if = ImageFont.truetype(
+ self._font,
+ self._font_size)
+
+ # ,-,-^-'-^'^-^'^-'^-.
+ # ( I am a wall socket )Oo, ___
+ # `-.,.-.,.-.-.,.-.--' ' `
+ # Get the size, in pixels of the '.' character
+ self._if_dims = self._if.getsize('.')
+ # `---'
+
+ def convert(self, text, destination):
+ # TODO: Detect if text is a file-like, if so, act accordingly
+ im = self._create_image(text)
+
+ # PIL's Image.save will handle both file-likes and paths
+ if im.save(destination):
+ _log.info('Saved image in {0}'.format(
+ destination))
+
+ def _create_image(self, text):
+ '''
+ Write characters to a PIL image canvas.
+
+ TODO:
+ - Character set detection and decoding,
+ http://pypi.python.org/pypi/chardet
+ '''
+ # TODO: Account for alternative line endings
+ lines = text.split('\n')
+
+ line_lengths = [len(i) for i in lines]
+
+ # Calculate destination size based on text input and character size
+ im_dims = (
+ max(line_lengths) * self._if_dims[0],
+ len(line_lengths) * self._if_dims[1])
+
+ _log.info('Destination image dimensions will be {0}'.format(
+ im_dims))
+
+ im = Image.new(
+ 'RGBA',
+ im_dims,
+ (255, 255, 255, 0))
+
+ draw = ImageDraw.Draw(im)
+
+ char_pos = [0, 0]
+
+ for line in lines:
+ line_length = len(line)
+
+ _log.debug('Writing line at {0}'.format(char_pos))
+
+ for _pos in range(0, line_length):
+ char = line[_pos]
+
+ px_pos = self._px_pos(char_pos)
+
+ _log.debug('Writing character "{0}" at {1} (px pos {2}'.format(
+ char,
+ char_pos,
+ px_pos))
+
+ draw.text(
+ px_pos,
+ char,
+ font=self._if,
+ fill=(0, 0, 0, 255))
+
+ char_pos[0] += 1
+
+ # Reset X position, increment Y position
+ char_pos[0] = 0
+ char_pos[1] += 1
+
+ return im
+
+ def _px_pos(self, char_pos):
+ '''
+ Helper function to calculate the pixel position based on
+ character position and character dimensions
+ '''
+ px_pos = [0, 0]
+ for index, val in zip(range(0, len(char_pos)), char_pos):
+ px_pos[index] = char_pos[index] * self._if_dims[index]
+
+ return px_pos
+
+
+if __name__ == "__main__":
+ import urllib
+ txt = urllib.urlopen('file:///home/joar/Dropbox/ascii/install-all-the-dependencies.txt')
+
+ _log.setLevel(logging.DEBUG)
+ logging.basicConfig()
+
+ converter = AsciiToImage()
+
+ converter.convert(txt.read(), '/tmp/test.png')
+
+ '''
+ im, x, y, duration = renderImage(h, 10)
+ print "Rendered image in %.5f seconds" % duration
+ im.save('tldr.png', "PNG")
+ '''
diff --git a/mediagoblin/media_types/ascii/fonts/Inconsolata.otf b/mediagoblin/media_types/ascii/fonts/Inconsolata.otf
new file mode 120000
index 00000000..4e742b5e
--- /dev/null
+++ b/mediagoblin/media_types/ascii/fonts/Inconsolata.otf
@@ -0,0 +1 @@
+../../../../extlib/inconsolata/Inconsolata.otf \ No newline at end of file
diff --git a/mediagoblin/media_types/ascii/processing.py b/mediagoblin/media_types/ascii/processing.py
new file mode 100644
index 00000000..a74690c1
--- /dev/null
+++ b/mediagoblin/media_types/ascii/processing.py
@@ -0,0 +1,93 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import asciitoimage
+import chardet
+import os
+import Image
+
+from mediagoblin import mg_globals as mgg
+from mediagoblin.processing import create_pub_filepath, THUMB_SIZE
+
+
+def process_ascii(entry):
+ '''
+ Code to process a txt file
+ '''
+ workbench = mgg.workbench_manager.create_workbench()
+ # Conversions subdirectory to avoid collisions
+ conversions_subdir = os.path.join(
+ workbench.dir, 'conversions')
+ os.mkdir(conversions_subdir)
+
+ queued_filepath = entry['queued_media_file']
+ queued_filename = workbench.localized_file(
+ mgg.queue_store, queued_filepath,
+ 'source')
+
+ queued_file = file(queued_filename, 'rb')
+
+ with queued_file:
+ queued_file_charset = chardet.detect(queued_file.read())
+
+ queued_file.seek(0) # Rewind the queued file
+
+ thumb_filepath = create_pub_filepath(
+ entry, 'thumbnail.png')
+
+ tmp_thumb_filename = os.path.join(
+ conversions_subdir, thumb_filepath[-1])
+
+ converter = asciitoimage.AsciiToImage()
+
+ thumb = converter._create_image(
+ queued_file.read())
+
+ with file(tmp_thumb_filename, 'w') as thumb_file:
+ thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS)
+ thumb.save(thumb_file)
+
+ mgg.public_store.copy_local_to_storage(
+ tmp_thumb_filename, thumb_filepath)
+
+ queued_file.seek(0)
+
+ original_filepath = create_pub_filepath(entry, queued_filepath[-1])
+
+ with mgg.public_store.get_file(original_filepath, 'wb') \
+ as original_file:
+ original_file.write(queued_file.read())
+
+
+ queued_file.seek(0) # Rewind *again*
+
+ unicode_filepath = create_pub_filepath(entry, 'unicode.txt')
+
+ with mgg.public_store.get_file(unicode_filepath, 'wb') \
+ as unicode_file:
+ unicode_file.write(
+ unicode(queued_file.read().decode(
+ queued_file_charset['encoding'])).encode(
+ 'ascii',
+ 'xmlcharrefreplace'))
+
+ mgg.queue_store.delete_file(queued_filepath)
+ entry['queued_media_file'] = []
+ media_files_dict = entry.setdefault('media_files', {})
+ media_files_dict['thumb'] = thumb_filepath
+ media_files_dict['unicode'] = unicode_filepath
+ media_files_dict['original'] = original_filepath
+
+ entry.save()
diff --git a/mediagoblin/media_types/image/__init__.py b/mediagoblin/media_types/image/__init__.py
new file mode 100644
index 00000000..3b63d8eb
--- /dev/null
+++ b/mediagoblin/media_types/image/__init__.py
@@ -0,0 +1,26 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from mediagoblin.media_types.image.processing import process_image
+
+
+MEDIA_MANAGER = {
+ "human_readable": "Image",
+ "processor": process_image, # alternately a string,
+ # 'mediagoblin.media_types.image.processing'?
+ "display_template": "mediagoblin/media_displays/image.html",
+ "default_thumb": "images/media_thumbs/image.jpg",
+ "accepted_extensions": ["jpg", "jpeg", "png", "gif", "tiff"]}
diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py
new file mode 100644
index 00000000..cf90388f
--- /dev/null
+++ b/mediagoblin/media_types/image/processing.py
@@ -0,0 +1,109 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import Image
+import os
+
+from mediagoblin import mg_globals as mgg
+
+from mediagoblin.processing import BadMediaFail, \
+ create_pub_filepath, THUMB_SIZE, MEDIUM_SIZE
+
+################################
+# Media processing initial steps
+################################
+
+
+def process_image(entry):
+ """
+ Code to process an image
+ """
+ workbench = mgg.workbench_manager.create_workbench()
+ # Conversions subdirectory to avoid collisions
+ conversions_subdir = os.path.join(
+ workbench.dir, 'conversions')
+ os.mkdir(conversions_subdir)
+
+ queued_filepath = entry.queued_media_file
+ queued_filename = workbench.localized_file(
+ mgg.queue_store, queued_filepath,
+ 'source')
+
+ filename_bits = os.path.splitext(queued_filename)
+ basename = os.path.split(filename_bits[0])[1]
+ extension = filename_bits[1].lower()
+
+ try:
+ thumb = Image.open(queued_filename)
+ except IOError:
+ raise BadMediaFail()
+
+ thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS)
+
+ # Copy the thumb to the conversion subdir, then remotely.
+ thumb_filename = 'thumbnail' + extension
+ thumb_filepath = create_pub_filepath(entry, thumb_filename)
+ tmp_thumb_filename = os.path.join(
+ conversions_subdir, thumb_filename)
+ with file(tmp_thumb_filename, 'w') as thumb_file:
+ thumb.save(thumb_file)
+ mgg.public_store.copy_local_to_storage(
+ tmp_thumb_filename, thumb_filepath)
+
+ # If the size of the original file exceeds the specified size of a `medium`
+ # file, a `medium.jpg` files is created and later associated with the media
+ # entry.
+ medium = Image.open(queued_filename)
+ medium_processed = False
+
+ if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]:
+ medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS)
+
+ medium_filename = 'medium' + extension
+ medium_filepath = create_pub_filepath(entry, medium_filename)
+ tmp_medium_filename = os.path.join(
+ conversions_subdir, medium_filename)
+
+ with file(tmp_medium_filename, 'w') as medium_file:
+ medium.save(medium_file)
+
+ mgg.public_store.copy_local_to_storage(
+ tmp_medium_filename, medium_filepath)
+
+ medium_processed = True
+
+ # we have to re-read because unlike PIL, not everything reads
+ # things in string representation :)
+ queued_file = file(queued_filename, 'rb')
+
+ with queued_file:
+ #create_pub_filepath(entry, queued_filepath[-1])
+ original_filepath = create_pub_filepath(entry, basename + extension)
+
+ with mgg.public_store.get_file(original_filepath, 'wb') \
+ as original_file:
+ original_file.write(queued_file.read())
+
+ mgg.queue_store.delete_file(queued_filepath)
+ entry.queued_media_file = []
+ media_files_dict = entry.setdefault('media_files', {})
+ media_files_dict['thumb'] = thumb_filepath
+ media_files_dict['original'] = original_filepath
+ if medium_processed:
+ media_files_dict['medium'] = medium_filepath
+
+ # clean up workbench
+ workbench.destroy_self()
diff --git a/mediagoblin/media_types/video/__init__.py b/mediagoblin/media_types/video/__init__.py
new file mode 100644
index 00000000..a970ab01
--- /dev/null
+++ b/mediagoblin/media_types/video/__init__.py
@@ -0,0 +1,27 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from mediagoblin.media_types.video.processing import process_video
+
+
+MEDIA_MANAGER = {
+ "human_readable": "Video",
+ "processor": process_video, # alternately a string,
+ # 'mediagoblin.media_types.image.processing'?
+ "display_template": "mediagoblin/media_displays/video.html",
+ "default_thumb": "images/media_thumbs/video.jpg",
+ "accepted_extensions": [
+ "mp4", "mov", "webm", "avi", "3gp", "3gpp", "mkv", "ogv", "ogg"]}
diff --git a/mediagoblin/media_types/video/devices/web-advanced.json b/mediagoblin/media_types/video/devices/web-advanced.json
new file mode 100644
index 00000000..ce1d22ff
--- /dev/null
+++ b/mediagoblin/media_types/video/devices/web-advanced.json
@@ -0,0 +1,505 @@
+{
+ "make": "Generic",
+ "model": "Web Browser (Advanced)",
+ "description": "Media for World Wide Web",
+ "version": "0.1",
+ "author": {
+ "name": "Dionisio E Alonso",
+ "email": "dealonso@gmail.com"
+ },
+ "icon": "file://web.svg",
+ "default": "WebM 480p",
+ "presets": [
+ {
+ "name": "H.264 720p",
+ "extension": "mp4",
+ "container": "qtmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "qtmux",
+ "width": [
+ 960, 1280
+ ],
+ "height": [
+ 720, 720
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "qtmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+ {
+ "name": "WebM 720p",
+ "extension": "webm",
+ "container": "webmmux",
+ "icon": "file://web-webm.svg",
+ "vcodec": {
+ "name": "vp8enc",
+ "container": "webmmux",
+ "width": [
+ 960, 1280
+ ],
+ "height": [
+ 720, 720
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "quality=5.75 threads=%(threads)s speed=2"
+ ]
+ },
+ "acodec": {
+ "name": "vorbisenc",
+ "container": "webmmux",
+ "width": [
+ 8, 32
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "quality=0.3"
+ ]
+ }
+ },
+ {
+ "name": "Flash Video 720p",
+ "extension": "flv",
+ "icon": "file://web-flv.png",
+ "container": "flvmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "flvmux",
+ "width": [
+ 960, 1280
+ ],
+ "height": [
+ 720, 720
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "flvmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+
+ {
+ "name": "H.264 576p",
+ "extension": "mp4",
+ "container": "qtmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "qtmux",
+ "width": [
+ 768, 1024
+ ],
+ "height": [
+ 576, 576
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "qtmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+ {
+ "name": "WebM 576p",
+ "extension": "webm",
+ "container": "webmmux",
+ "icon": "file://web-webm.svg",
+ "vcodec": {
+ "name": "vp8enc",
+ "container": "webmmux",
+ "width": [
+ 768, 1024
+ ],
+ "height": [
+ 576, 576
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "quality=5.75 threads=%(threads)s speed=2"
+ ]
+ },
+ "acodec": {
+ "name": "vorbisenc",
+ "container": "webmmux",
+ "width": [
+ 8, 32
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "quality=0.3"
+ ]
+ }
+ },
+ {
+ "name": "Flash Video 576p",
+ "extension": "flv",
+ "icon": "file://web-flv.png",
+ "container": "flvmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "flvmux",
+ "width": [
+ 768, 1024
+ ],
+ "height": [
+ 576, 576
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "flvmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+
+ {
+ "name": "H.264 480p",
+ "extension": "mp4",
+ "container": "qtmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "qtmux",
+ "width": [
+ 640, 854
+ ],
+ "height": [
+ 480, 480
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "qtmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+ {
+ "name": "WebM 480p",
+ "extension": "webm",
+ "container": "webmmux",
+ "icon": "file://web-webm.svg",
+ "vcodec": {
+ "name": "vp8enc",
+ "container": "webmmux",
+ "width": [
+ 640, 854
+ ],
+ "height": [
+ 480, 480
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "quality=5.75 threads=%(threads)s speed=2"
+ ]
+ },
+ "acodec": {
+ "name": "vorbisenc",
+ "container": "webmmux",
+ "width": [
+ 8, 32
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "quality=0.3"
+ ]
+ }
+ },
+ {
+ "name": "Flash Video 480p",
+ "extension": "flv",
+ "icon": "file://web-flv.png",
+ "container": "flvmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "flvmux",
+ "width": [
+ 640, 854
+ ],
+ "height": [
+ 480, 480
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "flvmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+
+ {
+ "name": "H.264 360p",
+ "extension": "mp4",
+ "container": "qtmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "qtmux",
+ "width": [
+ 480, 640
+ ],
+ "height": [
+ 360, 360
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "qtmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ },
+ {
+ "name": "WebM 360p",
+ "extension": "webm",
+ "container": "webmmux",
+ "icon": "file://web-webm.svg",
+ "vcodec": {
+ "name": "vp8enc",
+ "container": "webmmux",
+ "width": [
+ 480, 640
+ ],
+ "height": [
+ 360, 360
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "quality=5.75 threads=%(threads)s speed=2"
+ ]
+ },
+ "acodec": {
+ "name": "vorbisenc",
+ "container": "webmmux",
+ "width": [
+ 8, 32
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "quality=0.3"
+ ]
+ }
+ },
+ {
+ "name": "Flash Video 360p",
+ "extension": "flv",
+ "icon": "file://web-flv.png",
+ "container": "flvmux",
+ "vcodec": {
+ "name": "x264enc",
+ "container": "flvmux",
+ "width": [
+ 480, 640
+ ],
+ "height": [
+ 360, 360
+ ],
+ "rate": [
+ 1, 30
+ ],
+ "passes": [
+ "pass=qual quantizer=23 subme=6 cabac=0 threads=0"
+ ]
+ },
+ "acodec": {
+ "name": "faac",
+ "container": "flvmux",
+ "width": [
+ 8, 24
+ ],
+ "depth": [
+ 8, 24
+ ],
+ "rate": [
+ 8000, 96000
+ ],
+ "channels": [
+ 1, 2
+ ],
+ "passes": [
+ "bitrate=131072 profile=LC"
+ ]
+ }
+ }
+ ]
+}
diff --git a/mediagoblin/media_types/video/devices/web-flv.png b/mediagoblin/media_types/video/devices/web-flv.png
new file mode 100644
index 00000000..b75699f4
--- /dev/null
+++ b/mediagoblin/media_types/video/devices/web-flv.png
Binary files differ
diff --git a/mediagoblin/media_types/video/devices/web-webm.svg b/mediagoblin/media_types/video/devices/web-webm.svg
new file mode 100644
index 00000000..4e5b3e97
--- /dev/null
+++ b/mediagoblin/media_types/video/devices/web-webm.svg
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg2816"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="web-webm.svg">
+ <defs
+ id="defs2818">
+ <linearGradient
+ id="linearGradient3656">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3658" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3660" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3632">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.54901963;"
+ offset="0"
+ id="stop3634" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3636" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3622">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3624" />
+ <stop
+ style="stop-color:#d3d7cf;stop-opacity:1;"
+ offset="1"
+ id="stop3626" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3600">
+ <stop
+ style="stop-color:#8ae234;stop-opacity:1;"
+ offset="0"
+ id="stop3602" />
+ <stop
+ style="stop-color:#4e9a06;stop-opacity:1;"
+ offset="1"
+ id="stop3604" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective2824" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3600"
+ id="linearGradient3606"
+ x1="20.256382"
+ y1="2.546674"
+ x2="20.256382"
+ y2="46.881901"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3622"
+ id="linearGradient3628"
+ x1="21.2349"
+ y1="7.948472"
+ x2="21.2349"
+ y2="40.191879"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3632"
+ id="linearGradient3638"
+ x1="6.4826794"
+ y1="4.543263"
+ x2="25.363527"
+ y2="35.227882"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,-0.35355339)" />
+ <inkscape:perspective
+ id="perspective3693"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3600-5"
+ id="linearGradient3606-9"
+ x1="20.256382"
+ y1="2.546674"
+ x2="20.256382"
+ y2="46.881901"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3600-5">
+ <stop
+ style="stop-color:#8ae234;stop-opacity:1;"
+ offset="0"
+ id="stop3602-7" />
+ <stop
+ style="stop-color:#4e9a06;stop-opacity:1;"
+ offset="1"
+ id="stop3604-2" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3731">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.82730657"
+ id="feGaussianBlur3733" />
+ </filter>
+ <inkscape:perspective
+ id="perspective3749"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3782"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8"
+ inkscape:cx="20.51741"
+ inkscape:cy="22.534228"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:window-width="1099"
+ inkscape:window-height="834"
+ inkscape:window-x="801"
+ inkscape:window-y="106"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3608" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2821">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="star"
+ style="fill:#000000;fill-opacity:0.2869955;stroke:none;filter:url(#filter3731)"
+ id="path3598-4"
+ sodipodi:sides="3"
+ sodipodi:cx="13.857143"
+ sodipodi:cy="24.714287"
+ sodipodi:r1="25.596954"
+ sodipodi:r2="12.798477"
+ sodipodi:arg1="0"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 39.454098,24.714287 20.256381,35.798093 1.0586662,46.8819 l 0,-22.167614 0,-22.1676119 19.1977168,11.0838069 19.197715,11.083806 z"
+ transform="matrix(1.0537808,0,0,1.0537808,3.6163385,-1.9600717)" />
+ <path
+ sodipodi:type="star"
+ style="fill:url(#linearGradient3606);fill-opacity:1;stroke:#366a04;stroke-width:1.05497880999999993;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-linejoin:round"
+ id="path3598"
+ sodipodi:sides="3"
+ sodipodi:cx="13.857143"
+ sodipodi:cy="24.714287"
+ sodipodi:r1="25.596954"
+ sodipodi:r2="12.798477"
+ sodipodi:arg1="0"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 39.454098,24.714287 20.256381,35.798093 1.0586662,46.8819 l 0,-22.167614 0,-22.1676119 19.1977168,11.0838069 19.197715,11.083806 z"
+ transform="matrix(0.94788634,0,0,0.94788634,5.0257749,0.56128794)" />
+ <path
+ style="fill:url(#linearGradient3628);stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="m 6.5304575,9.646791 8.7347075,20.091724 4.674611,-18.160553 4.525987,2.612472 3.885316,12.559503 4.403755,-7.765833 1.744319,1.009296 -2.127799,9.211229 -6.155446,3.554753 -4.028978,-9.439016 -2.255629,13.086534 -5.852703,3.373025 -7.5584205,-9.989634 0.01028,-20.1435 z"
+ id="path3620"
+ sodipodi:nodetypes="cccccccccccccc" />
+ <path
+ style="fill:none;stroke:url(#linearGradient3638);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 6.9826793,42.785087 0,-38.0953773 32.9068657,18.9987873"
+ id="path3630"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="M 6.6184028,8.6135689 15.026019,28.134068 19.45616,10.995613"
+ id="path3739"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="m 25.081121,14.552251 3.345117,11.020499 3.93014,-6.825955"
+ id="path3739-5"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="m 6.6291261,30.85266 7.0710679,9.280777"
+ id="path3772"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="m 34.736621,20.290253 -2.032932,8.794642"
+ id="path3772-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.15686275"
+ d="m 20.594485,35.934991 1.811961,-10.650796 3.270369,7.778174"
+ id="path3796"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/mediagoblin/media_types/video/devices/web.svg b/mediagoblin/media_types/video/devices/web.svg
new file mode 100644
index 00000000..c0c68244
--- /dev/null
+++ b/mediagoblin/media_types/video/devices/web.svg
@@ -0,0 +1,982 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48px"
+ height="48px"
+ id="svg3440"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"
+ sodipodi:docname="internet-web-browser.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs3">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 24 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="48 : 24 : 1"
+ inkscape:persp3d-origin="24 : 16 : 1"
+ id="perspective156" />
+ <linearGradient
+ id="linearGradient4750">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4752" />
+ <stop
+ style="stop-color:#fefefe;stop-opacity:1.0000000;"
+ offset="0.37931034"
+ id="stop4758" />
+ <stop
+ style="stop-color:#1d1d1d;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop4754" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4350">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4352" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4354" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4126">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop4128" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.16494845;"
+ offset="1.0000000"
+ id="stop4130" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4114">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4116" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4118" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3962">
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop3964" />
+ <stop
+ style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+ offset="0.15517241"
+ id="stop4134" />
+ <stop
+ style="stop-color:#4074ae;stop-opacity:1.0000000;"
+ offset="0.75000000"
+ id="stop4346" />
+ <stop
+ style="stop-color:#36486c;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop3966" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3962"
+ id="radialGradient3968"
+ gradientTransform="scale(0.999989,1.000011)"
+ cx="18.247644"
+ cy="15.716079"
+ fx="18.247644"
+ fy="15.716079"
+ r="29.993349"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4114"
+ id="radialGradient4120"
+ gradientTransform="scale(1.643990,0.608276)"
+ cx="15.115514"
+ cy="63.965388"
+ fx="15.115514"
+ fy="63.965388"
+ r="12.289036"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4126"
+ id="radialGradient4132"
+ gradientTransform="scale(0.999989,1.000011)"
+ cx="15.601279"
+ cy="12.142302"
+ fx="15.601279"
+ fy="12.142302"
+ r="43.526714"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4350"
+ id="radialGradient4356"
+ gradientTransform="scale(1.179536,0.847791)"
+ cx="11.826907"
+ cy="10.476453"
+ fx="11.826907"
+ fy="10.476453"
+ r="32.664848"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4750"
+ id="radialGradient4756"
+ gradientTransform="scale(1.036822,0.964486)"
+ cx="18.633780"
+ cy="17.486208"
+ fx="18.934305"
+ fy="17.810213"
+ r="40.692665"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1460"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1462"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1466"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1468"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1470"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1474"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1476"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1478"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1482"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1484"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1486"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1490"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1492"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1494"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1498"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1500"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1502"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1506"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1508"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1510"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1514"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1516"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1518"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1522"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1524"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1526"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1528"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1530"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1532"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1534"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1536"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1538"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1540"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1542"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1544"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1546"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1550"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1552"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1554"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ <radialGradient
+ r="40.692665"
+ fy="17.810213"
+ fx="18.934305"
+ cy="17.486208"
+ cx="18.633780"
+ gradientTransform="scale(1.036822,0.964486)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient1558"
+ xlink:href="#linearGradient4750"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.17254902"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="9.8994949"
+ inkscape:cx="25.799661"
+ inkscape:cy="24.622653"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1440"
+ inkscape:window-height="823"
+ inkscape:window-x="0"
+ inkscape:window-y="30"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Globe</dc:title>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Tuomas Kuosmanen</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>globe</rdf:li>
+ <rdf:li>international</rdf:li>
+ <rdf:li>web</rdf:li>
+ <rdf:li>www</rdf:li>
+ <rdf:li>internet</rdf:li>
+ <rdf:li>network</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/publicdomain/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient4120);fill-opacity:1.0000000;stroke:none;stroke-opacity:1.0000000"
+ id="path4112"
+ sodipodi:cx="24.849752"
+ sodipodi:cy="38.908627"
+ sodipodi:rx="20.203051"
+ sodipodi:ry="7.4751287"
+ d="M 45.052803 38.908627 A 20.203051 7.4751287 0 1 1 4.6467018,38.908627 A 20.203051 7.4751287 0 1 1 45.052803 38.908627 z"
+ transform="matrix(1.000000,0.000000,0.000000,1.243244,0.000000,-10.27241)" />
+ <path
+ style="fill:url(#radialGradient3968);fill-opacity:1.0000000;fill-rule:nonzero;stroke:#39396c;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+ d="M 43.959853,23.485499 C 43.959853,34.195217 35.277750,42.877222 24.569505,42.877222 C 13.860279,42.877222 5.1786663,34.195119 5.1786663,23.485499 C 5.1786663,12.776272 13.860279,4.0951517 24.569505,4.0951517 C 35.277750,4.0951517 43.959853,12.776272 43.959853,23.485499 L 43.959853,23.485499 z "
+ id="path3214" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.42159382;fill:url(#radialGradient4356);fill-opacity:1.0000000;stroke:none;stroke-opacity:1.0000000"
+ id="path4348"
+ sodipodi:cx="17.778685"
+ sodipodi:cy="15.271057"
+ sodipodi:rx="12.929953"
+ sodipodi:ry="9.2934036"
+ d="M 30.708637 15.271057 A 12.929953 9.2934036 0 1 1 4.8487320,15.271057 A 12.929953 9.2934036 0 1 1 30.708637 15.271057 z"
+ transform="matrix(0.835938,0.000000,0.000000,1.000000,9.886868,0.000000)" />
+ <g
+ id="g4136"
+ style="fill:#000000;fill-opacity:0.71345031;fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
+ transform="matrix(0.982371,0.000000,0.000000,0.982371,0.121079,0.232914)">
+ <g
+ id="g4138">
+ <g
+ id="g4142">
+ <path
+ d="M 44.071300,20.714400 C 44.071300,20.977100 44.071300,20.714400 44.071300,20.714400 L 43.526400,21.331600 C 43.192400,20.938000 42.817400,20.607000 42.436600,20.261300 L 41.600700,20.384300 L 40.837000,19.521000 L 40.837000,20.589400 L 41.491300,21.084500 L 41.926800,21.577700 L 42.508800,20.919500 C 42.655300,21.193900 42.799800,21.468300 42.945300,21.742700 L 42.945300,22.565000 L 42.290000,23.305200 L 41.090800,24.128400 L 40.182600,25.034700 L 39.600600,24.374500 L 39.891600,23.634300 L 39.310500,22.976100 L 38.329100,20.878400 L 37.493200,19.933100 L 37.274400,20.179200 L 37.602500,21.372600 L 38.219700,22.071800 C 38.572200,23.089400 38.920900,24.062000 39.383800,25.034700 C 40.101600,25.034700 40.778300,24.958500 41.491200,24.868700 L 41.491200,25.444900 L 40.619100,27.584100 L 39.819300,28.488400 L 39.165000,29.888800 C 39.165000,30.656400 39.165000,31.424000 39.165000,32.191500 L 39.383800,33.097800 L 39.020500,33.508000 L 38.219700,34.002100 L 37.383800,34.701300 L 38.075200,35.482600 L 37.129900,36.306800 L 37.311500,36.840000 L 35.893500,38.445500 L 34.949200,38.445500 L 34.149400,38.939600 L 33.639600,38.939600 L 33.639600,38.281400 L 33.422800,36.963000 C 33.141500,36.136800 32.848600,35.316500 32.550700,34.496200 C 32.550700,33.890700 32.586800,33.291100 32.623000,32.685700 L 32.987300,31.863400 L 32.477500,30.875100 L 32.514600,29.517700 L 31.823200,28.736400 L 32.168900,27.605500 L 31.606400,26.967300 L 30.624000,26.967300 L 30.296900,26.597200 L 29.315500,27.214900 L 28.916100,26.761300 L 28.006900,27.543000 C 27.389700,26.843300 26.771500,26.144100 26.153400,25.444900 L 25.426800,23.716400 L 26.081100,22.730100 L 25.717800,22.319000 L 26.516600,20.425400 C 27.172900,19.609000 27.858400,18.825800 28.551800,18.039700 L 29.788100,17.710600 L 31.169000,17.546500 L 32.114300,17.793600 L 33.459000,19.150000 L 33.931700,18.615800 L 34.585000,18.533800 L 35.821300,18.944900 L 36.766600,18.944900 L 37.420900,18.368700 L 37.711900,17.957600 L 37.056600,17.546500 L 35.965800,17.464500 C 35.663100,17.044600 35.381800,16.603200 35.022400,16.230100 L 34.658100,16.394200 L 34.512600,17.464500 L 33.858300,16.724300 L 33.713800,15.900100 L 32.987200,15.325900 L 32.695200,15.325900 L 33.422700,16.148200 L 33.131700,16.888400 L 32.550600,17.052500 L 32.913900,16.312300 L 32.258600,15.984200 L 31.678500,15.326000 L 30.586700,15.572100 L 30.442200,15.900200 L 29.787900,16.312300 L 29.424600,17.217600 L 28.516400,17.669700 L 28.116000,17.217600 L 27.680500,17.217600 L 27.680500,15.736200 L 28.625800,15.242100 L 29.352400,15.242100 L 29.205900,14.666900 L 28.625800,14.090700 L 29.606300,13.884600 L 30.151200,13.268400 L 30.586700,12.527200 L 31.387500,12.527200 L 31.168700,11.952000 L 31.678500,11.622900 L 31.678500,12.281100 L 32.768300,12.527200 L 33.858100,11.622900 L 33.931300,11.210800 L 34.875600,10.553100 C 34.533800,10.595600 34.192000,10.626800 33.858000,10.717700 L 33.858000,9.9766000 L 34.221300,9.1538000 L 33.858000,9.1538000 L 33.059600,9.8940000 L 32.840800,10.305600 L 33.059600,10.882300 L 32.695300,11.868600 L 32.114200,11.539500 L 31.606400,10.964300 L 30.805600,11.539500 L 30.514600,10.223600 L 31.895500,9.3188000 L 31.895500,8.8247000 L 32.768500,8.2490000 L 34.149400,7.9194000 L 35.094700,8.2490000 L 36.838800,8.5781000 L 36.403300,9.0713000 L 35.458000,9.0713000 L 36.403300,10.058600 L 37.129900,9.2363000 L 37.350600,8.8745000 C 37.350600,8.8745000 40.137700,11.372500 41.730500,14.105000 C 43.323300,16.838400 44.071300,20.060100 44.071300,20.714400 z "
+ id="path4144" />
+ </g>
+ </g>
+ <g
+ id="g4146">
+ <g
+ id="g4150">
+ <path
+ d="M 26.070300,9.2363000 L 25.997100,9.7295000 L 26.506900,10.058600 L 27.378000,9.4829000 L 26.942500,8.9892000 L 26.360500,9.3188000 L 26.070500,9.2363000"
+ id="path4152" />
+ </g>
+ </g>
+ <g
+ id="g4154">
+ <g
+ id="g4158">
+ <path
+ d="M 26.870100,5.8633000 L 24.979500,5.1226000 L 22.799800,5.3692000 L 20.109400,6.1094000 L 19.600600,6.6035000 L 21.272500,7.7549000 L 21.272500,8.4131000 L 20.618200,9.0713000 L 21.491200,10.800300 L 22.071300,10.470200 L 22.799800,9.3188000 C 23.922800,8.9716000 24.929700,8.5781000 25.997100,8.0844000 L 26.870100,5.8632000"
+ id="path4160" />
+ </g>
+ </g>
+ <g
+ id="g4162">
+ <g
+ id="g4166">
+ <path
+ d="M 28.833000,12.774900 L 28.542000,12.033700 L 28.032200,12.198700 L 28.178700,13.103000 L 28.833000,12.774900"
+ id="path4168" />
+ </g>
+ </g>
+ <g
+ id="g4170">
+ <g
+ id="g4174">
+ <path
+ d="M 29.123000,12.608900 L 28.977500,13.597200 L 29.777300,13.432200 L 30.358400,12.857000 L 29.849600,12.362900 C 29.678700,11.907800 29.482400,11.483000 29.268500,11.046500 L 28.833000,11.046500 L 28.833000,11.539700 L 29.123000,11.868800 L 29.123000,12.609000"
+ id="path4176" />
+ </g>
+ </g>
+ <g
+ id="g4178">
+ <g
+ id="g4182">
+ <path
+ d="M 18.365200,28.242200 L 17.783200,27.089900 L 16.692900,26.843300 L 16.111400,25.280800 L 14.657800,25.444900 L 13.422400,24.540600 L 12.113300,25.692000 L 12.113300,25.873600 C 11.717300,25.759300 11.230500,25.743700 10.877900,25.526900 L 10.586900,24.704600 L 10.586900,23.799300 L 9.7148000,23.881300 C 9.7876000,23.305100 9.8598000,22.729900 9.9331000,22.153800 L 9.4238000,22.153800 L 8.9155000,22.812000 L 8.4062000,23.058100 L 7.6791000,22.647900 L 7.6063000,21.742600 L 7.7518000,20.755300 L 8.8426000,19.933000 L 9.7147000,19.933000 L 9.8597000,19.438900 L 10.950000,19.685000 L 11.749800,20.673300 L 11.895300,19.026800 L 13.276600,17.875400 L 13.785400,16.641000 L 14.803000,16.229900 L 15.384500,15.407600 L 16.692600,15.159600 L 17.347400,14.173300 C 16.693100,14.173300 16.038800,14.173300 15.384500,14.173300 L 16.620300,13.597100 L 17.491900,13.597100 L 18.728200,13.185000 L 18.873700,12.692800 L 18.437200,12.280700 L 17.928400,12.115700 L 18.073900,11.622500 L 17.710600,10.882300 L 16.838000,11.210400 L 16.983500,10.552700 L 15.965900,9.9765000 L 15.166600,11.374400 L 15.238900,11.868500 L 14.439600,12.198600 L 13.930300,13.267900 L 13.712500,12.280600 L 12.331200,11.704400 L 12.112900,10.964200 L 13.930300,9.8939000 L 14.730100,9.1537000 L 14.802900,8.2489000 L 14.366900,8.0018000 L 13.785400,7.9193000 L 13.422100,8.8246000 C 13.422100,8.8246000 12.814200,8.9437000 12.657900,8.9823000 C 10.661800,10.821700 6.6286000,14.792400 5.6916000,22.288500 C 5.7287000,22.462300 6.3708000,23.470100 6.3708000,23.470100 L 7.8972000,24.374400 L 9.4236000,24.786500 L 10.078400,25.609700 L 11.095500,26.349900 L 11.677000,26.267900 L 12.113000,26.464200 L 12.113000,26.597000 L 11.531900,28.160000 L 11.095400,28.818200 L 11.240900,29.148300 L 10.877600,30.380700 L 12.186200,32.767400 L 13.494300,33.919700 L 14.076300,34.742000 L 14.003100,36.470500 L 14.439600,37.456800 L 14.003100,39.349400 C 14.003100,39.349400 13.968900,39.337700 14.024600,39.527100 C 14.080800,39.716600 16.353700,40.978300 16.498200,40.870900 C 16.642200,40.761500 16.765300,40.665800 16.765300,40.665800 L 16.620300,40.255600 L 17.201400,39.679400 L 17.419700,39.103200 L 18.365000,38.773100 L 19.091600,36.962600 L 18.873800,36.470400 L 19.381600,35.730200 L 20.472400,35.482200 L 21.054400,34.165800 L 20.908900,32.521300 L 21.781000,31.286900 L 21.926500,30.052500 C 20.733100,29.460700 19.549500,28.851300 18.365000,28.242000"
+ id="path4184" />
+ </g>
+ </g>
+ <g
+ id="g4186">
+ <g
+ id="g4190">
+ <path
+ d="M 16.765600,9.5649000 L 17.492200,10.058600 L 18.074200,10.058600 L 18.074200,9.4829000 L 17.347600,9.1538000 L 16.765600,9.5649000"
+ id="path4192" />
+ </g>
+ </g>
+ <g
+ id="g4194">
+ <g
+ id="g4198">
+ <path
+ d="M 14.876000,8.9072000 L 14.512200,9.8120000 L 15.239300,9.8120000 L 15.603100,8.9892000 C 15.916600,8.7675000 16.228600,8.5444000 16.547900,8.3310000 L 17.275000,8.5781000 C 17.759400,8.9072000 18.243800,9.2363000 18.728600,9.5649000 L 19.456100,8.9072000 L 18.655800,8.5781000 L 18.292000,7.8374000 L 16.911100,7.6728000 L 16.838300,7.2612000 L 16.184000,7.4262000 L 15.893600,8.0020000 L 15.529800,7.2613000 L 15.384800,7.5904000 L 15.457600,8.4132000 L 14.876000,8.9072000"
+ id="path4200" />
+ </g>
+ </g>
+ <g
+ id="g4202">
+ <g
+ style="opacity:0.75000000"
+ id="g4204">
+ <path
+ id="path4206"
+ d="" />
+ </g>
+ <g
+ id="g4208">
+ <path
+ id="path4210"
+ d="" />
+ </g>
+ </g>
+ <g
+ id="g4212">
+ <g
+ style="opacity:0.75000000"
+ id="g4214">
+ <path
+ id="path4216"
+ d="" />
+ </g>
+ <g
+ id="g4218">
+ <path
+ id="path4220"
+ d="" />
+ </g>
+ </g>
+ <g
+ id="g4222">
+ <g
+ id="g4226">
+ <path
+ d="M 17.492200,6.8496000 L 17.856000,6.5210000 L 18.583100,6.3564000 C 19.081100,6.1142000 19.581100,5.9511000 20.109500,5.7802000 L 19.819500,5.2865000 L 18.881000,5.4213000 L 18.437600,5.8632000 L 17.706600,5.9692000 L 17.056700,6.2744000 L 16.740800,6.4272000 L 16.547900,6.6855000 L 17.492200,6.8496000"
+ id="path4228" />
+ </g>
+ </g>
+ <g
+ id="g4230">
+ <g
+ id="g4234">
+ <path
+ d="M 18.728500,14.666500 L 19.165000,14.008300 L 18.510200,13.515100 L 18.728500,14.666500"
+ id="path4236" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g3216"
+ style="color:#000000;fill:url(#radialGradient1460);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0179454;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ transform="matrix(0.982371,0.000000,0.000000,0.982371,-8.095179e-2,3.088300e-2)">
+ <g
+ id="g3218"
+ style="color:#000000;fill:url(#radialGradient1462);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3222"
+ style="color:#000000;fill:url(#radialGradient1466);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 44.071300,20.714400 C 44.071300,20.977100 44.071300,20.714400 44.071300,20.714400 L 43.526400,21.331600 C 43.192400,20.938000 42.817400,20.607000 42.436600,20.261300 L 41.600700,20.384300 L 40.837000,19.521000 L 40.837000,20.589400 L 41.491300,21.084500 L 41.926800,21.577700 L 42.508800,20.919500 C 42.655300,21.193900 42.799800,21.468300 42.945300,21.742700 L 42.945300,22.565000 L 42.290000,23.305200 L 41.090800,24.128400 L 40.182600,25.034700 L 39.600600,24.374500 L 39.891600,23.634300 L 39.310500,22.976100 L 38.329100,20.878400 L 37.493200,19.933100 L 37.274400,20.179200 L 37.602500,21.372600 L 38.219700,22.071800 C 38.572200,23.089400 38.920900,24.062000 39.383800,25.034700 C 40.101600,25.034700 40.778300,24.958500 41.491200,24.868700 L 41.491200,25.444900 L 40.619100,27.584100 L 39.819300,28.488400 L 39.165000,29.888800 C 39.165000,30.656400 39.165000,31.424000 39.165000,32.191500 L 39.383800,33.097800 L 39.020500,33.508000 L 38.219700,34.002100 L 37.383800,34.701300 L 38.075200,35.482600 L 37.129900,36.306800 L 37.311500,36.840000 L 35.893500,38.445500 L 34.949200,38.445500 L 34.149400,38.939600 L 33.639600,38.939600 L 33.639600,38.281400 L 33.422800,36.963000 C 33.141500,36.136800 32.848600,35.316500 32.550700,34.496200 C 32.550700,33.890700 32.586800,33.291100 32.623000,32.685700 L 32.987300,31.863400 L 32.477500,30.875100 L 32.514600,29.517700 L 31.823200,28.736400 L 32.168900,27.605500 L 31.606400,26.967300 L 30.624000,26.967300 L 30.296900,26.597200 L 29.315500,27.214900 L 28.916100,26.761300 L 28.006900,27.543000 C 27.389700,26.843300 26.771500,26.144100 26.153400,25.444900 L 25.426800,23.716400 L 26.081100,22.730100 L 25.717800,22.319000 L 26.516600,20.425400 C 27.172900,19.609000 27.858400,18.825800 28.551800,18.039700 L 29.788100,17.710600 L 31.169000,17.546500 L 32.114300,17.793600 L 33.459000,19.150000 L 33.931700,18.615800 L 34.585000,18.533800 L 35.821300,18.944900 L 36.766600,18.944900 L 37.420900,18.368700 L 37.711900,17.957600 L 37.056600,17.546500 L 35.965800,17.464500 C 35.663100,17.044600 35.381800,16.603200 35.022400,16.230100 L 34.658100,16.394200 L 34.512600,17.464500 L 33.858300,16.724300 L 33.713800,15.900100 L 32.987200,15.325900 L 32.695200,15.325900 L 33.422700,16.148200 L 33.131700,16.888400 L 32.550600,17.052500 L 32.913900,16.312300 L 32.258600,15.984200 L 31.678500,15.326000 L 30.586700,15.572100 L 30.442200,15.900200 L 29.787900,16.312300 L 29.424600,17.217600 L 28.516400,17.669700 L 28.116000,17.217600 L 27.680500,17.217600 L 27.680500,15.736200 L 28.625800,15.242100 L 29.352400,15.242100 L 29.205900,14.666900 L 28.625800,14.090700 L 29.606300,13.884600 L 30.151200,13.268400 L 30.586700,12.527200 L 31.387500,12.527200 L 31.168700,11.952000 L 31.678500,11.622900 L 31.678500,12.281100 L 32.768300,12.527200 L 33.858100,11.622900 L 33.931300,11.210800 L 34.875600,10.553100 C 34.533800,10.595600 34.192000,10.626800 33.858000,10.717700 L 33.858000,9.9766000 L 34.221300,9.1538000 L 33.858000,9.1538000 L 33.059600,9.8940000 L 32.840800,10.305600 L 33.059600,10.882300 L 32.695300,11.868600 L 32.114200,11.539500 L 31.606400,10.964300 L 30.805600,11.539500 L 30.514600,10.223600 L 31.895500,9.3188000 L 31.895500,8.8247000 L 32.768500,8.2490000 L 34.149400,7.9194000 L 35.094700,8.2490000 L 36.838800,8.5781000 L 36.403300,9.0713000 L 35.458000,9.0713000 L 36.403300,10.058600 L 37.129900,9.2363000 L 37.350600,8.8745000 C 37.350600,8.8745000 40.137700,11.372500 41.730500,14.105000 C 43.323300,16.838400 44.071300,20.060100 44.071300,20.714400 z "
+ id="path3224"
+ style="color:#000000;fill:url(#radialGradient1468);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3226"
+ style="color:#000000;fill:url(#radialGradient1470);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3230"
+ style="color:#000000;fill:url(#radialGradient1474);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 26.070300,9.2363000 L 25.997100,9.7295000 L 26.506900,10.058600 L 27.378000,9.4829000 L 26.942500,8.9892000 L 26.360500,9.3188000 L 26.070500,9.2363000"
+ id="path3232"
+ style="color:#000000;fill:url(#radialGradient1476);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3234"
+ style="color:#000000;fill:url(#radialGradient1478);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3238"
+ style="color:#000000;fill:url(#radialGradient1482);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 26.870100,5.8633000 L 24.979500,5.1226000 L 22.799800,5.3692000 L 20.109400,6.1094000 L 19.600600,6.6035000 L 21.272500,7.7549000 L 21.272500,8.4131000 L 20.618200,9.0713000 L 21.491200,10.800300 L 22.071300,10.470200 L 22.799800,9.3188000 C 23.922800,8.9716000 24.929700,8.5781000 25.997100,8.0844000 L 26.870100,5.8632000"
+ id="path3240"
+ style="color:#000000;fill:url(#radialGradient1484);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3242"
+ style="color:#000000;fill:url(#radialGradient1486);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3246"
+ style="color:#000000;fill:url(#radialGradient1490);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 28.833000,12.774900 L 28.542000,12.033700 L 28.032200,12.198700 L 28.178700,13.103000 L 28.833000,12.774900"
+ id="path3248"
+ style="color:#000000;fill:url(#radialGradient1492);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3250"
+ style="color:#000000;fill:url(#radialGradient1494);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3254"
+ style="color:#000000;fill:url(#radialGradient1498);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 29.123000,12.608900 L 28.977500,13.597200 L 29.777300,13.432200 L 30.358400,12.857000 L 29.849600,12.362900 C 29.678700,11.907800 29.482400,11.483000 29.268500,11.046500 L 28.833000,11.046500 L 28.833000,11.539700 L 29.123000,11.868800 L 29.123000,12.609000"
+ id="path3256"
+ style="color:#000000;fill:url(#radialGradient1500);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3258"
+ style="color:#000000;fill:url(#radialGradient1502);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3262"
+ style="color:#000000;fill:url(#radialGradient1506);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 18.365200,28.242200 L 17.783200,27.089900 L 16.692900,26.843300 L 16.111400,25.280800 L 14.657800,25.444900 L 13.422400,24.540600 L 12.113300,25.692000 L 12.113300,25.873600 C 11.717300,25.759300 11.230500,25.743700 10.877900,25.526900 L 10.586900,24.704600 L 10.586900,23.799300 L 9.7148000,23.881300 C 9.7876000,23.305100 9.8598000,22.729900 9.9331000,22.153800 L 9.4238000,22.153800 L 8.9155000,22.812000 L 8.4062000,23.058100 L 7.6791000,22.647900 L 7.6063000,21.742600 L 7.7518000,20.755300 L 8.8426000,19.933000 L 9.7147000,19.933000 L 9.8597000,19.438900 L 10.950000,19.685000 L 11.749800,20.673300 L 11.895300,19.026800 L 13.276600,17.875400 L 13.785400,16.641000 L 14.803000,16.229900 L 15.384500,15.407600 L 16.692600,15.159600 L 17.347400,14.173300 C 16.693100,14.173300 16.038800,14.173300 15.384500,14.173300 L 16.620300,13.597100 L 17.491900,13.597100 L 18.728200,13.185000 L 18.873700,12.692800 L 18.437200,12.280700 L 17.928400,12.115700 L 18.073900,11.622500 L 17.710600,10.882300 L 16.838000,11.210400 L 16.983500,10.552700 L 15.965900,9.9765000 L 15.166600,11.374400 L 15.238900,11.868500 L 14.439600,12.198600 L 13.930300,13.267900 L 13.712500,12.280600 L 12.331200,11.704400 L 12.112900,10.964200 L 13.930300,9.8939000 L 14.730100,9.1537000 L 14.802900,8.2489000 L 14.366900,8.0018000 L 13.785400,7.9193000 L 13.422100,8.8246000 C 13.422100,8.8246000 12.814200,8.9437000 12.657900,8.9823000 C 10.661800,10.821700 6.6286000,14.792400 5.6916000,22.288500 C 5.7287000,22.462300 6.3708000,23.470100 6.3708000,23.470100 L 7.8972000,24.374400 L 9.4236000,24.786500 L 10.078400,25.609700 L 11.095500,26.349900 L 11.677000,26.267900 L 12.113000,26.464200 L 12.113000,26.597000 L 11.531900,28.160000 L 11.095400,28.818200 L 11.240900,29.148300 L 10.877600,30.380700 L 12.186200,32.767400 L 13.494300,33.919700 L 14.076300,34.742000 L 14.003100,36.470500 L 14.439600,37.456800 L 14.003100,39.349400 C 14.003100,39.349400 13.968900,39.337700 14.024600,39.527100 C 14.080800,39.716600 16.353700,40.978300 16.498200,40.870900 C 16.642200,40.761500 16.765300,40.665800 16.765300,40.665800 L 16.620300,40.255600 L 17.201400,39.679400 L 17.419700,39.103200 L 18.365000,38.773100 L 19.091600,36.962600 L 18.873800,36.470400 L 19.381600,35.730200 L 20.472400,35.482200 L 21.054400,34.165800 L 20.908900,32.521300 L 21.781000,31.286900 L 21.926500,30.052500 C 20.733100,29.460700 19.549500,28.851300 18.365000,28.242000"
+ id="path3264"
+ style="color:#000000;fill:url(#radialGradient1508);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3266"
+ style="color:#000000;fill:url(#radialGradient1510);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3270"
+ style="color:#000000;fill:url(#radialGradient1514);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 16.765600,9.5649000 L 17.492200,10.058600 L 18.074200,10.058600 L 18.074200,9.4829000 L 17.347600,9.1538000 L 16.765600,9.5649000"
+ id="path3272"
+ style="color:#000000;fill:url(#radialGradient1516);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3274"
+ style="color:#000000;fill:url(#radialGradient1518);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3278"
+ style="color:#000000;fill:url(#radialGradient1522);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 14.876000,8.9072000 L 14.512200,9.8120000 L 15.239300,9.8120000 L 15.603100,8.9892000 C 15.916600,8.7675000 16.228600,8.5444000 16.547900,8.3310000 L 17.275000,8.5781000 C 17.759400,8.9072000 18.243800,9.2363000 18.728600,9.5649000 L 19.456100,8.9072000 L 18.655800,8.5781000 L 18.292000,7.8374000 L 16.911100,7.6728000 L 16.838300,7.2612000 L 16.184000,7.4262000 L 15.893600,8.0020000 L 15.529800,7.2613000 L 15.384800,7.5904000 L 15.457600,8.4132000 L 14.876000,8.9072000"
+ id="path3280"
+ style="color:#000000;fill:url(#radialGradient1524);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3282"
+ style="color:#000000;fill:url(#radialGradient1526);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ style="opacity:0.75000000;color:#000000;fill:url(#radialGradient1528);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ id="g3284">
+ <path
+ d=""
+ style="color:#000000;fill:url(#radialGradient1530);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ id="path3286" />
+ </g>
+ <g
+ id="g3288"
+ style="color:#000000;fill:url(#radialGradient1532);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d=""
+ id="path3290"
+ style="color:#000000;fill:url(#radialGradient1534);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3292"
+ style="color:#000000;fill:url(#radialGradient1536);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ style="opacity:0.75000000;color:#000000;fill:url(#radialGradient1538);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ id="g3294">
+ <path
+ d=""
+ style="color:#000000;fill:url(#radialGradient1540);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
+ id="path3296" />
+ </g>
+ <g
+ id="g3298"
+ style="color:#000000;fill:url(#radialGradient1542);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d=""
+ id="path3300"
+ style="color:#000000;fill:url(#radialGradient1544);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3302"
+ style="color:#000000;fill:url(#radialGradient1546);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3306"
+ style="color:#000000;fill:url(#radialGradient1550);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 17.492200,6.8496000 L 17.856000,6.5210000 L 18.583100,6.3564000 C 19.081100,6.1142000 19.581100,5.9511000 20.109500,5.7802000 L 19.819500,5.2865000 L 18.881000,5.4213000 L 18.437600,5.8632000 L 17.706600,5.9692000 L 17.056700,6.2744000 L 16.740800,6.4272000 L 16.547900,6.6855000 L 17.492200,6.8496000"
+ id="path3308"
+ style="color:#000000;fill:url(#radialGradient1552);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ <g
+ id="g3310"
+ style="color:#000000;fill:url(#radialGradient1554);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <g
+ id="g3314"
+ style="color:#000000;fill:url(#radialGradient1558);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible">
+ <path
+ d="M 18.728500,14.666500 L 19.165000,14.008300 L 18.510200,13.515100 L 18.728500,14.666500"
+ id="path3316"
+ style="color:#000000;fill:url(#radialGradient4756);stroke-dashoffset:0.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+ </g>
+ <path
+ style="fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient4132);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+ d="M 42.975093,23.485534 C 42.975093,33.651354 34.733915,41.892440 24.569493,41.892440 C 14.404139,41.892440 6.1634261,33.651261 6.1634261,23.485534 C 6.1634261,13.320180 14.404139,5.0799340 24.569493,5.0799340 C 34.733915,5.0799340 42.975093,13.320180 42.975093,23.485534 L 42.975093,23.485534 z "
+ id="path4122" />
+ </g>
+</svg>
diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py
new file mode 100644
index 00000000..49a50647
--- /dev/null
+++ b/mediagoblin/media_types/video/processing.py
@@ -0,0 +1,119 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import tempfile
+import logging
+import os
+
+from mediagoblin import mg_globals as mgg
+from mediagoblin.processing import mark_entry_failed, \
+ THUMB_SIZE, MEDIUM_SIZE, create_pub_filepath
+from . import transcoders
+
+logging.basicConfig()
+
+_log = logging.getLogger(__name__)
+_log.setLevel(logging.DEBUG)
+
+
+def process_video(entry):
+ """
+ Code to process a video
+
+ Much of this code is derived from the arista-transcoder script in
+ the arista PyPI package and changed to match the needs of
+ MediaGoblin
+
+ This function sets up the arista video encoder in some kind of new thread
+ and attaches callbacks to that child process, hopefully, the
+ entry-complete callback will be called when the video is done.
+ """
+ video_config = mgg.global_config['media_type:mediagoblin.media_types.video']
+
+ workbench = mgg.workbench_manager.create_workbench()
+
+ queued_filepath = entry.queued_media_file
+ queued_filename = workbench.localized_file(
+ mgg.queue_store, queued_filepath,
+ 'source')
+
+ medium_filepath = create_pub_filepath(
+ entry,
+ '{original}-640p.webm'.format(
+ original=os.path.splitext(
+ queued_filepath[-1])[0] # Select the
+ ))
+
+ thumbnail_filepath = create_pub_filepath(
+ entry, 'thumbnail.jpg')
+
+
+ # Create a temporary file for the video destination
+ tmp_dst = tempfile.NamedTemporaryFile()
+
+ with tmp_dst:
+ # Transcode queued file to a VP8/vorbis file that fits in a 640x640 square
+ transcoder = transcoders.VideoTranscoder(queued_filename, tmp_dst.name)
+
+ # Push transcoded video to public storage
+ _log.debug('Saving medium...')
+ mgg.public_store.get_file(medium_filepath, 'wb').write(
+ tmp_dst.read())
+ _log.debug('Saved medium')
+
+ entry.media_files['webm_640'] = medium_filepath
+
+ # Save the width and height of the transcoded video
+ entry.media_data['video'] = {
+ u'width': transcoder.dst_data.videowidth,
+ u'height': transcoder.dst_data.videoheight}
+
+ # Create a temporary file for the video thumbnail
+ tmp_thumb = tempfile.NamedTemporaryFile()
+
+ with tmp_thumb:
+ # Create a thumbnail.jpg that fits in a 180x180 square
+ transcoders.VideoThumbnailer(queued_filename, tmp_thumb.name)
+
+ # Push the thumbnail to public storage
+ _log.debug('Saving thumbnail...')
+ mgg.public_store.get_file(thumbnail_filepath, 'wb').write(
+ tmp_thumb.read())
+ _log.debug('Saved thumbnail')
+
+ entry.media_files['thumb'] = thumbnail_filepath
+
+ if video_config['keep_original']:
+ # Push original file to public storage
+ queued_file = file(queued_filename, 'rb')
+
+ with queued_file:
+ original_filepath = create_pub_filepath(
+ entry,
+ queued_filepath[-1])
+
+ with mgg.public_store.get_file(original_filepath, 'wb') as \
+ original_file:
+ _log.debug('Saving original...')
+ original_file.write(queued_file.read())
+ _log.debug('Saved original')
+
+ entry.media_files['original'] = original_filepath
+
+ mgg.queue_store.delete_file(queued_filepath)
+
+ # Save the MediaEntry
+ entry.save()
diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py
new file mode 100644
index 00000000..7071b887
--- /dev/null
+++ b/mediagoblin/media_types/video/transcoders.py
@@ -0,0 +1,658 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import division
+
+import os
+os.putenv('GST_DEBUG_DUMP_DOT_DIR', '/tmp')
+
+import sys
+import logging
+import pdb
+import urllib
+
+_log = logging.getLogger(__name__)
+logging.basicConfig()
+_log.setLevel(logging.DEBUG)
+
+CPU_COUNT = 2
+try:
+ import multiprocessing
+ try:
+ CPU_COUNT = multiprocessing.cpu_count()
+ except NotImplementedError:
+ _log.warning('multiprocessing.cpu_count not implemented')
+ pass
+except ImportError:
+ _log.warning('Could not import multiprocessing, defaulting to 2 CPU cores')
+ pass
+
+try:
+ import gtk
+except:
+ raise Exception('Could not find pygtk')
+
+try:
+ import gobject
+ gobject.threads_init()
+except:
+ raise Exception('gobject could not be found')
+
+try:
+ import pygst
+ pygst.require('0.10')
+ import gst
+ from gst.extend import discoverer
+except:
+ raise Exception('gst/pygst 0.10 could not be found')
+
+
+class VideoThumbnailer:
+ # Declaration of thumbnailer states
+ STATE_NULL = 0
+ STATE_HALTING = 1
+ STATE_PROCESSING = 2
+
+ # The current thumbnailer state
+ state = STATE_NULL
+
+ # This will contain the thumbnailing pipeline
+ thumbnail_pipeline = None
+
+ buffer_probes = {}
+
+ def __init__(self, source_path, dest_path):
+ '''
+ Set up playbin pipeline in order to get video properties.
+
+ Initializes and runs the gobject.MainLoop()
+ '''
+ self.errors = []
+
+ self.source_path = source_path
+ self.dest_path = dest_path
+
+ self.loop = gobject.MainLoop()
+
+ # Set up the playbin. It will be used to discover certain
+ # properties of the input file
+ self.playbin = gst.element_factory_make('playbin')
+
+ self.videosink = gst.element_factory_make('fakesink', 'videosink')
+ self.playbin.set_property('video-sink', self.videosink)
+
+ self.audiosink = gst.element_factory_make('fakesink', 'audiosink')
+ self.playbin.set_property('audio-sink', self.audiosink)
+
+ self.bus = self.playbin.get_bus()
+ self.bus.add_signal_watch()
+ self.watch_id = self.bus.connect('message', self._on_bus_message)
+
+ self.playbin.set_property('uri', 'file:{0}'.format(
+ urllib.pathname2url(self.source_path)))
+
+ self.playbin.set_state(gst.STATE_PAUSED)
+
+ self.run()
+
+ def run(self):
+ self.loop.run()
+
+ def _on_bus_message(self, bus, message):
+ _log.debug(' BUS MESSAGE: {0}'.format(message))
+
+ if message.type == gst.MESSAGE_ERROR:
+ gobject.idle_add(self._on_bus_error)
+
+ elif message.type == gst.MESSAGE_STATE_CHANGED:
+ # The pipeline state has changed
+ # Parse state changing data
+ _prev, state, _pending = message.parse_state_changed()
+
+ _log.debug('State changed: {0}'.format(state))
+
+ if state == gst.STATE_PAUSED:
+ if message.src == self.playbin:
+ gobject.idle_add(self._on_bus_paused)
+
+ def _on_bus_paused(self):
+ '''
+ Set up thumbnailing pipeline
+ '''
+ current_video = self.playbin.get_property('current-video')
+
+ if current_video == 0:
+ _log.debug('Found current video from playbin')
+ else:
+ _log.error('Could not get any current video from playbin!')
+
+ self.duration = self._get_duration(self.playbin)
+ _log.info('Video length: {0}'.format(self.duration / gst.SECOND))
+
+ _log.info('Setting up thumbnailing pipeline')
+ self.thumbnail_pipeline = gst.parse_launch(
+ 'filesrc location="{0}" ! decodebin ! '
+ 'ffmpegcolorspace ! videoscale ! '
+ 'video/x-raw-rgb,depth=24,bpp=24,pixel-aspect-ratio=1/1,width=180 ! '
+ 'fakesink signal-handoffs=True'.format(self.source_path))
+
+ self.thumbnail_bus = self.thumbnail_pipeline.get_bus()
+ self.thumbnail_bus.add_signal_watch()
+ self.thumbnail_watch_id = self.thumbnail_bus.connect(
+ 'message', self._on_thumbnail_bus_message)
+
+ self.thumbnail_pipeline.set_state(gst.STATE_PAUSED)
+
+ #gobject.timeout_add(3000, self._on_timeout)
+
+ return False
+
+ def _on_thumbnail_bus_message(self, bus, message):
+ _log.debug('Thumbnail bus called, message: {0}'.format(message))
+
+ if message.type == gst.MESSAGE_ERROR:
+ _log.error(message)
+ gobject.idle_add(self._on_bus_error)
+
+ if message.type == gst.MESSAGE_STATE_CHANGED:
+ _prev, state, _pending = message.parse_state_changed()
+
+ if (state == gst.STATE_PAUSED and
+ not self.state == self.STATE_PROCESSING and
+ message.src == self.thumbnail_pipeline):
+ _log.info('Pipeline paused, processing')
+ self.state = self.STATE_PROCESSING
+
+ for sink in self.thumbnail_pipeline.sinks():
+ name = sink.get_name()
+ factoryname = sink.get_factory().get_name()
+
+ if factoryname == 'fakesink':
+ sinkpad = sink.get_pad('sink')
+
+ self.buffer_probes[name] = sinkpad.add_buffer_probe(
+ self.buffer_probe_handler, name)
+
+ _log.info('Added buffer probe')
+
+ break
+
+ # Apply the wadsworth constant, fallback to 1 second
+ seek_amount = max(self.duration / 100 * 30, 1 * gst.SECOND)
+
+ _log.debug('seek amount: {0}'.format(seek_amount))
+
+ seek_result = self.thumbnail_pipeline.seek(
+ 1.0,
+ gst.FORMAT_TIME,
+ gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
+ gst.SEEK_TYPE_SET,
+ seek_amount,
+ gst.SEEK_TYPE_NONE,
+ 0)
+
+ if not seek_result:
+ self.errors.append('COULD_NOT_SEEK')
+ _log.error('Couldn\'t seek! result: {0}'.format(
+ seek_result))
+ _log.info(message)
+ self.shutdown()
+ else:
+ pass
+ #self.thumbnail_pipeline.set_state(gst.STATE_PAUSED)
+ #pdb.set_trace()
+
+ def buffer_probe_handler_real(self, pad, buff, name):
+ '''
+ Capture buffers as gdk_pixbufs when told to.
+ '''
+ try:
+ caps = buff.caps
+ if caps is None:
+ _log.error('No caps passed to buffer probe handler!')
+ self.shutdown()
+ return False
+
+ _log.debug('caps: {0}'.format(caps))
+
+ filters = caps[0]
+ width = filters["width"]
+ height = filters["height"]
+
+ pixbuf = gtk.gdk.pixbuf_new_from_data(
+ buff.data, gtk.gdk.COLORSPACE_RGB, False, 8,
+ width, height, width * 3)
+
+ # NOTE: 200x136 is sort of arbitrary. it's larger than what
+ # the ui uses at the time of this writing.
+ # new_width, new_height = scaled_size((width, height), (200, 136))
+
+ #pixbuf = pixbuf.scale_simple(
+ #new_width, new_height, gtk.gdk.INTERP_BILINEAR)
+
+ pixbuf.save(self.dest_path, 'jpeg')
+ _log.info('Saved thumbnail')
+ del pixbuf
+ self.shutdown()
+ except gst.QueryError:
+ pass
+ return False
+
+ def buffer_probe_handler(self, pad, buff, name):
+ '''
+ Proxy function for buffer_probe_handler_real
+ '''
+ gobject.idle_add(
+ lambda: self.buffer_probe_handler_real(pad, buff, name))
+
+ return True
+
+ def _get_duration(self, pipeline, retries=0):
+ '''
+ Get the duration of a pipeline.
+
+ Retries 5 times.
+ '''
+ if retries == 5:
+ return 0
+
+ try:
+ return pipeline.query_duration(gst.FORMAT_TIME)[0]
+ except gst.QueryError:
+ return self._get_duration(pipeline, retries + 1)
+
+ def _on_timeout(self):
+ _log.error('TIMEOUT! DROP EVERYTHING!')
+ self.shutdown()
+
+ def _on_bus_error(self, *args):
+ _log.error('AHAHAHA! Error! args: {0}'.format(args))
+
+ def shutdown(self):
+ '''
+ Tell gobject to call __halt when the mainloop is idle.
+ '''
+ _log.info('Shutting down')
+ self.__halt()
+
+ def __halt(self):
+ '''
+ Halt all pipelines and shut down the main loop
+ '''
+ _log.info('Halting...')
+ self.state = self.STATE_HALTING
+
+ self.__disconnect()
+
+ gobject.idle_add(self.__halt_final)
+
+ def __disconnect(self):
+ _log.debug('Disconnecting...')
+ if not self.playbin is None:
+ self.playbin.set_state(gst.STATE_NULL)
+ for sink in self.playbin.sinks():
+ name = sink.get_name()
+ factoryname = sink.get_factory().get_name()
+
+ _log.debug('Disconnecting {0}'.format(name))
+
+ if factoryname == "fakesink":
+ pad = sink.get_pad("sink")
+ pad.remove_buffer_probe(self.buffer_probes[name])
+ del self.buffer_probes[name]
+
+ self.playbin = None
+
+ if self.bus is not None:
+ self.bus.disconnect(self.watch_id)
+ self.bus = None
+
+
+ def __halt_final(self):
+ _log.info('Done')
+ if self.errors:
+ _log.error(','.join(self.errors))
+
+ self.loop.quit()
+
+
+class VideoTranscoder:
+ '''
+ Video transcoder
+
+ Transcodes the SRC video file to a VP8 WebM video file at DST
+
+ - Does the same thing as VideoThumbnailer, but produces a WebM vp8
+ and vorbis video file.
+ - The VideoTranscoder exceeds the VideoThumbnailer in the way
+ that it was refined afterwards and therefore is done more
+ correctly.
+ '''
+ def __init__(self, src, dst, **kwargs):
+ _log.info('Initializing VideoTranscoder...')
+
+ self.loop = gobject.MainLoop()
+ self.source_path = src
+ self.destination_path = dst
+
+ # Options
+ self.destination_dimensions = kwargs.get('dimensions') or (640, 640)
+ self._progress_callback = kwargs.get('progress_callback') or None
+
+ if not type(self.destination_dimensions) == tuple:
+ raise Exception('dimensions must be tuple: (width, height)')
+
+ self._setup()
+ self._run()
+
+ def _setup(self):
+ self._setup_discover()
+ self._setup_pipeline()
+
+ def _run(self):
+ _log.info('Discovering...')
+ self.discoverer.discover()
+ _log.info('Done')
+
+ _log.debug('Initializing MainLoop()')
+ self.loop.run()
+
+ def _setup_discover(self):
+ _log.debug('Setting up discoverer')
+ self.discoverer = discoverer.Discoverer(self.source_path)
+
+ # Connect self.__discovered to the 'discovered' event
+ self.discoverer.connect('discovered', self.__discovered)
+
+ def __discovered(self, data, is_media):
+ '''
+ Callback for media discoverer.
+ '''
+ if not is_media:
+ self.__stop()
+ raise Exception('Could not discover {0}'.format(self.source_path))
+
+ _log.debug('__discovered, data: {0}'.format(data.__dict__))
+
+ self.data = data
+
+ # Launch things that should be done after discovery
+ self._link_elements()
+ self.__setup_videoscale_capsfilter()
+
+ # Tell the transcoding pipeline to start running
+ self.pipeline.set_state(gst.STATE_PLAYING)
+ _log.info('Transcoding...')
+
+ def _setup_pipeline(self):
+ _log.debug('Setting up transcoding pipeline')
+ # Create the pipeline bin.
+ self.pipeline = gst.Pipeline('VideoTranscoderPipeline')
+
+ # Create all GStreamer elements, starting with
+ # filesrc & decoder
+ self.filesrc = gst.element_factory_make('filesrc', 'filesrc')
+ self.filesrc.set_property('location', self.source_path)
+ self.pipeline.add(self.filesrc)
+
+ self.decoder = gst.element_factory_make('decodebin2', 'decoder')
+ self.decoder.connect('new-decoded-pad', self._on_dynamic_pad)
+ self.pipeline.add(self.decoder)
+
+ # Video elements
+ self.videoqueue = gst.element_factory_make('queue', 'videoqueue')
+ self.pipeline.add(self.videoqueue)
+
+ self.videorate = gst.element_factory_make('videorate', 'videorate')
+ self.pipeline.add(self.videorate)
+
+ self.ffmpegcolorspace = gst.element_factory_make(
+ 'ffmpegcolorspace', 'ffmpegcolorspace')
+ self.pipeline.add(self.ffmpegcolorspace)
+
+ self.videoscale = gst.element_factory_make('ffvideoscale', 'videoscale')
+ #self.videoscale.set_property('method', 2) # I'm not sure this works
+ #self.videoscale.set_property('add-borders', 0)
+ self.pipeline.add(self.videoscale)
+
+ self.capsfilter = gst.element_factory_make('capsfilter', 'capsfilter')
+ self.pipeline.add(self.capsfilter)
+
+ self.vp8enc = gst.element_factory_make('vp8enc', 'vp8enc')
+ self.vp8enc.set_property('quality', 6)
+ self.vp8enc.set_property('threads', 2)
+ self.pipeline.add(self.vp8enc)
+
+ # Audio elements
+ self.audioqueue = gst.element_factory_make('queue', 'audioqueue')
+ self.pipeline.add(self.audioqueue)
+
+ self.audiorate = gst.element_factory_make('audiorate', 'audiorate')
+ self.audiorate.set_property('tolerance', 80000000)
+ self.pipeline.add(self.audiorate)
+
+ self.audioconvert = gst.element_factory_make('audioconvert', 'audioconvert')
+ self.pipeline.add(self.audioconvert)
+
+ self.audiocapsfilter = gst.element_factory_make('capsfilter', 'audiocapsfilter')
+ audiocaps = ['audio/x-raw-float']
+ self.audiocapsfilter.set_property(
+ 'caps',
+ gst.caps_from_string(
+ ','.join(audiocaps)))
+ self.pipeline.add(self.audiocapsfilter)
+
+ self.vorbisenc = gst.element_factory_make('vorbisenc', 'vorbisenc')
+ self.vorbisenc.set_property('quality', 1)
+ self.pipeline.add(self.vorbisenc)
+
+ # WebMmux & filesink
+ self.webmmux = gst.element_factory_make('webmmux', 'webmmux')
+ self.pipeline.add(self.webmmux)
+
+ self.filesink = gst.element_factory_make('filesink', 'filesink')
+ self.filesink.set_property('location', self.destination_path)
+ self.pipeline.add(self.filesink)
+
+ # Progressreport
+ self.progressreport = gst.element_factory_make(
+ 'progressreport', 'progressreport')
+ # Update every second
+ self.progressreport.set_property('update-freq', 1)
+ self.progressreport.set_property('silent', True)
+ self.pipeline.add(self.progressreport)
+
+ def _link_elements(self):
+ '''
+ Link all the elements
+
+ This code depends on data from the discoverer and is called
+ from __discovered
+ '''
+ _log.debug('linking elements')
+ # Link the filesrc element to the decoder. The decoder then emits
+ # 'new-decoded-pad' which links decoded src pads to either a video
+ # or audio sink
+ self.filesrc.link(self.decoder)
+
+ # Link all the video elements in a row to webmmux
+ gst.element_link_many(
+ self.videoqueue,
+ self.videorate,
+ self.ffmpegcolorspace,
+ self.videoscale,
+ self.capsfilter,
+ self.vp8enc,
+ self.webmmux)
+
+ if self.data.is_audio:
+ # Link all the audio elements in a row to webmux
+ gst.element_link_many(
+ self.audioqueue,
+ self.audiorate,
+ self.audioconvert,
+ self.audiocapsfilter,
+ self.vorbisenc,
+ self.webmmux)
+
+ gst.element_link_many(
+ self.webmmux,
+ self.progressreport,
+ self.filesink)
+
+ # Setup the message bus and connect _on_message to the pipeline
+ self._setup_bus()
+
+
+ def _on_dynamic_pad(self, dbin, pad, islast):
+ '''
+ Callback called when ``decodebin2`` has a pad that we can connect to
+ '''
+ # Intersect the capabilities of the video sink and the pad src
+ # Then check if they have no common capabilities.
+ if self.ffmpegcolorspace.get_pad_template('sink')\
+ .get_caps().intersect(pad.get_caps()).is_empty():
+ # It is NOT a video src pad.
+ pad.link(self.audioqueue.get_pad('sink'))
+ else:
+ # It IS a video src pad.
+ pad.link(self.videoqueue.get_pad('sink'))
+
+ def _setup_bus(self):
+ self.bus = self.pipeline.get_bus()
+ self.bus.add_signal_watch()
+ self.bus.connect('message', self._on_message)
+
+ def __setup_videoscale_capsfilter(self):
+ '''
+ Sets up the output format (width, height) for the video
+ '''
+ caps = ['video/x-raw-yuv', 'pixel-aspect-ratio=1/1', 'framerate=30/1']
+
+ if self.data.videoheight > self.data.videowidth:
+ # Whoa! We have ourselves a portrait video!
+ caps.append('height={0}'.format(
+ self.destination_dimensions[1]))
+ else:
+ # It's a landscape, phew, how normal.
+ caps.append('width={0}'.format(
+ self.destination_dimensions[0]))
+
+ self.capsfilter.set_property(
+ 'caps',
+ gst.caps_from_string(
+ ','.join(caps)))
+
+ def _on_message(self, bus, message):
+ _log.debug((bus, message, message.type))
+
+ t = message.type
+
+ if t == gst.MESSAGE_EOS:
+ self._discover_dst_and_stop()
+ _log.info('Done')
+
+ elif t == gst.MESSAGE_ELEMENT:
+ if message.structure.get_name() == 'progress':
+ data = dict(message.structure)
+
+ if self._progress_callback:
+ self._progress_callback(data)
+
+ _log.info('{percent}% done...'.format(
+ percent=data.get('percent')))
+ _log.debug(data)
+
+ elif t == gst.MESSAGE_ERROR:
+ _log.error((bus, message))
+ self.__stop()
+
+ def _discover_dst_and_stop(self):
+ self.dst_discoverer = discoverer.Discoverer(self.destination_path)
+
+ self.dst_discoverer.connect('discovered', self.__dst_discovered)
+
+ self.dst_discoverer.discover()
+
+
+ def __dst_discovered(self, data, is_media):
+ self.dst_data = data
+
+ self.__stop()
+
+ def __stop(self):
+ _log.debug(self.loop)
+
+ # Stop executing the pipeline
+ self.pipeline.set_state(gst.STATE_NULL)
+
+ # This kills the loop, mercifully
+ gobject.idle_add(self.__stop_mainloop)
+
+ def __stop_mainloop(self):
+ '''
+ Wrapper for gobject.MainLoop.quit()
+
+ This wrapper makes us able to see if self.loop.quit has been called
+ '''
+ _log.info('Terminating MainLoop')
+
+ self.loop.quit()
+
+
+if __name__ == '__main__':
+ os.nice(19)
+ from optparse import OptionParser
+
+ parser = OptionParser(
+ usage='%prog [-v] -a [ video | thumbnail ] SRC DEST')
+
+ parser.add_option('-a', '--action',
+ dest='action',
+ help='One of "video" or "thumbnail"')
+
+ parser.add_option('-v',
+ dest='verbose',
+ action='store_true',
+ help='Output debug information')
+
+ parser.add_option('-q',
+ dest='quiet',
+ action='store_true',
+ help='Dear program, please be quiet unless *error*')
+
+ (options, args) = parser.parse_args()
+
+ if options.verbose:
+ _log.setLevel(logging.DEBUG)
+ else:
+ _log.setLevel(logging.INFO)
+
+ if options.quiet:
+ _log.setLevel(logging.ERROR)
+
+ _log.debug(args)
+
+ if not len(args) == 2:
+ parser.print_help()
+ sys.exit()
+
+ if options.action == 'thumbnail':
+ VideoThumbnailer(*args)
+ elif options.action == 'video':
+ def cb(data):
+ print('I\'m a callback!')
+ transcoder = VideoTranscoder(*args, progress_callback=cb)
diff --git a/mediagoblin/messages.py b/mediagoblin/messages.py
index dc82fbf6..054d46c0 100644
--- a/mediagoblin/messages.py
+++ b/mediagoblin/messages.py
@@ -20,11 +20,13 @@ SUCCESS = 'success'
WARNING = 'warning'
ERROR = 'error'
+
def add_message(request, level, text):
messages = request.session.setdefault('messages', [])
messages.append({'level': level, 'text': text})
request.session.save()
+
def fetch_messages(request, clear_from_session=True):
messages = request.session.get('messages')
if messages and clear_from_session:
diff --git a/mediagoblin/process_media/errors.py b/mediagoblin/process_media/errors.py
deleted file mode 100644
index 8003ffaf..00000000
--- a/mediagoblin/process_media/errors.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
-
-class BaseProcessingFail(Exception):
- """
- Base exception that all other processing failure messages should
- subclass from.
-
- You shouldn't call this itself; instead you should subclass it
- and provid the exception_path and general_message applicable to
- this error.
- """
- general_message = u''
-
- @property
- def exception_path(self):
- return u"%s:%s" % (
- self.__class__.__module__, self.__class__.__name__)
-
- def __init__(self, **metadata):
- self.metadata = metadata or {}
-
-
-class BadMediaFail(BaseProcessingFail):
- """
- Error that should be raised when an inappropriate file was given
- for the media type specified.
- """
- general_message = _(u'Invalid file given for media type.')
diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/processing.py
index 2b9eed6e..cbac8030 100644
--- a/mediagoblin/process_media/__init__.py
+++ b/mediagoblin/processing.py
@@ -14,14 +14,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import Image
-
from celery.task import Task
-from celery import registry
from mediagoblin.db.util import ObjectId
from mediagoblin import mg_globals as mgg
-from mediagoblin.process_media.errors import BaseProcessingFail, BadMediaFail
+
+from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
+
+from mediagoblin.media_types import get_media_manager
THUMB_SIZE = 180, 180
@@ -31,7 +31,7 @@ MEDIUM_SIZE = 640, 640
def create_pub_filepath(entry, filename):
return mgg.public_store.get_unique_filepath(
['media_entries',
- unicode(entry['_id']),
+ unicode(entry._id),
filename])
@@ -41,6 +41,8 @@ def create_pub_filepath(entry, filename):
class ProcessMedia(Task):
"""
+ DEPRECATED -- This now resides in the individual media plugins
+
Pass this entry off for processing.
"""
def run(self, media_id):
@@ -53,37 +55,39 @@ class ProcessMedia(Task):
# Try to process, and handle expected errors.
try:
- process_image(entry)
+ #__import__(entry.media_type)
+ manager = get_media_manager(entry.media_type)
+ manager['processor'](entry)
except BaseProcessingFail, exc:
- mark_entry_failed(entry[u'_id'], exc)
+ mark_entry_failed(entry._id, exc)
return
+ except ImportError, exc:
+ mark_entry_failed(entry[u'_id'], exc)
- entry['state'] = u'processed'
+ entry.state = u'processed'
entry.save()
def on_failure(self, exc, task_id, args, kwargs, einfo):
"""
If the processing failed we should mark that in the database.
- Assuming that the exception raised is a subclass of BaseProcessingFail,
- we can use that to get more information about the failure and store that
- for conveying information to users about the failure, etc.
+ Assuming that the exception raised is a subclass of
+ BaseProcessingFail, we can use that to get more information
+ about the failure and store that for conveying information to
+ users about the failure, etc.
"""
entry_id = args[0]
mark_entry_failed(entry_id, exc)
-process_media = registry.tasks[ProcessMedia.name]
-
-
def mark_entry_failed(entry_id, exc):
"""
Mark a media entry as having failed in its conversion.
- Uses the exception that was raised to mark more information. If the
- exception is a derivative of BaseProcessingFail then we can store extra
- information that can be useful for users telling them why their media failed
- to process.
+ Uses the exception that was raised to mark more information. If
+ the exception is a derivative of BaseProcessingFail then we can
+ store extra information that can be useful for users telling them
+ why their media failed to process.
Args:
- entry_id: The id of the media entry
@@ -111,69 +115,29 @@ def mark_entry_failed(entry_id, exc):
u'fail_metadata': {}}})
-def process_image(entry):
- """
- Code to process an image
+class BaseProcessingFail(Exception):
"""
- workbench = mgg.workbench_manager.create_workbench()
-
- queued_filepath = entry['queued_media_file']
- queued_filename = workbench.localized_file(
- mgg.queue_store, queued_filepath,
- 'source')
-
- try:
- thumb = Image.open(queued_filename)
- except IOError:
- raise BadMediaFail()
+ Base exception that all other processing failure messages should
+ subclass from.
- thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS)
- # ensure color mode is compatible with jpg
- if thumb.mode != "RGB":
- thumb = thumb.convert("RGB")
-
- thumb_filepath = create_pub_filepath(entry, 'thumbnail.jpg')
- thumb_file = mgg.public_store.get_file(thumb_filepath, 'w')
-
- with thumb_file:
- thumb.save(thumb_file, "JPEG", quality=90)
-
- # If the size of the original file exceeds the specified size of a `medium`
- # file, a `medium.jpg` files is created and later associated with the media
- # entry.
- medium = Image.open(queued_filename)
- medium_processed = False
-
- if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]:
- medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS)
-
- if medium.mode != "RGB":
- medium = medium.convert("RGB")
-
- medium_filepath = create_pub_filepath(entry, 'medium.jpg')
- medium_file = mgg.public_store.get_file(medium_filepath, 'w')
-
- with medium_file:
- medium.save(medium_file, "JPEG", quality=90)
- medium_processed = True
-
- # we have to re-read because unlike PIL, not everything reads
- # things in string representation :)
- queued_file = file(queued_filename, 'rb')
+ You shouldn't call this itself; instead you should subclass it
+ and provid the exception_path and general_message applicable to
+ this error.
+ """
+ general_message = u''
- with queued_file:
- original_filepath = create_pub_filepath(entry, queued_filepath[-1])
+ @property
+ def exception_path(self):
+ return u"%s:%s" % (
+ self.__class__.__module__, self.__class__.__name__)
- with mgg.public_store.get_file(original_filepath, 'wb') as original_file:
- original_file.write(queued_file.read())
+ def __init__(self, **metadata):
+ self.metadata = metadata or {}
- mgg.queue_store.delete_file(queued_filepath)
- entry['queued_media_file'] = []
- media_files_dict = entry.setdefault('media_files', {})
- media_files_dict['thumb'] = thumb_filepath
- media_files_dict['original'] = original_filepath
- if medium_processed:
- media_files_dict['medium'] = medium_filepath
- # clean up workbench
- workbench.destroy_self()
+class BadMediaFail(BaseProcessingFail):
+ """
+ Error that should be raised when an inappropriate file was given
+ for the media type specified.
+ """
+ general_message = _(u'Invalid file given for media type.')
diff --git a/mediagoblin/routing.py b/mediagoblin/routing.py
index ae56f8cb..bd727db5 100644
--- a/mediagoblin/routing.py
+++ b/mediagoblin/routing.py
@@ -21,6 +21,8 @@ from mediagoblin.submit.routing import submit_routes
from mediagoblin.user_pages.routing import user_routes
from mediagoblin.edit.routing import edit_routes
from mediagoblin.listings.routing import tag_routes
+from mediagoblin.webfinger.routing import webfinger_well_known_routes, \
+ webfinger_routes
def get_mapper():
@@ -36,5 +38,7 @@ def get_mapper():
mapping.extend(user_routes, '/u')
mapping.extend(edit_routes, '/edit')
mapping.extend(tag_routes, '/tag')
+ mapping.extend(webfinger_well_known_routes, '/.well-known')
+ mapping.extend(webfinger_routes, '/api/webfinger')
return mapping
diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css
index 0dadacd0..efd7b561 100644
--- a/mediagoblin/static/css/base.css
+++ b/mediagoblin/static/css/base.css
@@ -29,12 +29,10 @@ body {
background-color: #111;
background-image: url("../images/background.png");
color: #C3C3C3;
- font-family: sans-serif;
padding: none;
margin: 0px;
height: 100%;
- font: 16px "HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif;
- font-family:'Lato', sans-serif;
+ font: 16px 'Lato', 'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;
}
form {
@@ -44,24 +42,35 @@ form {
/* text styles */
-h1{
- margin-bottom: 15px;
+h1,h2,h3,p {
+ margin-bottom: 20px;
+}
+
+h1,h2,h3 {
+ font-weight: bold;
+}
+
+h1 {
margin-top: 15px;
color: #fff;
font-size: 1.875em;
}
-h2{
+h2 {
font-size: 1.375em;
margin-top: 20px;
color: #fff;
}
-h3{
+h3 {
border-bottom: 1px solid #333;
font-size: 1.125em;
}
+p {
+ margin-top: 0px;
+}
+
a {
color: #86D4B1;
}
@@ -81,67 +90,100 @@ input, textarea {
/* website structure */
-.mediagoblin_body {
- position: relative;
- min-height: 100%;
+.container {
+ margin: auto;
+ width: 96%;
+ max-width: 940px;
}
-.mediagoblin_header {
+header {
+ width: 100%;
height: 36px;
padding-top: 14px;
margin-bottom: 20px;
border-bottom: 1px solid #333;
}
-a.mediagoblin_logo{
+.header_right {
+ float: right;
+}
+
+a.logo {
color: #fff;
font-weight: bold;
+ margin-right: 8px;
}
-.header_submit, .header_submit_highlight{
- color: #272727;
- background-color: #aaa;
- background-image: -webkit-gradient(linear, left top, left bottom, from(##D2D2D2), to(#aaa));
- background-image: -webkit-linear-gradient(top, #D2D2D2, #aaa);
- background-image: -moz-linear-gradient(top, #D2D2D2, #aaa);
- background-image: -ms-linear-gradient(top, #D2D2D2, #aaa);
- background-image: -o-linear-gradient(top, #D2D2D2, #aaa);
- background-image: linear-gradient(top, #D2D2D2, #aaa);
- box-shadow: 0px 0px 4px #000;
- border-radius: 3px;
- margin: 8px;
- padding: 3px 8px;
- text-decoration: none;
- border: medium none;
- font-style: normal;
- font-weight: bold;
- font-size: 1em;
+.logo img {
+ vertical-align: middle;
}
-.header_submit_highlight{
-background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109, 173, 144));
+.mediagoblin_content {
+ width: 100%;
+ padding-bottom: 74px;
}
-.mediagoblin_footer {
+footer {
+ width: 100%;
height: 30px;
border-top: 1px solid #333;
bottom: 0px;
padding-top: 8px;
text-align: center;
font-size: 0.875em;
+ clear: both;
}
-.mediagoblin_content {
- padding-bottom: 74px;
+.media_pane {
+ width: 640px;
+ margin-left: 0px;
+ margin-right: 10px;
+ float: left;
}
-.mediagoblin_header_right {
- float: right;
+.media_sidebar {
+ width: 280px;
+ margin-left: 10px;
+ margin-right: 0px;
+ float: left;
+}
+
+.profile_sidebar {
+ width: 340px;
+ margin-right: 10px;
+ float: left;
+}
+
+.profile_showcase {
+ width: 580px;
+ margin-left: 10px;
+ float: left;
}
/* common website elements */
-.button, .cancel_link {
+.button_action, .button_action_highlight {
+ display: inline-block;
+ color: #c3c3c3;
+ background-color: #363636;
+ border: 1px solid;
+ border-color: #464646 #2B2B2B #252525;
+ border-radius: 4px;
+ padding: 3px 8px;
+ font-size: 16px;
+ text-decoration: none;
+ font-style: normal;
+ font-weight: bold;
+ cursor: pointer;
+}
+
+.button_action_highlight {
+ background-color: #86D4B1;
+ border-color: #A2DEC3 #6CAA8E #5C9179;
+ color: #283F35;
+}
+
+.button_form, .cancel_link {
height: 32px;
min-width: 99px;
background-color: #86d4b1;
@@ -174,34 +216,61 @@ background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109,
background-image: linear-gradient(top, #D2D2D2, #aaa);
}
-.pagination{
+.pagination {
text-align: center;
}
-.pagination_arrow{
+.pagination_arrow {
margin: 5px;
}
-.empty_space{
- background-color: #222;
+.empty_space {
+ background-image: url("../images/empty_back.png");
font-style: italic;
text-align: center;
height: 160px;
padding-top: 70px;
}
+.right_align {
+ float: right;
+}
+
+textarea#comment_content {
+ resize: vertical;
+ width: 634px;
+ height: 90px;
+ border: none;
+ background-color: #f1f1f1;
+ padding: 3px;
+}
+
+.clear {
+ clear: both;
+ display: block;
+ overflow: hidden;
+ visibility: hidden;
+ width: 0;
+ height: 0;
+}
+
/* forms */
-.form_box {
+.form_box,.form_box_xl {
background-color: #222;
background-image: url("../images/background_lines.png");
background-repeat: repeat-x;
- padding-bottom: 30px;
- padding-top: 30px;
- margin-left: auto;
- margin-right: auto;
+ padding: 3% 5%;
display: block;
float: none;
+ width: 90%;
+ max-width: 340px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.form_box_xl {
+ max-width: 460px;
}
.edit_box {
@@ -212,7 +281,11 @@ text-align: center;
width: 100%;
}
-.form_field_label,.form_field_input {
+.form_field_input {
+ margin-bottom: 10px;
+}
+
+.form_field_label {
margin-bottom: 4px;
}
@@ -237,6 +310,15 @@ text-align: center;
text-align: right;
}
+#password_boolean {
+ margin-top: 4px;
+ width: 20px;
+}
+
+textarea#description, textarea#bio {
+ resize: vertical;
+}
+
/* comments */
.comment_author {
@@ -245,8 +327,20 @@ text-align: center;
font-size: 0.9em;
}
+.comment_content {
+ margin-bottom: 30px;
+}
+
.comment_content p {
- margin-bottom: 4px;
+ margin-bottom: 0px;
+}
+
+textarea#comment_content {
+ width: 634px;
+ height: 90px;
+ border: none;
+ background-color: #f1f1f1;
+ padding: 3px;
}
/* media galleries */
@@ -268,41 +362,51 @@ text-align: center;
/* media detail */
-h2.media_title{
+h2.media_title {
margin-bottom: 0px;
}
-p.media_uploader{
+p.media_specs {
font-size: 0.9em;
+ border-top: 1px solid #222;
+ padding: 10px 0px;
+ color: #888;
+}
+
+.no_html5 {
+ background: black;
+ color: white;
+ text-align: center;
+ height: 160px;
+ padding: 130px 10px 20px 10px;
}
/* icons */
-img.media_icon{
+img.media_icon {
margin: 0 4px;
vertical-align: sub;
}
/* navigation */
-.navigation_button{
- width: 139px;
+.navigation_button {
+ width: 135px;
display: block;
float: left;
text-align: center;
- background-color: #222;
+ background-color: #1d1d1d;
+ border: 1px solid;
+ border-color: #2c2c2c #232323 #1a1a1a;
+ border-radius: 4px;
text-decoration: none;
- padding: 12px 0pt;
- font-size: 2em;
+ padding: 12px 0 16px;
+ font-size: 1.4em;
margin: 0 0 20px
}
-p.navigation_button{
- color: #272727;
-}
-
-.navigation_left{
- margin-right: 2px;
+.navigation_left {
+ margin-right: 6px;
}
/* messages */
@@ -310,6 +414,7 @@ p.navigation_button{
ul.mediagoblin_messages {
list-style: none inside;
color: #f7f7f7;
+ padding: 0;
}
.mediagoblin_messages li {
@@ -368,3 +473,37 @@ table.media_panel th {
margin-top: 10px;
margin-left: 10px;
}
+
+/* ASCII art */
+
+@font-face {
+ font-family: Inconsolata;
+ src: local('Inconsolata'), url('../fonts/Inconsolata.otf') format('opentype')
+}
+
+.ascii-wrapper pre {
+ font-family: Inconsolata, monospace;
+ line-height: 1em;
+}
+
+/* Media queries and other responsivisivity */
+@media screen and (max-width: 680px) {
+ .media_pane {
+ width: 100%;
+ margin: 0px;
+ }
+ img.media_image {
+ width: 100%;
+ }
+}
+
+@media screen and (max-width: 960px) {
+ .profile_sidebar {
+ width: 100%;
+ margin: 0px;
+ }
+ .profile_showcase {
+ width: 100%;
+ margin: 0px;
+ }
+}
diff --git a/mediagoblin/static/css/extlib/960_16_col.css b/mediagoblin/static/css/extlib/960_16_col.css
deleted file mode 120000
index d4e43898..00000000
--- a/mediagoblin/static/css/extlib/960_16_col.css
+++ /dev/null
@@ -1 +0,0 @@
-../../../../extlib/960.gs/960_16_col.css \ No newline at end of file
diff --git a/mediagoblin/static/css/extlib/reset.css b/mediagoblin/static/css/extlib/reset.css
index 65d06d34..6084e137 120000
--- a/mediagoblin/static/css/extlib/reset.css
+++ b/mediagoblin/static/css/extlib/reset.css
@@ -1 +1 @@
-../../../../extlib/960.gs/reset.css \ No newline at end of file
+../../../../extlib/reset/reset.css \ No newline at end of file
diff --git a/mediagoblin/static/css/extlib/text.css b/mediagoblin/static/css/extlib/text.css
deleted file mode 120000
index 2d864de4..00000000
--- a/mediagoblin/static/css/extlib/text.css
+++ /dev/null
@@ -1 +0,0 @@
-../../../../extlib/960.gs/text.css \ No newline at end of file
diff --git a/mediagoblin/static/fonts/Inconsolata.otf b/mediagoblin/static/fonts/Inconsolata.otf
new file mode 120000
index 00000000..777be657
--- /dev/null
+++ b/mediagoblin/static/fonts/Inconsolata.otf
@@ -0,0 +1 @@
+../../../extlib/inconsolata/Inconsolata.otf \ No newline at end of file
diff --git a/mediagoblin/static/images/empty_back.png b/mediagoblin/static/images/empty_back.png
new file mode 100644
index 00000000..3522ddd3
--- /dev/null
+++ b/mediagoblin/static/images/empty_back.png
Binary files differ
diff --git a/mediagoblin/static/images/icon_comment.png b/mediagoblin/static/images/icon_comment.png
new file mode 100644
index 00000000..76860a92
--- /dev/null
+++ b/mediagoblin/static/images/icon_comment.png
Binary files differ
diff --git a/mediagoblin/static/images/icon_delete.png b/mediagoblin/static/images/icon_delete.png
deleted file mode 100644
index 9d76a5db..00000000
--- a/mediagoblin/static/images/icon_delete.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/icon_edit.png b/mediagoblin/static/images/icon_edit.png
deleted file mode 100644
index 480c73ad..00000000
--- a/mediagoblin/static/images/icon_edit.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/media_thumbs/video.jpg b/mediagoblin/static/images/media_thumbs/video.jpg
new file mode 100644
index 00000000..841dc796
--- /dev/null
+++ b/mediagoblin/static/images/media_thumbs/video.jpg
Binary files differ
diff --git a/mediagoblin/static/images/navigation_end.png b/mediagoblin/static/images/navigation_end.png
deleted file mode 100644
index b2f27296..00000000
--- a/mediagoblin/static/images/navigation_end.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/navigation_left.png b/mediagoblin/static/images/navigation_left.png
deleted file mode 100644
index d1645120..00000000
--- a/mediagoblin/static/images/navigation_left.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/navigation_right.png b/mediagoblin/static/images/navigation_right.png
deleted file mode 100644
index d4caa7b8..00000000
--- a/mediagoblin/static/images/navigation_right.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/pagination_left.png b/mediagoblin/static/images/pagination_left.png
deleted file mode 100644
index 56a26596..00000000
--- a/mediagoblin/static/images/pagination_left.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/images/pagination_right.png b/mediagoblin/static/images/pagination_right.png
deleted file mode 100644
index 84f8abba..00000000
--- a/mediagoblin/static/images/pagination_right.png
+++ /dev/null
Binary files differ
diff --git a/mediagoblin/static/js/comment_show.js b/mediagoblin/static/js/comment_show.js
new file mode 100644
index 00000000..2212b9ad
--- /dev/null
+++ b/mediagoblin/static/js/comment_show.js
@@ -0,0 +1,9 @@
+$(document).ready(function(){
+ $('#form_comment').hide();
+ $('#button_addcomment').click(function(){
+ $(this).fadeOut('fast');
+ $('#form_comment').slideDown(function(){
+ $('#comment_content').focus();
+ });
+ });
+});
diff --git a/mediagoblin/static/js/extlib/html5shiv.js b/mediagoblin/static/js/extlib/html5shiv.js
new file mode 120000
index 00000000..ca7358c7
--- /dev/null
+++ b/mediagoblin/static/js/extlib/html5shiv.js
@@ -0,0 +1 @@
+../../../../extlib/html5shiv/html5shiv.js \ No newline at end of file
diff --git a/mediagoblin/static/js/extlib/jquery.js b/mediagoblin/static/js/extlib/jquery.js
new file mode 120000
index 00000000..d78f5cc3
--- /dev/null
+++ b/mediagoblin/static/js/extlib/jquery.js
@@ -0,0 +1 @@
+../../../../extlib/jquery/jquery.js \ No newline at end of file
diff --git a/mediagoblin/static/js/show_password.js b/mediagoblin/static/js/show_password.js
new file mode 100644
index 00000000..519b29c1
--- /dev/null
+++ b/mediagoblin/static/js/show_password.js
@@ -0,0 +1,19 @@
+$(document).ready(function(){
+ $("#password").after('<input type="text" value="" name="password_clear" id="password_clear" /><label><input type="checkbox" id="password_boolean" />Show password</label>');
+ $('#password_clear').hide();
+ $('#password_boolean').click(function(){
+ if($('#password_boolean').prop("checked")) {
+ $('#password_clear').val($('#password').val());
+ $('#password').hide();
+ $('#password_clear').show();
+ } else {
+ $('#password').val($('#password_clear').val());
+ $('#password_clear').hide();
+ $('#password').show();
+ };
+ });
+ $('#password,#password_clear').keyup(function(){
+ $('#password').val($(this).val());
+ $('#password_clear').val($(this).val());
+ });
+});
diff --git a/mediagoblin/staticdirect.py b/mediagoblin/staticdirect.py
index 58175881..2bddb160 100644
--- a/mediagoblin/staticdirect.py
+++ b/mediagoblin/staticdirect.py
@@ -14,31 +14,34 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import pkg_resources
-import urlparse
-
####################################
# Staticdirect infrastructure.
# Borrowed largely from cc.engine
# by Chris Webber & Creative Commons
-#
+#
# This needs documentation!
####################################
import pkg_resources
-import urlparse
+import logging
+
+_log = logging.getLogger(__name__)
+
class StaticDirect(object):
def __init__(self):
self.cache = {}
def __call__(self, filepath):
- if self.cache.has_key(filepath):
+ if filepath in self.cache:
return self.cache[filepath]
+ if not pkg_resources.resource_exists('mediagoblin',
+ 'static' + filepath):
+ _log.info("StaticDirect resource %r not found locally",
+ filepath)
static_direction = self.cache[filepath] = self.get(filepath)
return static_direction
-
def get(self, filepath):
# should be implemented by the individual staticdirector
diff --git a/mediagoblin/storage/__init__.py b/mediagoblin/storage/__init__.py
index 9e592b9e..0840614b 100644
--- a/mediagoblin/storage/__init__.py
+++ b/mediagoblin/storage/__init__.py
@@ -169,6 +169,18 @@ class StorageInterface(object):
with file(dest_path, 'wb') as dest_file:
dest_file.write(source_file.read())
+ def copy_local_to_storage(self, filename, filepath):
+ """
+ Copy this file from locally to the storage system.
+
+ This is kind of the opposite of copy_locally. It's likely you
+ could override this method with something more appropriate to
+ your storage system.
+ """
+ with self.get_file(filepath, 'wb') as dest_file:
+ with file(filename, 'rb') as source_file:
+ dest_file.write(source_file.read())
+
###########
# Utilities
diff --git a/mediagoblin/storage/cloudfiles.py b/mediagoblin/storage/cloudfiles.py
index b1dd9450..51b73579 100644
--- a/mediagoblin/storage/cloudfiles.py
+++ b/mediagoblin/storage/cloudfiles.py
@@ -27,6 +27,7 @@ from mediagoblin.storage import StorageInterface, clean_listy_filepath
import cloudfiles
import mimetypes
+
class CloudFilesStorage(StorageInterface):
'''
OpenStack/Rackspace Cloud's Swift/CloudFiles support
@@ -97,8 +98,14 @@ class CloudFilesStorage(StorageInterface):
def delete_file(self, filepath):
# TODO: Also delete unused directories if empty (safely, with
# checks to avoid race conditions).
- self.container.delete_object(
- self._resolve_filepath(filepath))
+ try:
+ self.container.delete_object(
+ self._resolve_filepath(filepath))
+ except cloudfiles.container.ResponseError:
+ pass
+ finally:
+ pass
+
def file_url(self, filepath):
return '/'.join([
diff --git a/mediagoblin/storage/filestorage.py b/mediagoblin/storage/filestorage.py
index 22d6eb5a..a904865f 100644
--- a/mediagoblin/storage/filestorage.py
+++ b/mediagoblin/storage/filestorage.py
@@ -20,6 +20,7 @@ from mediagoblin.storage import (
NoWebServing)
import os
+import shutil
import urlparse
@@ -76,3 +77,16 @@ class BasicFileStorage(StorageInterface):
def get_local_path(self, filepath):
return self._resolve_filepath(filepath)
+
+ def copy_local_to_storage(self, filename, filepath):
+ """
+ Copy this file from locally to the storage system.
+ """
+ # Make directories if necessary
+ if len(filepath) > 1:
+ directory = self._resolve_filepath(filepath[:-1])
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+ shutil.copy(
+ filename, self.get_local_path(filepath))
diff --git a/mediagoblin/submit/__init__.py b/mediagoblin/submit/__init__.py
index 576bd0f5..ba347c69 100644
--- a/mediagoblin/submit/__init__.py
+++ b/mediagoblin/submit/__init__.py
@@ -13,5 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py
index be85b9a9..08234822 100644
--- a/mediagoblin/submit/forms.py
+++ b/mediagoblin/submit/forms.py
@@ -27,10 +27,15 @@ class SubmitStartForm(wtforms.Form):
_('Title'),
[wtforms.validators.Length(min=0, max=500)])
description = wtforms.TextAreaField(
- _('Description of this work'))
+ _('Description of this work'),
+ description=_("""You can use
+ <a href="http://daringfireball.net/projects/markdown/basics">
+ Markdown</a> for formatting."""))
tags = wtforms.TextField(
_('Tags'),
- [tag_length_validator])
+ [tag_length_validator],
+ description=_(
+ "Separate tags by commas."))
license = wtforms.SelectField(
_('License'),
choices=licenses_as_choices())
diff --git a/mediagoblin/submit/security.py b/mediagoblin/submit/security.py
index 9d62a36e..6708baf7 100644
--- a/mediagoblin/submit/security.py
+++ b/mediagoblin/submit/security.py
@@ -16,9 +16,9 @@
from mimetypes import guess_type
-
ALLOWED = ['image/jpeg', 'image/png', 'image/tiff', 'image/gif']
+
def check_filetype(posted_file):
if not guess_type(posted_file.filename)[0] in ALLOWED:
return False
diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py
index ecfa9943..c3f5699e 100644
--- a/mediagoblin/submit/views.py
+++ b/mediagoblin/submit/views.py
@@ -19,6 +19,8 @@ import uuid
from os.path import splitext
from cgi import FieldStorage
+from celery import registry
+
from werkzeug.utils import secure_filename
from mediagoblin.db.util import ObjectId
@@ -27,8 +29,10 @@ from mediagoblin.tools.translate import pass_to_ugettext as _
from mediagoblin.tools.response import render_to_response, redirect
from mediagoblin.decorators import require_active_login
from mediagoblin.submit import forms as submit_forms, security
-from mediagoblin.process_media import process_media, mark_entry_failed
+from mediagoblin.processing import mark_entry_failed, ProcessMedia
from mediagoblin.messages import add_message, SUCCESS
+from mediagoblin.media_types import get_media_type_and_manager, \
+ InvalidFileType, FileTypeNotSupported
@require_active_login
@@ -39,93 +43,108 @@ def submit_start(request):
submit_form = submit_forms.SubmitStartForm(request.POST)
if request.method == 'POST' and submit_form.validate():
- if not (request.POST.has_key('file')
+ if not ('file' in request.POST
and isinstance(request.POST['file'], FieldStorage)
and request.POST['file'].file):
submit_form.file.errors.append(
_(u'You must provide a file.'))
- elif not security.check_filetype(request.POST['file']):
- submit_form.file.errors.append(
- _(u"The file doesn't seem to be an image!"))
else:
- filename = request.POST['file'].filename
-
- # create entry and save in database
- entry = request.db.MediaEntry()
- entry['_id'] = ObjectId()
- entry['title'] = (
- unicode(request.POST['title'])
- or unicode(splitext(filename)[0]))
-
- entry['description'] = unicode(request.POST.get('description'))
- entry['description_html'] = cleaned_markdown_conversion(
- entry['description'])
-
- entry['license'] = (
- unicode(request.POST.get('license'))
- or '')
-
- entry['media_type'] = u'image' # heh
- entry['uploader'] = request.user['_id']
-
- # Process the user's folksonomy "tags"
- entry['tags'] = convert_to_tag_list_of_dicts(
- request.POST.get('tags'))
-
- # Generate a slug from the title
- entry.generate_slug()
-
- # Now store generate the queueing related filename
- queue_filepath = request.app.queue_store.get_unique_filepath(
- ['media_entries',
- unicode(entry['_id']),
- secure_filename(filename)])
-
- # queue appropriately
- queue_file = request.app.queue_store.get_file(
- queue_filepath, 'wb')
-
- with queue_file:
- queue_file.write(request.POST['file'].file.read())
-
- # Add queued filename to the entry
- entry['queued_media_file'] = queue_filepath
-
- # We generate this ourselves so we know what the taks id is for
- # retrieval later.
- # (If we got it off the task's auto-generation, there'd be a risk of
- # a race condition when we'd save after sending off the task)
- task_id = unicode(uuid.uuid4())
- entry['queued_task_id'] = task_id
-
- # Save now so we have this data before kicking off processing
- entry.save(validate=True)
-
- # Pass off to processing
- #
- # (... don't change entry after this point to avoid race
- # conditions with changes to the document via processing code)
try:
- process_media.apply_async(
- [unicode(entry['_id'])], {},
- task_id=task_id)
- except BaseException as exc:
- # The purpose of this section is because when running in "lazy"
- # or always-eager-with-exceptions-propagated celery mode that
- # the failure handling won't happen on Celery end. Since we
- # expect a lot of users to run things in this way we have to
- # capture stuff here.
- #
- # ... not completely the diaper pattern because the exception is
- # re-raised :)
- mark_entry_failed(entry[u'_id'], exc)
- # re-raise the exception
- raise
+ filename = request.POST['file'].filename
+ media_type, media_manager = get_media_type_and_manager(filename)
+
+ # create entry and save in database
+ entry = request.db.MediaEntry()
+ entry['_id'] = ObjectId()
+ entry.media_type = unicode(media_type)
+ entry.title = (
+ unicode(request.POST['title'])
+ or unicode(splitext(filename)[0]))
+
+ entry.description = unicode(request.POST.get('description'))
+ entry.description_html = cleaned_markdown_conversion(
+ entry.description)
+
+ entry['license'] = (
+ unicode(request.POST.get('license'))
+ or '')
+
+ entry.uploader = request.user._id
+
+ # Process the user's folksonomy "tags"
+ entry['tags'] = convert_to_tag_list_of_dicts(
+ request.POST.get('tags'))
+
+ # Generate a slug from the title
+ entry.generate_slug()
- add_message(request, SUCCESS, _('Woohoo! Submitted!'))
- return redirect(request, "mediagoblin.user_pages.user_home",
- user = request.user['username'])
+ # Now store generate the queueing related filename
+ queue_filepath = request.app.queue_store.get_unique_filepath(
+ ['media_entries',
+ unicode(entry._id),
+ secure_filename(filename)])
+
+ # queue appropriately
+ queue_file = request.app.queue_store.get_file(
+ queue_filepath, 'wb')
+
+ with queue_file:
+ queue_file.write(request.POST['file'].file.read())
+
+ # Add queued filename to the entry
+ entry.queued_media_file = queue_filepath
+
+ # We generate this ourselves so we know what the taks id is for
+ # retrieval later.
+
+ # (If we got it off the task's auto-generation, there'd be
+ # a risk of a race condition when we'd save after sending
+ # off the task)
+ task_id = unicode(uuid.uuid4())
+ entry['queued_task_id'] = task_id
+
+ # Save now so we have this data before kicking off processing
+ entry.save(validate=True)
+
+ # Pass off to processing
+ #
+ # (... don't change entry after this point to avoid race
+ # conditions with changes to the document via processing code)
+ process_media = registry.tasks[ProcessMedia.name]
+ try:
+ process_media.apply_async(
+ [unicode(entry._id)], {},
+ task_id=task_id)
+ except BaseException as exc:
+ # The purpose of this section is because when running in "lazy"
+ # or always-eager-with-exceptions-propagated celery mode that
+ # the failure handling won't happen on Celery end. Since we
+ # expect a lot of users to run things in this way we have to
+ # capture stuff here.
+ #
+ # ... not completely the diaper pattern because the
+ # exception is re-raised :)
+ mark_entry_failed(entry._id, exc)
+ # re-raise the exception
+ raise
+
+ add_message(request, SUCCESS, _('Woohoo! Submitted!'))
+
+ return redirect(request, "mediagoblin.user_pages.user_home",
+ user=request.user.username)
+ except Exception as e:
+ '''
+ This section is intended to catch exceptions raised in
+ mediagobling.media_types
+ '''
+
+ if isinstance(e, InvalidFileType) or \
+ isinstance(e, FileTypeNotSupported):
+ submit_form.file.errors.append(
+ e)
+ else:
+ raise
return render_to_response(
request,
diff --git a/mediagoblin/templates/mediagoblin/404.html b/mediagoblin/templates/mediagoblin/404.html
index 7db68941..392c14f5 100644
--- a/mediagoblin/templates/mediagoblin/404.html
+++ b/mediagoblin/templates/mediagoblin/404.html
@@ -18,17 +18,12 @@
{% extends "mediagoblin/base.html" %}
{% block mediagoblin_content %}
+ <img class="right_align" src="{{ request.staticdirect('/images/404.png') }}"
+ alt="{% trans %}Image of 404 goblin stressing out{% endtrans %}" />
<h1>{% trans %}Oops!{% endtrans %}</h1>
-
- <div class="grid_8 alpha">
- <p>{% trans %}There doesn't seem to be a page at this address. Sorry!{% endtrans %}</p>
- <p>
- {%- trans %}If you're sure the address is correct, maybe the page you're looking for has been moved or deleted.{% endtrans -%}
- </p>
- </div>
-
- <div class="grid_8 omega">
- <img src="{{ request.staticdirect('/images/404.png') }}"
- alt="{% trans %}Image of 404 goblin stressing out{% endtrans %}" />
- </div>
+ <p>{% trans %}There doesn't seem to be a page at this address. Sorry!{% endtrans %}</p>
+ <p>
+ {%- trans %}If you're sure the address is correct, maybe the page you're looking for has been moved or deleted.{% endtrans -%}
+ </p>
+ <div class="clear"></div>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html
index 53186cec..d95516e8 100644
--- a/mediagoblin/templates/mediagoblin/auth/change_fp.html
+++ b/mediagoblin/templates/mediagoblin/auth/change_fp.html
@@ -19,20 +19,21 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
-{% block mediagoblin_content %}
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/show_password.js') }}"></script>
+{% endblock mediagoblin_head %}
+{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.auth.verify_forgot_password') }}"
method="POST" enctype="multipart/form-data">
{{ csrf_token }}
-
- <div class="grid_6 prefix_1 suffix_1 form_box">
- <h1>{% trans %}Enter your new password{% endtrans %}</h1>
-
+ <div class="form_box">
+ <h1>{% trans %}Set your new password{% endtrans %}</h1>
{{ wtforms_util.render_divs(cp_form) }}
<div class="form_submit_buttons">
- <input type="submit" value="submit" class="button"/>
+ <input type="submit" value="{% trans %}Set password{% endtrans %}" class="button_form"/>
</div>
-
</div>
</form>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/auth/forgot_password.html b/mediagoblin/templates/mediagoblin/auth/forgot_password.html
index b95a4dcb..672e9d9a 100644
--- a/mediagoblin/templates/mediagoblin/auth/forgot_password.html
+++ b/mediagoblin/templates/mediagoblin/auth/forgot_password.html
@@ -20,20 +20,15 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
{% block mediagoblin_content %}
-
<form action="{{ request.urlgen('mediagoblin.auth.forgot_password') }}"
method="POST" enctype="multipart/form-data">
{{ csrf_token }}
-
- <div class="grid_6 prefix_1 suffix_1 form_box">
- <h1>{% trans %}Enter your username or email{% endtrans %}</h1>
-
+ <div class="form_box">
+ <h1>{% trans %}Recover password{% endtrans %}</h1>
{{ wtforms_util.render_divs(fp_form) }}
<div class="form_submit_buttons">
- <input type="submit" value="submit" class="button"/>
+ <input type="submit" value="{% trans %}Send instructions{% endtrans %}" class="button_form"/>
</div>
-
</div>
</form>
{% endblock %}
-
diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html
index 61c5a203..993790eb 100644
--- a/mediagoblin/templates/mediagoblin/auth/login.html
+++ b/mediagoblin/templates/mediagoblin/auth/login.html
@@ -23,34 +23,30 @@
<form action="{{ request.urlgen('mediagoblin.auth.login') }}"
method="POST" enctype="multipart/form-data">
{{ csrf_token }}
- <div class="grid_6 prefix_1 suffix_1 form_box">
+ <div class="form_box">
<h1>{% trans %}Log in{% endtrans %}</h1>
{% if login_failed %}
<div class="form_field_error">
{% trans %}Logging in failed!{% endtrans %}
</div>
{% endif %}
- {{ wtforms_util.render_divs(login_form) }}
- <div class="form_submit_buttons">
- <input type="submit" value="{% trans %}Log in{% endtrans %}" class="button"/>
- </div>
- {% if next %}
- <input type="hidden" name="next" value="{{ next }}" class="button"
- style="display: none;"/>
- {% endif %}
{% if allow_registration %}
<p>
- {% trans %}Don't have an account yet?{% endtrans %}
- <br />
- <a href="{{ request.urlgen('mediagoblin.auth.register') }}">
+ {% trans %}Don't have an account yet?{% endtrans %} <a href="{{ request.urlgen('mediagoblin.auth.register') }}">
{%- trans %}Create one here!{% endtrans %}</a>
</p>
+ {% endif %}
+ {{ wtforms_util.render_divs(login_form) }}
<p>
- {% trans %}Forgot your password?{% endtrans %}
- <br />
<a href="{{ request.urlgen('mediagoblin.auth.forgot_password') }}">
- {%- trans %}Change it!{% endtrans %}</a>
+ {% trans %}Forgot your password?{% endtrans %}</a>
</p>
+ <div class="form_submit_buttons">
+ <input type="submit" value="{% trans %}Log in{% endtrans %}" class="button_form"/>
+ </div>
+ {% if next %}
+ <input type="hidden" name="next" value="{{ next }}" class="button_form"
+ style="display: none;"/>
{% endif %}
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html
index 25b68058..afcfcda9 100644
--- a/mediagoblin/templates/mediagoblin/auth/register.html
+++ b/mediagoblin/templates/mediagoblin/auth/register.html
@@ -19,17 +19,22 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/show_password.js') }}"></script>
+{% endblock mediagoblin_head %}
+
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.auth.register') }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_6 prefix_1 suffix_1 form_box">
+ <div class="form_box">
<h1>{% trans %}Create an account!{% endtrans %}</h1>
{{ wtforms_util.render_divs(register_form) }}
{{ csrf_token }}
<div class="form_submit_buttons">
<input type="submit" value="{% trans %}Create{% endtrans %}"
- class="button" />
+ class="button_form" />
</div>
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html
index b4c4dcf3..5335ebe3 100644
--- a/mediagoblin/templates/mediagoblin/base.html
+++ b/mediagoblin/templates/mediagoblin/base.html
@@ -19,79 +19,73 @@
<html>
<head>
<meta charset="utf-8">
- <title>{% block title %}{% trans %}GNU MediaGoblin{% endtrans %}{% endblock title %}</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
+ <title>{% block title %}{{ app_config['html_title'] }}{% endblock %}</title>
<link rel="stylesheet" type="text/css"
href="{{ request.staticdirect('/css/extlib/reset.css') }}"/>
<link rel="stylesheet" type="text/css"
- href="{{ request.staticdirect('/css/extlib/text.css') }}"/>
- <link rel="stylesheet" type="text/css"
- href="{{ request.staticdirect('/css/extlib/960_16_col.css') }}"/>
- <link rel="stylesheet" type="text/css"
href="{{ request.staticdirect('/css/base.css') }}"/>
<link rel="shortcut icon"
href="{{ request.staticdirect('/images/goblin.ico') }}" />
+ <script src="{{ request.staticdirect('/js/extlib/jquery.js') }}"></script>
+ <!--[if lt IE 9]>
+ <script src="{{ request.staticdirect('/js/extlib/html5shiv.js') }}"></script>
+ <![endif]-->
{% block mediagoblin_head %}
{% endblock mediagoblin_head %}
</head>
-
<body>
{% block mediagoblin_body %}
- <div class="mediagoblin_body">
+ <div class="container">
{% block mediagoblin_header %}
- <div class="container_16">
- <div class="grid_16 mediagoblin_header">
+ <header>
{% block mediagoblin_logo %}
- <a class="mediagoblin_logo"
+ <a class="logo"
href="{{ request.urlgen('index') }}"
><img src="{{ request.staticdirect('/images/logo.png') }}"
alt="{% trans %}MediaGoblin logo{% endtrans %}" /></a>
- {% endblock %}
- {% if request.user and request.user['status'] == 'active' %}
- <a class="header_submit"
+ {% endblock mediagoblin_logo %}
+ {% if request.user and request.user.status == 'active' %}
+ <a class="button_action"
href="{{ request.urlgen('mediagoblin.submit.start') }}">
- {% trans %}Submit media{% endtrans %}
+ {% trans %}Add media{% endtrans %}
</a>
{% endif %}
{% block mediagoblin_header_title %}{% endblock %}
- <div class="mediagoblin_header_right">
+ <div class="header_right">
{% if request.user %}
{# the following link should only appear when verification is needed #}
{% if request.user.status == "needs_email_verification" %}
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
- user=request.user['username']) }}"
- class="header_submit">
- {% trans %}verify your email!{% endtrans %}</a>
+ user=request.user.username) }}"
+ class="button_action_highlight">
+ {% trans %}Verify your email!{% endtrans %}</a>
{% endif %}
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
- user= request.user['username']) }}">
- {{ request.user['username'] }}</a>
+ user= request.user.username) }}">
+ {{ request.user.username }}</a>
- (<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">log out</a>)
+ (<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">{% trans %}log out{% endtrans %}</a>)
{% else %}
<a href="{{ request.urlgen('mediagoblin.auth.login') }}">
{% trans %}Log in{% endtrans %}</a>
{% endif %}
</div>
- </div>
- </div>
+ </header>
{% endblock %}
- <div class="container_16 mediagoblin_content">
- <div class="grid_16">
+ <div class="mediagoblin_content">
{% include "mediagoblin/utils/messages.html" %}
{% block mediagoblin_content %}
{% endblock mediagoblin_content %}
- </div>
</div>
{% block mediagoblin_footer %}
- <div class="container_16">
- <div class="grid_16 mediagoblin_footer">
+ <footer>
{% trans -%}
Powered by <a href="http://mediagoblin.org">MediaGoblin</a>, a <a href="http://gnu.org/">GNU</a> project
{%- endtrans %}
- </div>
- </div>
- {% endblock %}
+ </footer>
+ {% endblock mediagoblin_footer %}
{% endblock mediagoblin_body %}
</div>
</body>
diff --git a/mediagoblin/templates/mediagoblin/edit/attachments.html b/mediagoblin/templates/mediagoblin/edit/attachments.html
index d8b55f58..bd972b2a 100644
--- a/mediagoblin/templates/mediagoblin/edit/attachments.html
+++ b/mediagoblin/templates/mediagoblin/edit/attachments.html
@@ -20,14 +20,14 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.edit.attachments',
- user= media.uploader().username,
+ user= media.get_uploader.username,
media= media._id) }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 edit_box form_box">
+ <div class="form_box">
<h1>Editing attachments for {{ media.title }}</h1>
<div style="text-align: center;" >
<img src="{{ request.app.public_store.file_url(
- media['media_files']['thumb']) }}" />
+ media.media_files['thumb']) }}" />
</div>
{% if media.attachment_files|count %}
@@ -48,7 +48,7 @@
{{ wtforms_util.render_divs(form) }}
<div class="form_submit_buttons">
<a href="{{ media.url_for_self(request.urlgen) }}">Cancel</a>
- <input type="submit" value="Save changes" class="button" />
+ <input type="submit" value="Save changes" class="button_form" />
{{ csrf_token }}
</div>
</div>
diff --git a/mediagoblin/templates/mediagoblin/edit/edit.html b/mediagoblin/templates/mediagoblin/edit/edit.html
index b4b3be85..fc6b1605 100644
--- a/mediagoblin/templates/mediagoblin/edit/edit.html
+++ b/mediagoblin/templates/mediagoblin/edit/edit.html
@@ -22,22 +22,22 @@
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.edit.edit_media',
- user= media.uploader().username,
+ user= media.get_uploader.username,
media= media._id) }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 edit_box form_box">
+ <div class="form_box_xl edit_box">
<h1>{% trans media_title=media.title %}Editing {{ media_title }}{% endtrans %}</h1>
<div style="text-align: center;" >
<img src="{{ request.app.public_store.file_url(
- media['media_files']['thumb']) }}" />
+ media.media_files['thumb']) }}" />
</div>
{{ wtforms_util.render_divs(form) }}
<div class="form_submit_buttons">
<a href="{{ media.url_for_self(request.urlgen) }}">{% trans %}Cancel{% endtrans %}</a>
- <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button" />
+ <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button_form" />
{{ csrf_token }}
</div>
</div>
</form>
-
+
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/edit/edit_account.html b/mediagoblin/templates/mediagoblin/edit/edit_account.html
new file mode 100644
index 00000000..e8a968e6
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/edit/edit_account.html
@@ -0,0 +1,45 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+{% extends "mediagoblin/base.html" %}
+
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/show_password.js') }}"></script>
+{% endblock mediagoblin_head %}
+
+{% block mediagoblin_content %}
+
+ <form action="{{ request.urlgen('mediagoblin.edit.account') }}?username={{
+ user.username }}"
+ method="POST" enctype="multipart/form-data">
+ <div class="form_box edit_box">
+ <h1>
+ {%- trans username=user.username -%}
+ Changing {{ username }}'s account settings
+ {%- endtrans %}
+ </h1>
+ {{ wtforms_util.render_divs(form) }}
+ <div class="form_submit_buttons">
+ <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button_form" />
+ {{ csrf_token }}
+ </div>
+ </div>
+ </form>
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html
index 93b2a792..97c03e37 100644
--- a/mediagoblin/templates/mediagoblin/edit/edit_profile.html
+++ b/mediagoblin/templates/mediagoblin/edit/edit_profile.html
@@ -22,17 +22,17 @@
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.edit.profile') }}?username={{
- user['username'] }}"
+ user.username }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 edit_box form_box">
+ <div class="form_box edit_box">
<h1>
- {%- trans username=user['username'] -%}
+ {%- trans username=user.username -%}
Editing {{ username }}'s profile
{%- endtrans %}
</h1>
{{ wtforms_util.render_divs(form) }}
<div class="form_submit_buttons">
- <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button" />
+ <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button_form" />
{{ csrf_token }}
</div>
</div>
diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html
index 58863015..a7cbe241 100644
--- a/mediagoblin/templates/mediagoblin/listings/tag.html
+++ b/mediagoblin/templates/mediagoblin/listings/tag.html
@@ -26,19 +26,18 @@
tag=tag_slug) }}">
{% endblock mediagoblin_head %}
+{% block title %}
+ {% trans %}Media tagged with: {{ tag_name }}{% endtrans %} &mdash; {{ super() }}
+{% endblock %}
+
{% block mediagoblin_content -%}
<h1>
- {% trans %}Media tagged with:{% endtrans %} {{ tag_name }}
+ {% trans %}Media tagged with: {{ tag_name }}{% endtrans %}
</h1>
- <div class="container_16 media_gallery">
- {{ object_gallery(request, media_entries, pagination) }}
- </div>
+ {{ object_gallery(request, media_entries, pagination) }}
- <div class="grid_16">
- {% set feed_url = request.urlgen(
- 'mediagoblin.listings.tag_atom_feed',
- tag=tag_slug) %}
- {% include "mediagoblin/utils/feed_link.html" %}
- </div>
+ {% set feed_url = request.urlgen('mediagoblin.listings.tag_atom_feed',
+ tag=tag_slug) %}
+ {% include "mediagoblin/utils/feed_link.html" %}
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/ascii.html b/mediagoblin/templates/mediagoblin/media_displays/ascii.html
new file mode 100644
index 00000000..6b40bf08
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/media_displays/ascii.html
@@ -0,0 +1,40 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+
+{% extends 'mediagoblin/user_pages/media.html' %}
+
+{% block mediagoblin_media %}
+ <div class="ascii-wrapper">
+ <pre>
+ {%- autoescape False -%}
+ {{- request.app.public_store.get_file(
+ media.media_files['unicode']).read()|string -}}
+ {%- endautoescape -%}
+ </pre>
+ </div>
+ {% if 'original' in media.media_files %}
+ <p>
+ <a href="{{ request.app.public_store.file_url(
+ media.media_files['original']) }}">
+ {%- trans -%}
+ Original
+ {%- endtrans -%}
+ </a>
+ </p>
+ {% endif %}
+{% endblock %}
diff --git a/mediagoblin/middleware/__init__.py b/mediagoblin/templates/mediagoblin/media_displays/image.html
index 05325ee5..94420e89 100644
--- a/mediagoblin/middleware/__init__.py
+++ b/mediagoblin/templates/mediagoblin/media_displays/image.html
@@ -1,3 +1,4 @@
+{#
# GNU MediaGoblin -- federated, autonomous media hosting
# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
#
@@ -13,8 +14,6 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
-ENABLED_MIDDLEWARE = (
- 'mediagoblin.middleware.noop:NoOpMiddleware',
- 'mediagoblin.middleware.csrf:CsrfMiddleware',
- )
+{% extends 'mediagoblin/user_pages/media.html' %}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html
new file mode 100644
index 00000000..6b5e7a0e
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/media_displays/video.html
@@ -0,0 +1,52 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+
+{% extends 'mediagoblin/user_pages/media.html' %}
+
+{% block mediagoblin_media %}
+ <div class="video-player" style="position: relative;">
+ <video class="video-js vjs-default-skin"
+ width="{{ media.media_data.video.width }}"
+ height="{{ media.media_data.video.height }}"
+ controls="controls"
+ preload="auto"
+ data-setup="">
+ <source src="{{ request.app.public_store.file_url(
+ media.media_files['webm_640']) }}"
+ type="video/webm; codecs=&quot;vp8, vorbis&quot;" />
+ <div class="no_html5">
+ {%- trans -%}Sorry, this video will not work because
+ your web browser does not support HTML5
+ video.{%- endtrans -%}<br/>
+ {%- trans -%}You can get a modern web browser that
+ can play this video at <a href="http://getfirefox.com">
+ http://getfirefox.com</a>!{%- endtrans -%}
+ </div>
+ </video>
+ </div>
+ {% if 'original' in media.media_files %}
+ <p>
+ <a href="{{ request.app.public_store.file_url(
+ media.media_files['original']) }}">
+ {%- trans -%}
+ Original
+ {%- endtrans -%}
+ </a>
+ </p>
+ {% endif %}
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html
index e3ca9726..3f834572 100644
--- a/mediagoblin/templates/mediagoblin/root.html
+++ b/mediagoblin/templates/mediagoblin/root.html
@@ -23,31 +23,18 @@
{% if request.user %}
<h1>{% trans %}Explore{% endtrans %}</h1>
{% else %}
- <div class="grid_11 alpha">
- <h1>{% trans %}Hi there, media lover! MediaGoblin is...{% endtrans %}</h1>
- <ul>
- <li>{% trans %}The perfect place for your media!{% endtrans %}</li>
- <li>{% trans %}A place for people to collaborate and show off original and derived creations!{% endtrans %}</li>
- <li>{% trans %}Free, as in freedom. (We’re a <a href="http://gnu.org">GNU</a> project, after all.){% endtrans %}</li>
- <li>{% trans %}Aiming to make the world a better place through decentralization and (eventually, coming soon!) federation!{% endtrans %}</li>
- <li>{% trans %}Built for extensibility. (Multiple media types coming soon to the software, including video support!){% endtrans %}</li>
- <li>{% trans %}Powered by people like you. (<a href="http://mediagoblin.org/pages/join.html">You can help us improve this software!</a>){% endtrans %}</li>
- </ul>
-
- {% if allow_registration %}
- <p>{% trans %}Excited to join us?{% endtrans %}<p>
- {% trans register_url=request.urlgen('mediagoblin.auth.register') -%}
- <a class="header_submit_highlight" href="{{ register_url }}">Create a free account</a>
- or
- <a class="header_submit" href="http://wiki.mediagoblin.org/HackingHowto">Set up MediaGoblin on your own server</a>
- {%- endtrans %}
- {% endif %}
- </div>
-
- <div class="grid_5 omega">
- <img src="{{ request.staticdirect('/images/frontpage_image.png') }}" />
- </div>
-
+ <h1>{% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}</h1>
+ <img class="right_align" src="{{ request.staticdirect('/images/frontpage_image.png') }}" />
+ <p>{% trans %}This site is running <a href="http://mediagoblin.org">MediaGoblin</a>, an extraordinarily great piece of media hosting software.{% endtrans %}</p>
+ <p>{% trans %}To add your own media, place comments, save your favourites and more, you can log in with your MediaGoblin account.{% endtrans %}</p>
+ {% if allow_registration %}
+ <p>{% trans %}Don't have one yet? It's easy!{% endtrans %}</p>
+ {% trans register_url=request.urlgen('mediagoblin.auth.register') -%}
+ <a class="button_action_highlight" href="{{ register_url }}">Create an account at this site</a>
+ or
+ <a class="button_action" href="http://wiki.mediagoblin.org/HackingHowto">Set up MediaGoblin on your own server</a>
+ {%- endtrans %}
+ {% endif %}
<div class="clear"></div>
{% endif %}
<h2>{% trans %}Most recent media{% endtrans %}</h2>
diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html
index 29b01181..afae2f1f 100644
--- a/mediagoblin/templates/mediagoblin/submit/start.html
+++ b/mediagoblin/templates/mediagoblin/submit/start.html
@@ -22,12 +22,12 @@
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.submit.start') }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 form_box">
- <h1>{% trans %}Submit yer media{% endtrans %}</h1>
+ <div class="form_box_xl">
+ <h1>{% trans %}Add your media{% endtrans %}</h1>
{{ wtforms_util.render_divs(submit_form) }}
<div class="form_submit_buttons">
{{ csrf_token }}
- <input type="submit" value="{% trans %}Submit{% endtrans %}" class="button" />
+ <input type="submit" value="{% trans %}Add{% endtrans %}" class="button_form" />
</div>
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/test_submit.html b/mediagoblin/templates/mediagoblin/test_submit.html
index 190b9ac3..38be8efc 100644
--- a/mediagoblin/templates/mediagoblin/test_submit.html
+++ b/mediagoblin/templates/mediagoblin/test_submit.html
@@ -25,7 +25,7 @@
{{ wtforms_util.render_table(image_form) }}
<tr>
<td></td>
- <td><input type="submit" value="submit" class="button" /></td>
+ <td><input type="submit" value="submit" class="button_form" /></td>
{{ csrf_token }}
</tr>
</table>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html
index df931d9c..b0bfacf8 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html
@@ -26,29 +26,26 @@
user=user.username) }}">
{% endblock mediagoblin_head %}
-{% block mediagoblin_content -%}
- {% if user %}
- <h1>
- {%- trans username=user.username,
- user_url=request.urlgen(
- 'mediagoblin.user_pages.user_home',
- user=user.username) -%}
- <a href="{{ user_url }}">{{ username }}</a>'s media
- {%- endtrans %}
- </h1>
+{% block title %}
+ {%- trans username=user.username -%}
+ {{ username }}'s media
+ {%- endtrans %} &mdash; {{ super() }}
+{% endblock %}
- <div class="container_16 media_gallery">
- {{ object_gallery(request, media_entries, pagination) }}
- </div>
+{% block mediagoblin_content -%}
+ <h1>
+ {%- trans username=user.username,
+ user_url=request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=user.username) -%}
+ <a href="{{ user_url }}">{{ username }}</a>'s media
+ {%- endtrans %}
+ </h1>
- <div class="grid_16">
- {% set feed_url = request.urlgen(
- 'mediagoblin.user_pages.atom_feed',
- user=user.username) %}
- {% include "mediagoblin/utils/feed_link.html" %}
- </div>
- {% else %}
- {# This *should* not occur as the view makes sure we pass in a user. #}
- <p>{% trans %}Sorry, no such user found.{% endtrans %}<p/>
- {% endif %}
+ {{ object_gallery(request, media_entries, pagination) }}
+
+ {% set feed_url = request.urlgen('mediagoblin.user_pages.atom_feed',
+ user=user.username) %}
+ {% include "mediagoblin/utils/feed_link.html" %}
+
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html
index efbd7e53..cbe26cbf 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/media.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/media.html
@@ -20,19 +20,25 @@
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
{% from "mediagoblin/utils/pagination.html" import render_pagination %}
+{% block title %}{{ media.title }} &mdash; {{ super() }}{% endblock %}
+
+{% block mediagoblin_head %}
+ <script type="text/javascript"
+ src="{{ request.staticdirect('/js/comment_show.js') }}"></script>
+{% endblock mediagoblin_head %}
+
{% block mediagoblin_content %}
- {% if media %}
- <div class="grid_11 alpha">
- <div class="media_image_container">
+ <div class="media_pane">
+ <div class="media_image_container">
+ {% block mediagoblin_media %}
{% set display_media = request.app.public_store.file_url(
media.get_display_media(media.media_files)) %}
-
{# if there's a medium file size, that means the medium size
# isn't the original... so link to the original!
#}
- {% if media['media_files'].has_key('medium') %}
+ {% if media.media_files.has_key('medium') %}
<a href="{{ request.app.public_store.file_url(
- media['media_files']['original']) }}">
+ media.media_files['original']) }}">
<img class="media_image"
src="{{ display_media }}"
alt="Image for {{ media.title }}" />
@@ -42,139 +48,129 @@
src="{{ display_media }}"
alt="Image for {{ media.title }}" />
{% endif %}
- </div>
-
- <h2 class="media_title">
- {{ media.title }}
- </h2>
-
- <p class="media_uploader">
- {% trans date=media.created.strftime("%Y-%m-%d"),
- user_url=request.urlgen(
- 'mediagoblin.user_pages.user_home',
- user=media.uploader().username),
- username=media.uploader().username -%}
- Uploaded on {{ date }} by <a href="{{ user_url }}">{{ username }}</a>
- {%- endtrans %}
- </p>
-
- {% autoescape False %}
- <p>{{ media.description_html }}</p>
- {% endautoescape %}
-
- <br />
- <h3>{% trans %}Comments{% endtrans %}</h3>
-
+ {% endblock %}
+ </div>
+ <h2 class="media_title">
+ {{ media.title }}
+ </h2>
+ {% autoescape False %}
+ <p>{{ media.description_html }}</p>
+ {% endautoescape %}
+ <p class="media_specs">
+ {% trans date=media.created.strftime("%Y-%m-%d") -%}
+ Added on {{ date }}.
+ {%- endtrans %}
+ {% if request.user and
+ (media.uploader == request.user._id or
+ request.user.is_admin) %}
+ {% set edit_url = request.urlgen('mediagoblin.edit.edit_media',
+ user= media.get_uploader.username,
+ media= media._id) %}
+ <a class="button_action" href="{{ edit_url }}">{% trans %}Edit{% endtrans %}</a>
+ {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete',
+ user= media.get_uploader.username,
+ media= media._id) %}
+ <a class="button_action" href="{{ delete_url }}">{% trans %}Delete{% endtrans %}</a>
+ {% endif %}
+ </p>
+ {% if comments %}
+ <h3>
+ {% if comments.count()==1 %}
+ {% trans comment_count=comments.count() -%}{{ comment_count }} comment{%- endtrans %}
+ {% elif comments.count()>1 %}
+ {% trans comment_count=comments.count() -%}{{ comment_count }} comments{%- endtrans %}
+ {% else %}
+ {% trans %}No comments yet.{% endtrans %}
+ {% endif %}
+ <div class="right_align">
+ <a
+ {% if not request.user %}
+ href="{{ request.urlgen('mediagoblin.auth.login') }}"
+ {% endif %}
+ class="button_action" id="button_addcomment" title="Add a comment">
+ {% trans %}Add one{% endtrans %}
+ </a>
+ </div>
+ </h3>
{% if request.user %}
- <p><a href="#comment_form">{% trans %}Post a comment{% endtrans %}</a></p>
+ <form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment',
+ user= media.get_uploader.username,
+ media=media._id) }}" method="POST" id="form_comment">
+ <p>
+ {% trans %}You can use <a href="http://daringfireball.net/projects/markdown/basics">Markdown</a> for formatting.{% endtrans %}
+ </p>
+ {{ wtforms_util.render_divs(comment_form) }}
+ <div class="form_submit_buttons">
+ <input type="submit" value="{% trans %}Add this comment{% endtrans %}" class="button_action" />
+ {{ csrf_token }}
+ </div>
+ </form>
{% endif %}
-
- {% if comments %}
- {% for comment in comments %}
- {% set comment_author = comment.author() %}
- {% if pagination.active_id == comment._id %}
- <div class="comment_wrapper comment_active" id="comment-{{ comment['_id'] }}">
- <a name="comment" id="comment"></a>
- {% else %}
- <div class="comment_wrapper" id="comment-{{ comment['_id'] }}">
- {% endif %}
-
- <div class="comment_content">
- {% autoescape False %}
- {{ comment.content_html }}
- {% endautoescape %}
- </div>
-
- <div class="comment_author">&mdash;
- <a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
- user = comment_author['username']) }}">
- {{ comment_author['username'] }}</a>
- {% trans %}at{% endtrans %}
- <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.view_comment',
- comment = comment['_id'],
- user = media.uploader().username,
- media = media._id) }}#comment">
- {{ comment.created.strftime("%Y-%m-%d %I:%M%p") }}
- </a>
- </div>
+ {% for comment in comments %}
+ {% set comment_author = comment.get_author %}
+ {% if pagination.active_id == comment._id %}
+ <div class="comment_wrapper comment_active" id="comment-{{ comment._id }}">
+ <a name="comment" id="comment"></a>
+ {% else %}
+ <div class="comment_wrapper" id="comment-{{ comment._id }}">
+ {% endif %}
+ <div class="comment_content">
+ {% autoescape False %}
+ {{ comment.content_html }}
+ {% endautoescape %}
+ <img src="{{ request.staticdirect('/images/icon_comment.png') }}" />
+ <a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
+ user = comment_author.username) }}">
+ {{ comment_author.username }}
+ </a>
+ {% trans %}at{% endtrans %}
+ <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.view_comment',
+ comment = comment._id,
+ user = media.get_uploader.username,
+ media = media.slug) }}#comment">
+ {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }}
+ </a>
</div>
+ </div>
+ {% endfor %}
+ {{ render_pagination(request, pagination,
+ media.url_for_self(request.urlgen)) }}
+ {% endif %}
+ </div>
+ <div class="media_sidebar">
+ {% trans user_url=request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=media.get_uploader.username),
+ username=media.get_uploader.username -%}
+ <p>â– Browsing media by <a href="{{ user_url }}">{{ username }}</a></p>
+ {%- endtrans %}
+ {% include "mediagoblin/utils/prev_next.html" %}
+ {% if media.attachment_files|count %}
+ <h3>Attachments</h3>
+ <ul>
+ {% for attachment in media.attachment_files %}
+ <li>
+ <a href="{{ request.app.public_store.file_url(attachment.filepath) }}">
+ {{ attachment.name }}
+ </a>
+ </li>
{% endfor %}
-
- {% if request.user %}
- <form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment',
- user= media.uploader().username,
- media=media._id) }}" method="POST">
- {{ wtforms_util.render_divs(comment_form) }}
- <div class="form_submit_buttons">
- <input type="submit" value="{% trans %}Post comment!{% endtrans %}" class="button" />
- {{ csrf_token }}
- </div>
- </form>
- {% endif %}
-
- {{ render_pagination(request, pagination,
- request.urlgen('mediagoblin.user_pages.media_home',
- user = media.uploader().username,
- media = media._id)) }}
- </div>
+ </ul>
+ {% endif %}
+ {% if app_config['allow_attachments']
+ and request.user
+ and (media.uploader == request.user._id
+ or request.user.is_admin) %}
+ <p>
+ <a href="{{ request.urlgen('mediagoblin.edit.attachments',
+ user=media.get_uploader.username,
+ media=media._id) }}">Add attachment</a>
+ </p>
+ {% endif %}
+ {% if media.tags %}
+ {% include "mediagoblin/utils/tags.html" %}
{% endif %}
- <div class="grid_5 omega">
- {% include "mediagoblin/utils/prev_next.html" %}
-
- {% if media['uploader'] == request.user['_id'] or
- request.user['is_admin'] %}
- <h3>{% trans %}Actions{% endtrans %}</h3>
- <p>
- {% set edit_url = request.urlgen('mediagoblin.edit.edit_media',
- user= media.uploader().username,
- media= media._id) %}
- <a href="{{ edit_url }}"
- ><img src="{{ request.staticdirect('/images/icon_edit.png') }}"
- class="media_icon" /></a>
- <a href="{{ edit_url }}">{% trans %}edit{% endtrans %}</a>
- </p>
- <p>
- {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete',
- user= media.uploader().username,
- media= media._id) %}
- <a href="{{ delete_url }}"
- ><img src="{{ request.staticdirect('/images/icon_delete.png') }}"
- class="media_icon" /></a>
- <a href="{{ delete_url }}">{% trans %}delete{% endtrans %}</a>
- </p>
- {% endif %}
-
- {% if media.attachment_files|count %}
- <h3>Attachments</h3>
- <ul>
- {% for attachment in media.attachment_files %}
- <li>
- <a href="{{ request.app.public_store.file_url(attachment.filepath) }}">
- {{ attachment.name }}
- </a>
- </li>
- {% endfor %}
- </ul>
- {% endif %}
-
- {% if app_config['allow_attachments']
- and (media['uploader'] == request.user['_id']
- or request.user['is_admin']) %}
- <p>
- <a href="{{ request.urlgen('mediagoblin.edit.attachments',
- user=media.uploader().username,
- media=media._id) }}">Add attachment</a>
- </p>
- {% endif %}
-
- {% if media.tags %}
- {% include "mediagoblin/utils/tags.html" %}
- {% endif %}
-
- {% include "mediagoblin/utils/license.html" %}
- </div>
- {% else %}
- <p>{% trans %}Sorry, no such media found.{% endtrans %}<p/>
- {% endif %}
+ {% include "mediagoblin/utils/license.html" %}
+ </div>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
index 8da90f79..dcb148e0 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
@@ -22,19 +22,19 @@
{% block mediagoblin_content %}
<form action="{{ request.urlgen('mediagoblin.user_pages.media_confirm_delete',
- user=media.uploader().username,
+ user=media.get_uploader.username,
media=media._id) }}"
method="POST" enctype="multipart/form-data">
- <div class="grid_8 prefix_1 suffix_1 edit_box form_box">
+ <div class="form_box">
<h1>
- {%- trans title=media['title'] -%}
+ {%- trans title=media.title -%}
Really delete {{ title }}?
{%- endtrans %}
</h1>
<div style="text-align: center;" >
<img src="{{ request.app.public_store.file_url(
- media['media_files']['thumb']) }}" />
+ media.media_files['thumb']) }}" />
</div>
<br />
@@ -47,7 +47,7 @@
<div class="form_submit_buttons">
{# TODO: This isn't a button really... might do unexpected things :) #}
<a class="cancel_link" href="{{ media.url_for_self(request.urlgen) }}">{% trans %}Cancel{% endtrans %}</a>
- <input type="submit" value="{% trans %}Delete Permanently{% endtrans %}" class="button" />
+ <input type="submit" value="{% trans %}Delete Permanently{% endtrans %}" class="button_form" />
{{ csrf_token }}
</div>
</div>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html
index 9b4adeb5..a14b0123 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html
@@ -36,8 +36,8 @@
</tr>
{% for media_entry in processing_entries %}
<tr>
- <td>{{ media_entry['title'] }}</td>
- <td>{{ media_entry['created'].strftime("%m-%d-%Y %I:%M %p") }}</td>
+ <td>{{ media_entry.title }}</td>
+ <td>{{ media_entry.created.strftime("%m-%d-%Y %I:%M %p") }}</td>
<td></td>
</tr>
{% endfor %}
@@ -57,7 +57,7 @@
</tr>
{% for media_entry in failed_entries %}
<tr>
- <td>{{ media_entry['title'] }}</td>
+ <td>{{ media_entry.title }}</td>
<td>{{ media_entry['created'].strftime("%m-%d-%Y %I:%M %p") }}</td>
<td>{{ media_entry.get_fail_exception().general_message }}</td>
</tr>
diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html
index c5beeaaa..d3b4021d 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/user.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/user.html
@@ -26,6 +26,17 @@
user=user.username) }}">
{% endblock mediagoblin_head %}
+{% block title %}
+ {%- if user -%}
+ {%- trans username=user.username -%}
+ {{ username }}'s profile
+ {%- endtrans %} &mdash; {{ super() }}
+ {%- else -%}
+ {{ super() }}
+ {%- endif -%}
+{% endblock %}
+
+
{% block mediagoblin_content -%}
{# If no user... #}
{% if not user %}
@@ -35,7 +46,7 @@
{% elif user.status == "needs_email_verification" %}
{% if user == request.user %}
{# this should only be visible when you are this user #}
- <div class="grid_6 prefix_1 suffix_1 form_box">
+ <div class="form_box">
<h1>{% trans %}Email verification needed{% endtrans %}</h1>
<p>
@@ -51,11 +62,11 @@
<p>{% trans %}In case it doesn't:{% endtrans %}</p>
<a href="{{ request.urlgen('mediagoblin.auth.resend_verification') }}"
- class="button">{% trans %}Resend verification email{% endtrans %}</a>
+ class="button_action_highlight">{% trans %}Resend verification email{% endtrans %}</a>
</div>
{% else %}
{# if the user is not you, but still needs to verify their email #}
- <div class="grid_6 prefix_1 suffix_1 form_box">
+ <div class="form_box">
<h1>{% trans %}Email verification needed{% endtrans %}</h1>
<p>
@@ -78,41 +89,46 @@
{%- trans username=user.username %}{{ username }}'s profile{% endtrans -%}
</h1>
- {% if not user['url'] and not user['profile'] %}
- {% if request.user['_id'] == user['_id'] %}
- <div class="grid_6 alpha empty_space">
+ {% if not user.url and not user.bio %}
+ {% if request.user and (request.user._id == user._id) %}
+ <div class="profile_sidebar empty_space">
<p>
{% trans %}Here's a spot to tell others about yourself.{% endtrans %}
</p>
<a href="{{ request.urlgen('mediagoblin.edit.profile') }}?username={{
user.username }}"
- class="header_submit">
+ class="button_action">
{%- trans %}Edit profile{% endtrans -%}
</a>
- </div>
{% else %}
- <div class="grid_6 alpha empty_space">
+ <div class="profile_sidebar empty_space">
<p>
{% trans -%}
This user hasn't filled in their profile (yet).
{%- endtrans %}
</p>
- </div>
{% endif %}
{% else %}
- <div class="grid_6 alpha">
+ <div class="profile_sidebar">
{% include "mediagoblin/utils/profile.html" %}
- {% if request.user['_id'] == user['_id'] or request.user['is_admin'] %}
+ {% if request.user and
+ (request.user._id == user._id or request.user.is_admin) %}
<a href="{{ request.urlgen('mediagoblin.edit.profile') }}?username={{
user.username }}">
{%- trans %}Edit profile{% endtrans -%}
</a>
{% endif %}
- </div>
{% endif %}
+ {% if request.user and (request.user._id == user._id) %}
+ <a href="{{ request.urlgen('mediagoblin.edit.account') }}">
+ {%- trans %}Change account settings{% endtrans -%}
+ </a>
+ {% endif %}
+ </div>
+
{% if media_entries.count() %}
- <div class="grid_10 omega">
+ <div class="profile_showcase">
{{ object_gallery(request, media_entries, pagination,
pagination_base_url=user_gallery_url, col_number=3) }}
{% include "mediagoblin/utils/object_gallery.html" %}
@@ -129,20 +145,20 @@
{% include "mediagoblin/utils/feed_link.html" %}
</div>
{% else %}
- {% if request.user['_id'] == user['_id'] %}
- <div class="grid_10 omega empty_space">
+ {% if request.user and (request.user._id == user._id) %}
+ <div class="profile_showcase empty_space">
<p>
{% trans -%}
This is where your media will appear, but you don't seem to have added anything yet.
{%- endtrans %}
</p>
- <a class="header_submit"
+ <a class="button_action"
href="{{ request.urlgen('mediagoblin.submit.start') }}">
{%- trans %}Add media{% endtrans -%}
</a>
</div>
{% else %}
- <div class="grid_10 omega empty_space">
+ <div class="profile_showcase empty_space">
<p>
{% trans -%}
There doesn't seem to be any media here yet...
diff --git a/mediagoblin/templates/mediagoblin/utils/object_gallery.html b/mediagoblin/templates/mediagoblin/utils/object_gallery.html
index e1b8cc9b..5f628dc7 100644
--- a/mediagoblin/templates/mediagoblin/utils/object_gallery.html
+++ b/mediagoblin/templates/mediagoblin/utils/object_gallery.html
@@ -31,11 +31,11 @@
{%- elif loop.last %} thumb_entry_last{% endif %}">
<a href="{{ entry_url }}">
<img src="{{ request.app.public_store.file_url(
- entry['media_files']['thumb']) }}" />
+ entry.media_files['thumb']) }}" />
</a>
- {% if entry['title'] %}
+ {% if entry.title %}
<br />
- <a href="{{ entry_url }}">{{ entry['title'] }}</a>
+ <a href="{{ entry_url }}">{{ entry.title }}</a>
{% endif %}
</td>
{% endfor %}
@@ -68,7 +68,11 @@
{% endif %}
{% else %}
<p>
- <i>There doesn't seem to be any media here yet...</i>
+ <i>
+ {%- trans -%}
+ There doesn't seem to be any media here yet...
+ {%- endtrans -%}
+ </i>
</p>
{% endif %}
{% endmacro %}
diff --git a/mediagoblin/templates/mediagoblin/utils/pagination.html b/mediagoblin/templates/mediagoblin/utils/pagination.html
index 84336103..caa79fcc 100644
--- a/mediagoblin/templates/mediagoblin/utils/pagination.html
+++ b/mediagoblin/templates/mediagoblin/utils/pagination.html
@@ -36,18 +36,16 @@
{% set prev_url = pagination.get_page_url_explicit(
base_url, get_params,
pagination.page - 1) %}
- <a href="{{ prev_url }}"><img class="pagination_arrow" src="{{ request.staticdirect('/images/pagination_left.png') }}" alt="Previous page" /></a>
- <a href="{{ prev_url }}">{% trans %}Newer{% endtrans %}</a>
+ <a href="{{ prev_url }}">{% trans %}↠Newer{% endtrans %}</a>
{% endif %}
{% if pagination.has_next %}
{% set next_url = pagination.get_page_url_explicit(
base_url, get_params,
pagination.page + 1) %}
- <a href="{{ next_url }}">{% trans %}Older{% endtrans %}</a>
- <a href="{{ next_url }}"><img class="pagination_arrow" src="{{ request.staticdirect('/images/pagination_right.png') }}" alt="Next page" /></a>
+ <a href="{{ next_url }}">{% trans %}Older →{% endtrans %}</a>
{% endif %}
<br />
- Go to page:
+ {% trans %}Go to page:{% endtrans %}
{%- for page in pagination.iter_pages() %}
{% if page %}
{% if page != pagination.page %}
diff --git a/mediagoblin/templates/mediagoblin/utils/prev_next.html b/mediagoblin/templates/mediagoblin/utils/prev_next.html
index 75903076..66766555 100644
--- a/mediagoblin/templates/mediagoblin/utils/prev_next.html
+++ b/mediagoblin/templates/mediagoblin/utils/prev_next.html
@@ -21,28 +21,26 @@
{% set next_entry_url = media.url_to_next(request.urlgen) %}
{% if prev_entry_url or next_entry_url %}
- <div class="grid_5 alpha omega">
- {# There are no previous entries for the very first media entry #}
- {% if prev_entry_url %}
- <a class="navigation_button navigation_left" href="{{ prev_entry_url }}">
- <img src="{{ request.staticdirect('/images/navigation_left.png') }}" alt="Previous image" />
- </a>
- {% else %}
- {# This is the first entry. display greyed-out 'previous' image #}
- <p class="navigation_button navigation_left">
- <img src="{{ request.staticdirect('/images/navigation_end.png') }}" alt="No previous images" />
- </p>
- {% endif %}
- {# Likewise, this could be the very last media entry #}
- {% if next_entry_url %}
- <a class="navigation_button" href="{{ next_entry_url }}">
- <img src="{{ request.staticdirect('/images/navigation_right.png') }}" alt="Next image" />
- </a>
- {% else %}
- {# This is the last entry. display greyed-out 'next' image #}
- <p class="navigation_button">
- <img src="{{ request.staticdirect('/images/navigation_end.png') }}" alt="No following images" />
- </p>
- {% endif %}
- </div>
+ {# There are no previous entries for the very first media entry #}
+ {% if prev_entry_url %}
+ <a class="navigation_button navigation_left" href="{{ prev_entry_url }}">
+ &larr; {% trans %}newer{% endtrans %}
+ </a>
+ {% else %}
+ {# This is the first entry. display greyed-out 'previous' image #}
+ <p class="navigation_button navigation_left">
+ &larr; {% trans %}newer{% endtrans %}
+ </p>
+ {% endif %}
+ {# Likewise, this could be the very last media entry #}
+ {% if next_entry_url %}
+ <a class="navigation_button" href="{{ next_entry_url }}">
+ {% trans %}older{% endtrans %} &rarr;
+ </a>
+ {% else %}
+ {# This is the last entry. display greyed-out 'next' image #}
+ <p class="navigation_button">
+ {% trans %}older{% endtrans %} &rarr;
+ </p>
+ {% endif %}
{% endif %}
diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html
index b3211bd9..1f587411 100644
--- a/mediagoblin/templates/mediagoblin/utils/tags.html
+++ b/mediagoblin/templates/mediagoblin/utils/tags.html
@@ -17,13 +17,25 @@
#}
{% block tags_content -%}
- <h3>Tags</h3>
- <ul class="mediaentry_tags">
+ <p>{% trans %}View more media tagged with{% endtrans %}
{% for tag in media.tags %}
- <li class="tag">
+ {% if loop.last %}
+ {# the 'and' should only appear if there is more than one tag #}
+ {% if media.tags|length > 1 %}
+ {% trans %}or{% endtrans %}
+ {% endif %}
<a href="{{ request.urlgen(
- 'mediagoblin.listings.tags_listing',
- tag=tag['slug']) }}">{{ tag['name'] }}</a></li>
+ 'mediagoblin.listings.tags_listing',
+ tag=tag['slug']) }}">{{ tag['name'] }}</a>.
+ {% elif loop.revindex == 2 %}
+ <a href="{{ request.urlgen(
+ 'mediagoblin.listings.tags_listing',
+ tag=tag['slug']) }}">{{ tag['name'] }}</a>
+ {% else %}
+ <a href="{{ request.urlgen(
+ 'mediagoblin.listings.tags_listing',
+ tag=tag['slug']) }}">{{ tag['name'] }}</a>,
+ {% endif %}
{% endfor %}
- </ul>
+ </p>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html
index 6a86fd24..44b27bb8 100644
--- a/mediagoblin/templates/mediagoblin/utils/wtforms.html
+++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html
@@ -18,18 +18,18 @@
{# Generically render a field #}
{% macro render_field_div(field) %}
- <div class="form_field_box">
- <div class="form_field_label">{{ _(field.label.text) }}</div>
- <div class="form_field_input">{{ field }}</div>
+ {% if field.label.text -%}
+ <p class="form_field_label"><label for="{{ field.label.field_id }}">{{ _(field.label.text) }}</label></p>
+ {%- endif %}
+ <div class="form_field_input">
+ {{ field }}
{%- if field.errors -%}
{% for error in field.errors %}
- <div class="form_field_error">
- {{ error }}
- </div>
+ <p class="form_field_error">{{ error }}</p>
{% endfor %}
{%- endif %}
{% if field.description -%}
- <div class="form_field_description">{{ _(field.description) }}</div>
+ <p class="form_field_description">{{ _(field.description)|safe }}</p>
{%- endif %}
</div>
{%- endmacro %}
diff --git a/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml
new file mode 100644
index 00000000..95a1a176
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml
@@ -0,0 +1,27 @@
+{# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+-#}
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"
+ xmlns:hm="http://host-meta.net/xrd/1.0">
+
+ <hm:Host>{{ request.host }}</hm:Host>
+
+ <Link rel="lrdd"
+ template="{{ lrdd_template|replace(placeholder, '{uri}') }}">
+ <Title>{{ lrdd_title }}</Title>
+ </Link>
+</XRD>
diff --git a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml
new file mode 100644
index 00000000..1fe34577
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml
@@ -0,0 +1,27 @@
+{# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+-#}
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
+
+ <Subject>{{ subject }}</Subject>
+ <Alias>{{ alias }}</Alias>
+ {% for link in links %}
+ <Link
+ {%- for attr, value in link.attrs.items() %} {{ attr }}="{{ value}}"
+ {%- endfor %} />
+ {%- endfor %}
+</XRD>
diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py
index 40961eca..411b4539 100644
--- a/mediagoblin/tests/test_auth.py
+++ b/mediagoblin/tests/test_auth.py
@@ -20,7 +20,7 @@ import datetime
from nose.tools import assert_equal
from mediagoblin.auth import lib as auth_lib
-from mediagoblin.tests.tools import setup_fresh_app
+from mediagoblin.tests.tools import setup_fresh_app, fixture_add_user
from mediagoblin import mg_globals
from mediagoblin.tools import template, mail
@@ -89,7 +89,6 @@ def test_register_views(test_app):
form = context['register_form']
assert form.username.errors == [u'This field is required.']
assert form.password.errors == [u'This field is required.']
- assert form.confirm_password.errors == [u'This field is required.']
assert form.email.errors == [u'This field is required.']
# Try to register with fields that are known to be invalid
@@ -101,7 +100,6 @@ def test_register_views(test_app):
'/auth/register/', {
'username': 'l',
'password': 'o',
- 'confirm_password': 'o',
'email': 'l'})
context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html']
form = context['register_form']
@@ -125,18 +123,6 @@ def test_register_views(test_app):
assert form.email.errors == [
u'Invalid email address.']
- ## mismatching passwords
- template.clear_test_template_context()
- test_app.post(
- '/auth/register/', {
- 'password': 'herpderp',
- 'confirm_password': 'derpherp'})
- context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html']
- form = context['register_form']
-
- assert form.password.errors == [
- u'Passwords must match.']
-
## At this point there should be no users in the database ;)
assert not mg_globals.database.User.find().count()
@@ -147,7 +133,6 @@ def test_register_views(test_app):
'/auth/register/', {
'username': 'happygirl',
'password': 'iamsohappy',
- 'confirm_password': 'iamsohappy',
'email': 'happygrrl@example.org'})
response.follow()
@@ -162,13 +147,13 @@ def test_register_views(test_app):
new_user = mg_globals.database.User.find_one(
{'username': 'happygirl'})
assert new_user
- assert new_user['status'] == u'needs_email_verification'
- assert new_user['email_verified'] == False
+ assert new_user.status == u'needs_email_verification'
+ assert new_user.email_verified == False
## Make sure user is logged in
request = template.TEMPLATE_TEST_CONTEXT[
'mediagoblin/user_pages/user.html']['request']
- assert request.session['user_id'] == unicode(new_user['_id'])
+ assert request.session['user_id'] == unicode(new_user._id)
## Make sure we get email confirmation, and try verifying
assert len(mail.EMAIL_TEST_INBOX) == 1
@@ -185,15 +170,15 @@ def test_register_views(test_app):
### user should have these same parameters
assert parsed_get_params['userid'] == [
- unicode(new_user['_id'])]
+ unicode(new_user._id)]
assert parsed_get_params['token'] == [
- new_user['verification_key']]
+ new_user.verification_key]
## Try verifying with bs verification key, shouldn't work
template.clear_test_template_context()
response = test_app.get(
"/auth/verify_email/?userid=%s&token=total_bs" % unicode(
- new_user['_id']))
+ new_user._id))
response.follow()
context = template.TEMPLATE_TEST_CONTEXT[
'mediagoblin/user_pages/user.html']
@@ -202,8 +187,8 @@ def test_register_views(test_app):
new_user = mg_globals.database.User.find_one(
{'username': 'happygirl'})
assert new_user
- assert new_user['status'] == u'needs_email_verification'
- assert new_user['email_verified'] == False
+ assert new_user.status == u'needs_email_verification'
+ assert new_user.email_verified == False
## Verify the email activation works
template.clear_test_template_context()
@@ -216,8 +201,8 @@ def test_register_views(test_app):
new_user = mg_globals.database.User.find_one(
{'username': 'happygirl'})
assert new_user
- assert new_user['status'] == u'active'
- assert new_user['email_verified'] == True
+ assert new_user.status == u'active'
+ assert new_user.email_verified == True
# Uniqueness checks
# -----------------
@@ -227,7 +212,6 @@ def test_register_views(test_app):
'/auth/register/', {
'username': 'happygirl',
'password': 'iamsohappy2',
- 'confirm_password': 'iamsohappy2',
'email': 'happygrrl2@example.org'})
context = template.TEMPLATE_TEST_CONTEXT[
@@ -249,9 +233,9 @@ def test_register_views(test_app):
## Did we redirect to the proper page? Use the right template?
assert_equal(
urlparse.urlsplit(response.location)[2],
- '/auth/forgot_password/email_sent/')
+ '/auth/login/')
assert template.TEMPLATE_TEST_CONTEXT.has_key(
- 'mediagoblin/auth/fp_email_sent.html')
+ 'mediagoblin/auth/login.html')
## Make sure link to change password is sent by email
assert len(mail.EMAIL_TEST_INBOX) == 1
@@ -269,28 +253,28 @@ def test_register_views(test_app):
# user should have matching parameters
new_user = mg_globals.database.User.find_one({'username': 'happygirl'})
- assert parsed_get_params['userid'] == [unicode(new_user['_id'])]
- assert parsed_get_params['token'] == [new_user['fp_verification_key']]
+ assert parsed_get_params['userid'] == [unicode(new_user._id)]
+ assert parsed_get_params['token'] == [new_user.fp_verification_key]
### The forgotten password token should be set to expire in ~ 10 days
# A few ticks have expired so there are only 9 full days left...
- assert (new_user['fp_token_expire'] - datetime.datetime.now()).days == 9
+ assert (new_user.fp_token_expire - datetime.datetime.now()).days == 9
## Try using a bs password-changing verification key, shouldn't work
template.clear_test_template_context()
response = test_app.get(
"/auth/forgot_password/verify/?userid=%s&token=total_bs" % unicode(
- new_user['_id']), status=400)
- assert response.status == '400 Bad Request'
+ new_user._id), status=404)
+ assert_equal(response.status, '404 Not Found')
## Try using an expired token to change password, shouldn't work
template.clear_test_template_context()
- real_token_expiration = new_user['fp_token_expire']
- new_user['fp_token_expire'] = datetime.datetime.now()
+ real_token_expiration = new_user.fp_token_expire
+ new_user.fp_token_expire = datetime.datetime.now()
new_user.save()
- response = test_app.get("%s?%s" % (path, get_params), status=400)
- assert response.status == '400 Bad Request'
- new_user['fp_token_expire'] = real_token_expiration
+ response = test_app.get("%s?%s" % (path, get_params), status=404)
+ assert_equal(response.status, '404 Not Found')
+ new_user.fp_token_expire = real_token_expiration
new_user.save()
## Verify step 1 of password-change works -- can see form to change password
@@ -304,11 +288,10 @@ def test_register_views(test_app):
'/auth/forgot_password/verify/', {
'userid': parsed_get_params['userid'],
'password': 'iamveryveryhappy',
- 'confirm_password': 'iamveryveryhappy',
'token': parsed_get_params['token']})
response.follow()
assert template.TEMPLATE_TEST_CONTEXT.has_key(
- 'mediagoblin/auth/fp_changed_success.html')
+ 'mediagoblin/auth/login.html')
## Verify step 2.2 of password-change works -- login w/ new password success
template.clear_test_template_context()
@@ -332,11 +315,7 @@ def test_authentication_views(test_app):
Test logging in and logging out
"""
# Make a new user
- test_user = mg_globals.database.User()
- test_user['username'] = u'chris'
- test_user['email'] = u'chris@example.com'
- test_user['pw_hash'] = auth_lib.bcrypt_gen_password_hash('toast')
- test_user.save()
+ test_user = fixture_add_user(active_user=False)
# Get login
# ---------
@@ -412,7 +391,7 @@ def test_authentication_views(test_app):
# Make sure user is in the session
context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html']
session = context['request'].session
- assert session['user_id'] == unicode(test_user['_id'])
+ assert session['user_id'] == unicode(test_user._id)
# Successful logout
# -----------------
diff --git a/mediagoblin/tests/test_celery_setup.py b/mediagoblin/tests/test_celery_setup.py
index 348a4357..19a9b899 100644
--- a/mediagoblin/tests/test_celery_setup.py
+++ b/mediagoblin/tests/test_celery_setup.py
@@ -50,7 +50,7 @@ def test_setup_celery_from_config():
assert isinstance(fake_celery_module.CELERYD_ETA_SCHEDULER_PRECISION, float)
assert fake_celery_module.CELERY_RESULT_PERSISTENT is True
assert fake_celery_module.CELERY_IMPORTS == [
- 'foo.bar.baz', 'this.is.an.import', 'mediagoblin.process_media']
+ 'foo.bar.baz', 'this.is.an.import', 'mediagoblin.processing']
assert fake_celery_module.CELERY_MONGODB_BACKEND_SETTINGS == {
'database': 'mediagoblin'}
assert fake_celery_module.CELERY_RESULT_BACKEND == 'mongodb'
@@ -74,7 +74,7 @@ def test_setup_celery_from_config():
assert isinstance(fake_celery_module.CELERYD_ETA_SCHEDULER_PRECISION, float)
assert fake_celery_module.CELERY_RESULT_PERSISTENT is False
assert fake_celery_module.CELERY_IMPORTS == [
- 'baz.bar.foo', 'import.is.a.this', 'mediagoblin.process_media']
+ 'baz.bar.foo', 'import.is.a.this', 'mediagoblin.processing']
assert fake_celery_module.CELERY_MONGODB_BACKEND_SETTINGS == {
'database': 'captain_lollerskates',
'host': 'mongodb.example.org',
diff --git a/mediagoblin/tests/test_csrf_middleware.py b/mediagoblin/tests/test_csrf_middleware.py
index 691f10b9..c8fca23a 100644
--- a/mediagoblin/tests/test_csrf_middleware.py
+++ b/mediagoblin/tests/test_csrf_middleware.py
@@ -27,7 +27,7 @@ from mediagoblin import mg_globals
def test_csrf_cookie_set(test_app):
cookie_name = mg_globals.app_config['csrf_cookie_name']
-
+
# get login page
response = test_app.get('/auth/login/')
@@ -69,3 +69,22 @@ def test_csrf_token_must_match(test_app):
mg_globals.app_config['csrf_cookie_name'])},
extra_environ={'gmg.verify_csrf': True}).\
status_int == 200
+
+@setup_fresh_app
+def test_csrf_exempt(test_app):
+
+ # monkey with the views to decorate a known endpoint
+ import mediagoblin.auth.views
+ from mediagoblin.meddleware.csrf import csrf_exempt
+
+ mediagoblin.auth.views.login = csrf_exempt(
+ mediagoblin.auth.views.login
+ )
+
+ # construct a request with no cookie or form token
+ assert test_app.post('/auth/login/',
+ extra_environ={'gmg.verify_csrf': True},
+ expect_errors=False).status_int == 200
+
+ # restore the CSRF protection in case other tests expect it
+ mediagoblin.auth.views.login.csrf_enabled = True
diff --git a/mediagoblin/tests/test_edit.py b/mediagoblin/tests/test_edit.py
new file mode 100644
index 00000000..55f34b42
--- /dev/null
+++ b/mediagoblin/tests/test_edit.py
@@ -0,0 +1,95 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from mediagoblin import mg_globals
+from mediagoblin.tests.tools import setup_fresh_app, fixture_add_user
+from mediagoblin.tools import template
+from mediagoblin.auth.lib import bcrypt_check_password
+
+
+@setup_fresh_app
+def test_change_password(test_app):
+ """Test changing password correctly and incorrectly"""
+ # set up new user
+ test_user = fixture_add_user()
+
+ test_app.post(
+ '/auth/login/', {
+ 'username': u'chris',
+ 'password': 'toast'})
+
+ # test that the password can be changed
+ # template.clear_test_template_context()
+ test_app.post(
+ '/edit/account/', {
+ 'old_password': 'toast',
+ 'new_password': '123456',
+ })
+
+ # test_user has to be fetched again in order to have the current values
+ test_user = mg_globals.database.User.one({'username': 'chris'})
+
+ assert bcrypt_check_password('123456', test_user.pw_hash)
+
+ # test that the password cannot be changed if the given old_password
+ # is wrong
+ # template.clear_test_template_context()
+ test_app.post(
+ '/edit/account/', {
+ 'old_password': 'toast',
+ 'new_password': '098765',
+ })
+
+ test_user = mg_globals.database.User.one({'username': 'chris'})
+
+ assert not bcrypt_check_password('098765', test_user.pw_hash)
+
+
+@setup_fresh_app
+def change_bio_url(test_app):
+ """Test changing bio and URL"""
+ # set up new user
+ test_user = fixture_add_user()
+
+ # test changing the bio and the URL properly
+ test_app.post(
+ '/edit/profile/', {
+ 'bio': u'I love toast!',
+ 'url': u'http://dustycloud.org/'})
+
+ test_user = mg_globals.database.User.one({'username': 'chris'})
+
+ assert test_user.bio == u'I love toast!'
+ assert test_user.url == u'http://dustycloud.org/'
+
+ # test changing the bio and the URL inproperly
+ too_long_bio = 150 * 'T' + 150 * 'o' + 150 * 'a' + 150 * 's' + 150* 't'
+
+ test_app.post(
+ '/edit/profile/', {
+ # more than 500 characters
+ 'bio': too_long_bio,
+ 'url': 'this-is-no-url'})
+
+ test_user = mg_globals.database.User.one({'username': 'chris'})
+
+ context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/edit/edit_profile.html']
+ form = context['edit_profile_form']
+
+ assert form.bio.errors == [u'Field must be between 0 and 500 characters long.']
+ assert form.url.errors == [u'Improperly formed URL']
+
+ # test changing the url inproperly
diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini
index ab32cccc..c91ed92b 100644
--- a/mediagoblin/tests/test_mgoblin_app.ini
+++ b/mediagoblin/tests/test_mgoblin_app.ini
@@ -1,13 +1,15 @@
[mediagoblin]
-direct_remote_path = /mgoblin_static/
+direct_remote_path = /test_static/
email_sender_address = "notice@mediagoblin.example.org"
email_debug_mode = true
db_name = __mediagoblin_tests__
# tag parsing
-tags_delimiter = ","
tags_max_length = 50
+# So we can start to test attachments:
+allow_attachments = True
+
# Celery shouldn't be set up by the application as it's setup via
# mediagoblin.init.celery.from_celery
celery_setup_elsewhere = true
diff --git a/mediagoblin/tests/test_migrations.py b/mediagoblin/tests/test_migrations.py
index e7cef0a1..8e573f5a 100644
--- a/mediagoblin/tests/test_migrations.py
+++ b/mediagoblin/tests/test_migrations.py
@@ -20,10 +20,10 @@ from pymongo import Connection
from mediagoblin.tests.tools import (
install_fixtures_simple, assert_db_meets_expected)
-from mediagoblin.db.util import (
+from mediagoblin.db.mongo.util import (
RegisterMigration, MigrationManager, ObjectId,
MissingCurrentMigration)
-from mediagoblin.db.migrations import add_table_field
+from mediagoblin.db.mongo.migrations import add_table_field
# This one will get filled with local migrations
TEST_MIGRATION_REGISTRY = {}
diff --git a/mediagoblin/tests/test_misc.py b/mediagoblin/tests/test_misc.py
new file mode 100644
index 00000000..09623355
--- /dev/null
+++ b/mediagoblin/tests/test_misc.py
@@ -0,0 +1,26 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from nose.tools import assert_equal
+
+from mediagoblin.tests.tools import setup_fresh_app
+
+
+@setup_fresh_app
+def test_404_for_non_existent(test_app):
+ assert_equal(test_app.get('/does-not-exist/',
+ expect_errors=True).status_int,
+ 404)
diff --git a/mediagoblin/tests/test_paste.ini b/mediagoblin/tests/test_paste.ini
index e7574b7a..bd57994b 100644
--- a/mediagoblin/tests/test_paste.ini
+++ b/mediagoblin/tests/test_paste.ini
@@ -5,7 +5,7 @@ debug = true
use = egg:Paste#urlmap
/ = mediagoblin
/mgoblin_media/ = publicstore_serve
-/mgoblin_static/ = mediagoblin_static
+/test_static/ = mediagoblin_static
[app:mediagoblin]
use = egg:mediagoblin#app
diff --git a/mediagoblin/tests/test_storage.py b/mediagoblin/tests/test_storage.py
index 46ecb2ec..eab4d032 100644
--- a/mediagoblin/tests/test_storage.py
+++ b/mediagoblin/tests/test_storage.py
@@ -57,6 +57,10 @@ class FakeRemoteStorage(storage.filestorage.BasicFileStorage):
# should force copying to the workbench
local_storage = False
+ def copy_local_to_storage(self, *args, **kwargs):
+ return storage.StorageInterface.copy_local_to_storage(
+ self, *args, **kwargs)
+
def test_storage_system_from_config():
this_storage = storage.storage_system_from_config(
@@ -252,3 +256,26 @@ def test_basic_storage_copy_locally():
this_storage.copy_locally(filepath, new_file_dest)
assert file(new_file_dest).read() == 'Testing this file'
+
+
+def _test_copy_local_to_storage_works(tmpdir, this_storage):
+ local_filename = tempfile.mktemp()
+ with file(local_filename, 'w') as tmpfile:
+ tmpfile.write('haha')
+
+ this_storage.copy_local_to_storage(
+ local_filename, ['dir1', 'dir2', 'copiedto.txt'])
+
+ assert file(
+ os.path.join(tmpdir, 'dir1/dir2/copiedto.txt'),
+ 'r').read() == 'haha'
+
+
+def test_basic_storage_copy_local_to_storage():
+ tmpdir, this_storage = get_tmp_filestorage()
+ _test_copy_local_to_storage_works(tmpdir, this_storage)
+
+
+def test_general_storage_copy_local_to_storage():
+ tmpdir, this_storage = get_tmp_filestorage(fake_remote=True)
+ _test_copy_local_to_storage_works(tmpdir, this_storage)
diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py
index 1c657e6c..b3c11249 100644
--- a/mediagoblin/tests/test_submission.py
+++ b/mediagoblin/tests/test_submission.py
@@ -1,3 +1,4 @@
+
# GNU MediaGoblin -- federated, autonomous media hosting
# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
#
@@ -16,11 +17,12 @@
import urlparse
import pkg_resources
+import re
from nose.tools import assert_equal, assert_true, assert_false
-from mediagoblin.auth import lib as auth_lib
-from mediagoblin.tests.tools import setup_fresh_app, get_test_app
+from mediagoblin.tests.tools import setup_fresh_app, get_test_app, \
+ fixture_add_user
from mediagoblin import mg_globals
from mediagoblin.tools import template, common
@@ -45,21 +47,21 @@ class TestSubmission:
# TODO: Possibly abstract into a decorator like:
# @as_authenticated_user('chris')
- test_user = mg_globals.database.User()
- test_user['username'] = u'chris'
- test_user['email'] = u'chris@example.com'
- test_user['email_verified'] = True
- test_user['status'] = u'active'
- test_user['pw_hash'] = auth_lib.bcrypt_gen_password_hash('toast')
- test_user.save()
+ test_user = fixture_add_user()
self.test_user = test_user
+ self.login()
+
+ def login(self):
self.test_app.post(
'/auth/login/', {
'username': u'chris',
'password': 'toast'})
+ def logout(self):
+ self.test_app.get('/auth/logout/')
+
def test_missing_fields(self):
# Test blank form
# ---------------
@@ -99,6 +101,14 @@ class TestSubmission:
assert template.TEMPLATE_TEST_CONTEXT.has_key(
'mediagoblin/user_pages/user.html')
+ # Make sure the media view is at least reachable, logged in...
+ self.test_app.get('/u/chris/m/normal-upload-1/')
+ # ... and logged out too.
+ self.logout()
+ self.test_app.get('/u/chris/m/normal-upload-1/')
+ # Log back in for the remaining tests.
+ self.login()
+
# Test PNG
# --------
template.clear_test_template_context()
@@ -176,8 +186,8 @@ class TestSubmission:
response = self.test_app.post(
request.urlgen('mediagoblin.user_pages.media_confirm_delete',
# No work: user=media.uploader().username,
- user=self.test_user['username'],
- media=media['_id']),
+ user=self.test_user.username,
+ media=media._id),
# no value means no confirm
{})
@@ -196,8 +206,8 @@ class TestSubmission:
response = self.test_app.post(
request.urlgen('mediagoblin.user_pages.media_confirm_delete',
# No work: user=media.uploader().username,
- user=self.test_user['username'],
- media=media['_id']),
+ user=self.test_user.username,
+ media=media._id),
{'confirm': 'y'})
response.follow()
@@ -208,7 +218,7 @@ class TestSubmission:
# Does media entry still exist?
assert_false(
request.db.MediaEntry.find(
- {'_id': media['_id']}).count())
+ {'_id': media._id}).count())
def test_malicious_uploads(self):
# Test non-suppoerted file with non-supported extension
@@ -222,7 +232,8 @@ class TestSubmission:
context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html']
form = context['submit_form']
- assert form.file.errors == ['The file doesn\'t seem to be an image!']
+ assert re.match(r'^Could not extract any file extension from ".*?"$', str(form.file.errors[0]))
+ assert len(form.file.errors) == 1
# NOTE: The following 2 tests will ultimately fail, but they
# *will* pass the initial form submission step. Instead,
@@ -243,10 +254,10 @@ class TestSubmission:
entry = mg_globals.database.MediaEntry.find_one(
{'title': 'Malicious Upload 2'})
- assert_equal(entry['state'], 'failed')
+ assert_equal(entry.state, 'failed')
assert_equal(
entry['fail_error'],
- u'mediagoblin.process_media.errors:BadMediaFail')
+ u'mediagoblin.processing:BadMediaFail')
# Test non-supported file with .png extension
# -------------------------------------------
@@ -263,7 +274,7 @@ class TestSubmission:
entry = mg_globals.database.MediaEntry.find_one(
{'title': 'Malicious Upload 3'})
- assert_equal(entry['state'], 'failed')
+ assert_equal(entry.state, 'failed')
assert_equal(
entry['fail_error'],
- u'mediagoblin.process_media.errors:BadMediaFail')
+ u'mediagoblin.processing:BadMediaFail')
diff --git a/mediagoblin/tests/test_tags.py b/mediagoblin/tests/test_tags.py
index a05831c9..583c1a55 100644
--- a/mediagoblin/tests/test_tags.py
+++ b/mediagoblin/tests/test_tags.py
@@ -39,11 +39,4 @@ def test_list_of_dicts_conversion(test_app):
# Make sure converting the list of dicts to a string works
assert text.media_tags_as_string([{'name': u'yin', 'slug': u'yin'},
{'name': u'yang', 'slug': u'yang'}]) == \
- u'yin,yang'
-
- # If the tag delimiter is a space then we expect different results
- mg_globals.app_config['tags_delimiter'] = u' '
- assert text.convert_to_tag_list_of_dicts('unicorn ceramic nazi') == [
- {'name': u'unicorn', 'slug': u'unicorn'},
- {'name': u'ceramic', 'slug': u'ceramic'},
- {'name': u'nazi', 'slug': u'nazi'}]
+ u'yin, yang'
diff --git a/mediagoblin/tests/test_tests.py b/mediagoblin/tests/test_tests.py
index bc5f9a8d..25bb52b3 100644
--- a/mediagoblin/tests/test_tests.py
+++ b/mediagoblin/tests/test_tests.py
@@ -27,9 +27,9 @@ def test_get_test_app_wipes_db():
assert mg_globals.database.User.find().count() == 0
new_user = mg_globals.database.User()
- new_user['username'] = u'lolcat'
- new_user['email'] = u'lol@cats.example.org'
- new_user['pw_hash'] = u'pretend_this_is_a_hash'
+ new_user.username = u'lolcat'
+ new_user.email = u'lol@cats.example.org'
+ new_user.pw_hash = u'pretend_this_is_a_hash'
new_user.save()
assert mg_globals.database.User.find().count() == 1
diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py
index cf84da14..49a3d33e 100644
--- a/mediagoblin/tests/tools.py
+++ b/mediagoblin/tests/tools.py
@@ -21,10 +21,13 @@ import os, shutil
from paste.deploy import loadapp
from webtest import TestApp
+from mediagoblin import mg_globals
from mediagoblin.tools import testing
from mediagoblin.init.config import read_mediagoblin_config
from mediagoblin.decorators import _make_safe
from mediagoblin.db.open import setup_connection_and_db_from_config
+from mediagoblin.meddleware import BaseMeddleware
+from mediagoblin.auth.lib import bcrypt_gen_password_hash
MEDIAGOBLIN_TEST_DB_NAME = u'__mediagoblin_tests__'
@@ -49,6 +52,45 @@ $ CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_tests ./bin/nosetests"""
class BadCeleryEnviron(Exception): pass
+class TestingMeddleware(BaseMeddleware):
+ """
+ Meddleware for the Unit tests
+
+ It might make sense to perform some tests on all
+ requests/responses. Or prepare them in a special
+ manner. For example all html responses could be tested
+ for being valid html *after* being rendered.
+
+ This module is getting inserted at the front of the
+ meddleware list, which means: requests are handed here
+ first, responses last. So this wraps up the "normal"
+ app.
+
+ If you need to add a test, either add it directly to
+ the appropiate process_request or process_response, or
+ create a new method and call it from process_*.
+ """
+
+ def process_response(self, request, response):
+ # All following tests should be for html only!
+ if response.content_type != "text/html":
+ # Get out early
+ return
+
+ # If the template contains a reference to
+ # /mgoblin_static/ instead of using
+ # /request.staticdirect(), error out here.
+ # This could probably be implemented as a grep on
+ # the shipped templates easier...
+ if response.text.find("/mgoblin_static/") >= 0:
+ raise AssertionError(
+ "Response HTML contains reference to /mgoblin_static/ "
+ "instead of staticdirect. Request was for: "
+ + request.full_path)
+
+ return
+
+
def suicide_if_bad_celery_environ():
if not os.environ.get('CELERY_CONFIG_MODULE') == \
'mediagoblin.init.celery.from_tests':
@@ -103,6 +145,12 @@ def get_test_app(dump_old_app=True):
test_app = loadapp(
'config:' + TEST_SERVER_CONFIG)
+ # Insert the TestingMeddleware, which can do some
+ # sanity checks on every request/response.
+ # Doing it this way is probably not the cleanest way.
+ # We'll fix it, when we have plugins!
+ mg_globals.app.meddleware.insert(0, TestingMeddleware(mg_globals.app))
+
app = TestApp(test_app)
MGOBLIN_APP = app
@@ -153,3 +201,19 @@ def assert_db_meets_expected(db, expected):
document = collection.find_one({'_id': expected_document['_id']})
assert document is not None # make sure it exists
assert document == expected_document # make sure it matches
+
+
+def fixture_add_user(username = u'chris', password = 'toast',
+ active_user = True):
+ test_user = mg_globals.database.User()
+ test_user.username = username
+ test_user.email = username + u'@example.com'
+ if password is not None:
+ test_user.pw_hash = bcrypt_gen_password_hash(password)
+ if active_user:
+ test_user.email_verified = True
+ test_user.status = u'active'
+
+ test_user.save()
+
+ return test_user
diff --git a/mediagoblin/tools/common.py b/mediagoblin/tools/common.py
index ea4541a8..12d8309e 100644
--- a/mediagoblin/tools/common.py
+++ b/mediagoblin/tools/common.py
@@ -21,6 +21,7 @@ DISPLAY_IMAGE_FETCHING_ORDER = [u'medium', u'original', u'thumb']
global TESTS_ENABLED
TESTS_ENABLED = False
+
def import_component(import_string):
"""
Import a module component defined by STRING. Probably a method,
diff --git a/mediagoblin/tools/files.py b/mediagoblin/tools/files.py
index e0bf0569..10f1d994 100644
--- a/mediagoblin/tools/files.py
+++ b/mediagoblin/tools/files.py
@@ -23,7 +23,7 @@ def delete_media_files(media):
Arguments:
- media: A MediaEntry document
"""
- for listpath in media['media_files'].itervalues():
+ for listpath in media.media_files.itervalues():
mg_globals.public_store.delete_file(
listpath)
diff --git a/mediagoblin/tools/mail.py b/mediagoblin/tools/mail.py
index 826acdbf..9e00be7d 100644
--- a/mediagoblin/tools/mail.py
+++ b/mediagoblin/tools/mail.py
@@ -24,7 +24,7 @@ from mediagoblin.tools import common
### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# We have two "test inboxes" here:
-#
+#
# EMAIL_TEST_INBOX:
# ----------------
# If you're writing test views, you'll probably want to check this.
@@ -44,11 +44,12 @@ from mediagoblin.tools import common
# ***IMPORTANT!***
# ----------------
# Before running tests that call functions which send email, you should
-# always call _clear_test_inboxes() to "wipe" the inboxes clean.
+# always call _clear_test_inboxes() to "wipe" the inboxes clean.
EMAIL_TEST_INBOX = []
EMAIL_TEST_MBOX_INBOX = []
+
class FakeMhost(object):
"""
Just a fake mail host so we can capture and test messages
@@ -63,12 +64,14 @@ class FakeMhost(object):
'to': to_addrs,
'message': message})
+
def _clear_test_inboxes():
global EMAIL_TEST_INBOX
global EMAIL_TEST_MBOX_INBOX
EMAIL_TEST_INBOX = []
EMAIL_TEST_MBOX_INBOX = []
+
### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### </Special email test stuff>
### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/mediagoblin/tools/pagination.py b/mediagoblin/tools/pagination.py
index 3ea96e6d..5ebc3c5a 100644
--- a/mediagoblin/tools/pagination.py
+++ b/mediagoblin/tools/pagination.py
@@ -19,8 +19,10 @@ import copy
from math import ceil, floor
from itertools import izip, count
+
PAGINATION_DEFAULT_PER_PAGE = 30
+
class Pagination(object):
"""
Pagination class for mongodb queries.
@@ -37,9 +39,9 @@ class Pagination(object):
Args:
- page: requested page
- per_page: number of objects per page
- - cursor: db cursor
- - jump_to_id: ObjectId, sets the page to the page containing the object
- with _id == jump_to_id.
+ - cursor: db cursor
+ - jump_to_id: ObjectId, sets the page to the page containing the
+ object with _id == jump_to_id.
"""
self.page = page
self.per_page = per_page
@@ -51,7 +53,7 @@ class Pagination(object):
cursor = copy.copy(self.cursor)
for (doc, increment) in izip(cursor, count(0)):
- if doc['_id'] == jump_to_id:
+ if doc._id == jump_to_id:
self.page = 1 + int(floor(increment / self.per_page))
self.active_id = jump_to_id
@@ -91,19 +93,19 @@ class Pagination(object):
last = num
def get_page_url_explicit(self, base_url, get_params, page_no):
- """
+ """
Get a page url by adding a page= parameter to the base url
- """
+ """
new_get_params = copy.copy(get_params or {})
new_get_params['page'] = page_no
return "%s?%s" % (
base_url, urllib.urlencode(new_get_params))
def get_page_url(self, request, page_no):
- """
+ """
Get a new page url based of the request, and the new page number.
This is a nice wrapper around get_page_url_explicit()
- """
+ """
return self.get_page_url_explicit(
request.full_path, request.GET, page_no)
diff --git a/mediagoblin/tools/request.py b/mediagoblin/tools/request.py
index b1cbe119..7e193125 100644
--- a/mediagoblin/tools/request.py
+++ b/mediagoblin/tools/request.py
@@ -14,7 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from mediagoblin.db.util import ObjectId
+from mediagoblin.db.util import ObjectId, InvalidId
def setup_user_in_request(request):
"""
@@ -25,13 +25,17 @@ def setup_user_in_request(request):
request.user = None
return
- user = None
- user = request.app.db.User.one(
- {'_id': ObjectId(request.session['user_id'])})
+ try:
+ oid = ObjectId(request.session['user_id'])
+ except InvalidId:
+ user = None
+ else:
+ user = request.db.User.one({'_id': oid})
if not user:
# Something's wrong... this user doesn't exist? Invalidate
# this session.
+ print "Killing session for %r" % request.session['user_id']
request.session.invalidate()
request.user = user
diff --git a/mediagoblin/tools/response.py b/mediagoblin/tools/response.py
index 1477b9bc..c905097c 100644
--- a/mediagoblin/tools/response.py
+++ b/mediagoblin/tools/response.py
@@ -17,22 +17,25 @@
from webob import Response, exc
from mediagoblin.tools.template import render_template
+
def render_to_response(request, template, context, status=200):
"""Much like Django's shortcut.render()"""
return Response(
render_template(request, template, context),
status=status)
+
def render_404(request):
"""
Render a 404.
"""
return render_to_response(
- request, 'mediagoblin/404.html', {}, status=400)
+ request, 'mediagoblin/404.html', {}, status=404)
+
def redirect(request, *args, **kwargs):
"""Returns a HTTPFound(), takes a request and then urlgen params"""
-
+
querystring = None
if kwargs.get('querystring'):
querystring = kwargs.get('querystring')
diff --git a/mediagoblin/tools/template.py b/mediagoblin/tools/template.py
index a773ca99..54a40de6 100644
--- a/mediagoblin/tools/template.py
+++ b/mediagoblin/tools/template.py
@@ -17,18 +17,19 @@
from math import ceil
import jinja2
from babel.localedata import exists
-from babel.support import LazyProxy
from mediagoblin import mg_globals
from mediagoblin import messages
from mediagoblin.tools import common
from mediagoblin.tools.translate import setup_gettext
-from mediagoblin.middleware.csrf import render_csrf_form_token
+from mediagoblin.meddleware.csrf import render_csrf_form_token
+
SETUP_JINJA_ENVS = {}
+
def get_jinja_env(template_loader, locale):
"""
- Set up the Jinja environment,
+ Set up the Jinja environment,
(In the future we may have another system for providing theming;
for now this is good enough.)
@@ -40,8 +41,11 @@ def get_jinja_env(template_loader, locale):
if SETUP_JINJA_ENVS.has_key(locale):
return SETUP_JINJA_ENVS[locale]
+ # jinja2.StrictUndefined will give exceptions on references
+ # to undefined/unknown variables in templates.
template_env = jinja2.Environment(
loader=template_loader, autoescape=True,
+ undefined=jinja2.StrictUndefined,
extensions=['jinja2.ext.i18n', 'jinja2.ext.autoescape'])
template_env.install_gettext_callables(
@@ -51,15 +55,19 @@ def get_jinja_env(template_loader, locale):
# All templates will know how to ...
# ... fetch all waiting messages and remove them from the queue
# ... construct a grid of thumbnails or other media
+ # ... have access to the global and app config
template_env.globals['fetch_messages'] = messages.fetch_messages
template_env.globals['gridify_list'] = gridify_list
template_env.globals['gridify_cursor'] = gridify_cursor
+ template_env.globals['app_config'] = mg_globals.app_config
+ template_env.globals['global_config'] = mg_globals.global_config
if exists(locale):
SETUP_JINJA_ENVS[locale] = template_env
return template_env
+
# We'll store context information here when doing unit tests
TEMPLATE_TEST_CONTEXT = {}
@@ -74,10 +82,12 @@ def render_template(request, template_path, context):
template = request.template_env.get_template(
template_path)
context['request'] = request
- context['csrf_token'] = render_csrf_form_token(request)
+ rendered_csrf_token = render_csrf_form_token(request)
+ if rendered_csrf_token is not None:
+ context['csrf_token'] = render_csrf_form_token(request)
rendered = template.render(context)
-
- if common.TESTS_ENABLED:
+
+ if common.TESTS_ENABLED:
TEMPLATE_TEST_CONTEXT[template_path] = context
return rendered
@@ -87,6 +97,7 @@ def clear_test_template_context():
global TEMPLATE_TEST_CONTEXT
TEMPLATE_TEST_CONTEXT = {}
+
def gridify_list(this_list, num_cols=5):
"""
Generates a list of lists where each sub-list's length depends on
diff --git a/mediagoblin/tools/text.py b/mediagoblin/tools/text.py
index de4bb281..d576224d 100644
--- a/mediagoblin/tools/text.py
+++ b/mediagoblin/tools/text.py
@@ -21,6 +21,7 @@ from lxml.html.clean import Cleaner
from mediagoblin import mg_globals
from mediagoblin.tools import url
+
# A super strict version of the lxml.html cleaner class
HTML_CLEANER = Cleaner(
scripts=True,
@@ -42,6 +43,8 @@ HTML_CLEANER = Cleaner(
host_whitelist=(),
whitelist_tags=set([]))
+TAGS_DELIMITER=',';
+
def clean_html(html):
# clean_html barfs on an empty string
if not html:
@@ -49,6 +52,7 @@ def clean_html(html):
return HTML_CLEANER.clean_html(html)
+
def convert_to_tag_list_of_dicts(tag_string):
"""
Filter input from incoming string containing user tags,
@@ -64,7 +68,7 @@ def convert_to_tag_list_of_dicts(tag_string):
# Split the tag string into a list of tags
for tag in stripped_tag_string.split(
- mg_globals.app_config['tags_delimiter']):
+ TAGS_DELIMITER):
# Ignore empty or duplicate tags
if tag.strip() and tag.strip() not in [t['name'] for t in taglist]:
@@ -73,6 +77,7 @@ def convert_to_tag_list_of_dicts(tag_string):
'slug': url.slugify(tag.strip())})
return taglist
+
def media_tags_as_string(media_entry_tags):
"""
Generate a string from a media item's tags, stored as a list of dicts
@@ -81,13 +86,15 @@ def media_tags_as_string(media_entry_tags):
"""
media_tag_string = ''
if media_entry_tags:
- media_tag_string = mg_globals.app_config['tags_delimiter'].join(
+ media_tag_string = (TAGS_DELIMITER+u' ').join(
[tag['name'] for tag in media_entry_tags])
return media_tag_string
+
TOO_LONG_TAG_WARNING = \
u'Tags must be shorter than %s characters. Tags that are too long: %s'
+
def tag_length_validator(form, field):
"""
Make sure tags do not exceed the maximum tag length.
@@ -105,6 +112,7 @@ def tag_length_validator(form, field):
MARKDOWN_INSTANCE = markdown.Markdown(safe_mode='escape')
+
def cleaned_markdown_conversion(text):
"""
Take a block of text, run it through MarkDown, and clean its HTML.
diff --git a/mediagoblin/tools/url.py b/mediagoblin/tools/url.py
index 458ef2c8..78b5dd63 100644
--- a/mediagoblin/tools/url.py
+++ b/mediagoblin/tools/url.py
@@ -17,8 +17,10 @@
import re
import translitcodec
+
_punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+')
+
def slugify(text, delim=u'-'):
"""
Generates an ASCII-only slug. Taken from http://flask.pocoo.org/snippets/5/
diff --git a/mediagoblin/user_pages/__init__.py b/mediagoblin/user_pages/__init__.py
index 576bd0f5..ba347c69 100644
--- a/mediagoblin/user_pages/__init__.py
+++ b/mediagoblin/user_pages/__init__.py
@@ -13,5 +13,3 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
diff --git a/mediagoblin/user_pages/forms.py b/mediagoblin/user_pages/forms.py
index 301f1f0a..e04fd559 100644
--- a/mediagoblin/user_pages/forms.py
+++ b/mediagoblin/user_pages/forms.py
@@ -21,7 +21,7 @@ from mediagoblin.tools.translate import fake_ugettext_passthrough as _
class MediaCommentForm(wtforms.Form):
comment_content = wtforms.TextAreaField(
- _('Comment'),
+ _(''),
[wtforms.validators.Required()])
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py
index 484c1e28..a234722f 100644
--- a/mediagoblin/user_pages/views.py
+++ b/mediagoblin/user_pages/views.py
@@ -30,6 +30,8 @@ from mediagoblin.decorators import (uses_pagination, get_user_media_entry,
from werkzeug.contrib.atom import AtomFeed
+from mediagoblin.media_types import get_media_manager
+
@uses_pagination
def user_home(request, page):
@@ -38,14 +40,14 @@ def user_home(request, page):
'username': request.matchdict['user']})
if not user:
return render_404(request)
- elif user['status'] != u'active':
+ elif user.status != u'active':
return render_to_response(
request,
'mediagoblin/user_pages/user.html',
{'user': user})
cursor = request.db.MediaEntry.find(
- {'uploader': user['_id'],
+ {'uploader': user._id,
'state': 'processed'}).sort('created', DESCENDING)
pagination = Pagination(page, cursor)
@@ -54,10 +56,10 @@ def user_home(request, page):
#if no data is available, return NotFound
if media_entries == None:
return render_404(request)
-
+
user_gallery_url = request.urlgen(
'mediagoblin.user_pages.user_gallery',
- user=user['username'])
+ user=user.username)
return render_to_response(
request,
@@ -67,6 +69,7 @@ def user_home(request, page):
'media_entries': media_entries,
'pagination': pagination})
+
@uses_pagination
def user_gallery(request, page):
"""'Gallery' of a User()"""
@@ -77,7 +80,7 @@ def user_gallery(request, page):
return render_404(request)
cursor = request.db.MediaEntry.find(
- {'uploader': user['_id'],
+ {'uploader': user._id,
'state': 'processed'}).sort('created', DESCENDING)
pagination = Pagination(page, cursor)
@@ -86,7 +89,7 @@ def user_gallery(request, page):
#if no data is available, return NotFound
if media_entries == None:
return render_404(request)
-
+
return render_to_response(
request,
'mediagoblin/user_pages/gallery.html',
@@ -96,6 +99,7 @@ def user_gallery(request, page):
MEDIA_COMMENTS_PER_PAGE = 50
+
@get_user_media_entry
@uses_pagination
def media_home(request, media, page, **kwargs):
@@ -104,19 +108,25 @@ def media_home(request, media, page, **kwargs):
"""
if ObjectId(request.matchdict.get('comment')):
pagination = Pagination(
- page, media.get_comments(), MEDIA_COMMENTS_PER_PAGE,
+ page, media.get_comments(
+ mg_globals.app_config['comments_ascending']),
+ MEDIA_COMMENTS_PER_PAGE,
ObjectId(request.matchdict.get('comment')))
else:
pagination = Pagination(
- page, media.get_comments(), MEDIA_COMMENTS_PER_PAGE)
+ page, media.get_comments(
+ mg_globals.app_config['comments_ascending']),
+ MEDIA_COMMENTS_PER_PAGE)
comments = pagination()
comment_form = user_forms.MediaCommentForm(request.POST)
+ media_template_name = get_media_manager(media.media_type)['display_template']
+
return render_to_response(
request,
- 'mediagoblin/user_pages/media.html',
+ media_template_name,
{'media': media,
'comments': comments,
'pagination': pagination,
@@ -133,8 +143,8 @@ def media_post_comment(request, media):
assert request.method == 'POST'
comment = request.db.MediaComment()
- comment['media_entry'] = media['_id']
- comment['author'] = request.user['_id']
+ comment['media_entry'] = media._id
+ comment['author'] = request.user._id
comment['content'] = unicode(request.POST['comment_content'])
comment['content_html'] = cleaned_markdown_conversion(comment['content'])
@@ -142,13 +152,13 @@ def media_post_comment(request, media):
messages.add_message(
request,
messages.ERROR,
- _("Empty comments are not allowed."))
+ _("Oops, your comment was empty."))
else:
comment.save()
messages.add_message(
request, messages.SUCCESS,
- _('Comment posted!'))
+ _('Your comment has been posted!'))
return exc.HTTPFound(
location=media.url_for_self(request.urlgen))
@@ -163,21 +173,26 @@ def media_confirm_delete(request, media):
if request.method == 'POST' and form.validate():
if form.confirm.data is True:
- username = media.uploader()['username']
+ username = media.get_uploader.username
# Delete all files on the public storage
delete_media_files(media)
media.delete()
+ messages.add_message(
+ request, messages.SUCCESS, _('You deleted the media.'))
return redirect(request, "mediagoblin.user_pages.user_home",
user=username)
else:
+ messages.add_message(
+ request, messages.ERROR,
+ _("The media was not deleted because you didn't check that you were sure."))
return exc.HTTPFound(
location=media.url_for_self(request.urlgen))
- if ((request.user[u'is_admin'] and
- request.user[u'_id'] != media.uploader()[u'_id'])):
+ if ((request.user.is_admin and
+ request.user._id != media.uploader)):
messages.add_message(
request, messages.WARNING,
_("You are about to delete another user's media. "
@@ -192,6 +207,7 @@ def media_confirm_delete(request, media):
ATOM_DEFAULT_NR_OF_UPDATED_ITEMS = 15
+
def atom_feed(request):
"""
generates the atom feed with the newest images
@@ -204,22 +220,42 @@ def atom_feed(request):
return render_404(request)
cursor = request.db.MediaEntry.find({
- 'uploader': user['_id'],
+ 'uploader': user._id,
'state': 'processed'}) \
.sort('created', DESCENDING) \
.limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS)
- feed = AtomFeed(request.matchdict['user'],
+ """
+ ATOM feed id is a tag URI (see http://en.wikipedia.org/wiki/Tag_URI)
+ """
+ feed = AtomFeed(
+ "MediaGoblin: Feed for user '%s'" % request.matchdict['user'],
feed_url=request.url,
- url=request.host_url)
-
+ id='tag:'+request.host+',2011:gallery.user-'+request.matchdict['user'],
+ links=[{
+ 'href': request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ qualified=True,user=request.matchdict['user']),
+ 'rel': 'alternate',
+ 'type': 'text/html'}])
+
for entry in cursor:
feed.add(entry.get('title'),
entry.get('description_html'),
+ id=entry.url_for_self(request.urlgen,qualified=True),
content_type='html',
- author=request.matchdict['user'],
+ author={
+ 'name': entry.get_uploader.username,
+ 'uri': request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ qualified=True, user=entry.get_uploader.username)},
updated=entry.get('created'),
- url=entry.url_for_self(request.urlgen))
+ links=[{
+ 'href': entry.url_for_self(
+ request.urlgen,
+ qualified=True),
+ 'rel': 'alternate',
+ 'type': 'text/html'}])
return feed.get_response()
@@ -238,7 +274,7 @@ def processing_panel(request):
# Make sure the user exists and is active
if not user:
return render_404(request)
- elif user['status'] != u'active':
+ elif user.status != u'active':
return render_to_response(
request,
'mediagoblin/user_pages/user.html',
@@ -248,7 +284,7 @@ def processing_panel(request):
#
# Make sure we have permission to access this user's panel. Only
# admins and this user herself should be able to do so.
- if not (user[u'_id'] == request.user[u'_id']
+ if not (user._id == request.user._id
or request.user.is_admin):
# No? Let's simply redirect to this user's homepage then.
return redirect(
@@ -257,12 +293,12 @@ def processing_panel(request):
# Get media entries which are in-processing
processing_entries = request.db.MediaEntry.find(
- {'uploader': user['_id'],
+ {'uploader': user._id,
'state': 'processing'}).sort('created', DESCENDING)
# Get media entries which have failed to process
failed_entries = request.db.MediaEntry.find(
- {'uploader': user['_id'],
+ {'uploader': user._id,
'state': 'failed'}).sort('created', DESCENDING)
# Render to response
diff --git a/mediagoblin/views.py b/mediagoblin/views.py
index 22f9268d..1e1db6c3 100644
--- a/mediagoblin/views.py
+++ b/mediagoblin/views.py
@@ -20,6 +20,8 @@ from mediagoblin.tools.response import render_to_response
from mediagoblin.db.util import DESCENDING
from mediagoblin.decorators import uses_pagination
+
+
@uses_pagination
def root_view(request, page):
cursor = request.db.MediaEntry.find(
@@ -27,7 +29,6 @@ def root_view(request, page):
pagination = Pagination(page, cursor)
media_entries = pagination()
-
return render_to_response(
request, 'mediagoblin/root.html',
{'media_entries': media_entries,
diff --git a/mediagoblin/webfinger/__init__.py b/mediagoblin/webfinger/__init__.py
new file mode 100644
index 00000000..ec7ec884
--- /dev/null
+++ b/mediagoblin/webfinger/__init__.py
@@ -0,0 +1,25 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+'''
+mediagoblin.webfinger_ provides an LRDD discovery service and
+a web host meta information file
+
+Links:
+- `LRDD Discovery Draft
+ <http://tools.ietf.org/html/draft-hammer-discovery-06>`_.
+- `RFC 6415 - Web Host Metadata
+ <http://tools.ietf.org/html/rfc6415>`_.
+'''
diff --git a/mediagoblin/webfinger/routing.py b/mediagoblin/webfinger/routing.py
new file mode 100644
index 00000000..effb2bf2
--- /dev/null
+++ b/mediagoblin/webfinger/routing.py
@@ -0,0 +1,25 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from routes.route import Route
+
+webfinger_well_known_routes = [
+ Route('mediagoblin.webfinger.host_meta', '/host-meta',
+ controller='mediagoblin.webfinger.views:host_meta')]
+
+webfinger_routes = [
+ Route('mediagoblin.webfinger.xrd', '/xrd',
+ controller='mediagoblin.webfinger.views:xrd')]
diff --git a/mediagoblin/webfinger/views.py b/mediagoblin/webfinger/views.py
new file mode 100644
index 00000000..22086396
--- /dev/null
+++ b/mediagoblin/webfinger/views.py
@@ -0,0 +1,117 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+'''
+For references, see docstring in mediagoblin/webfinger/__init__.py
+'''
+
+import re
+
+from urlparse import urlparse
+
+from mediagoblin.tools.response import render_to_response, render_404
+
+def host_meta(request):
+ '''
+ Webfinger host-meta
+ '''
+
+ placeholder = 'MG_LRDD_PLACEHOLDER'
+
+ lrdd_title = 'GNU MediaGoblin - User lookup'
+
+ lrdd_template = request.urlgen(
+ 'mediagoblin.webfinger.xrd',
+ uri=placeholder,
+ qualified=True)
+
+ return render_to_response(
+ request,
+ 'mediagoblin/webfinger/host-meta.xml',
+ {'request': request,
+ 'lrdd_template': lrdd_template,
+ 'lrdd_title': lrdd_title,
+ 'placeholder': placeholder})
+
+MATCH_SCHEME_PATTERN = re.compile(r'^acct:')
+
+def xrd(request):
+ '''
+ Find user data based on a webfinger URI
+ '''
+ param_uri = request.GET.get('uri')
+
+ if not param_uri:
+ return render_404(request)
+
+ '''
+ :py:module:`urlparse` does not recognize usernames in URIs of the
+ form ``acct:user@example.org`` or ``user@example.org``.
+ '''
+ if not MATCH_SCHEME_PATTERN.search(param_uri):
+ # Assume the URI is in the form ``user@example.org``
+ uri = 'acct://' + param_uri
+ else:
+ # Assumes the URI looks like ``acct:user@example.org
+ uri = MATCH_SCHEME_PATTERN.sub(
+ 'acct://', param_uri)
+
+ parsed = urlparse(uri)
+
+ xrd_subject = param_uri
+
+ # TODO: Verify that the user exists
+ # Q: Does webfinger support error handling in this case?
+ # Returning 404 seems intuitive, need to check.
+ if parsed.username:
+ # The user object
+ # TODO: Fetch from database instead of using the MockUser
+ user = MockUser()
+ user.username = parsed.username
+
+ xrd_links = [
+ {'attrs': {
+ 'rel': 'http://microformats.org/profile/hcard',
+ 'href': request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=user.username,
+ qualified=True)}},
+ {'attrs': {
+ 'rel': 'http://schemas.google.com/g/2010#updates-from',
+ 'href': request.urlgen(
+ 'mediagoblin.user_pages.atom_feed',
+ user=user.username,
+ qualified=True)}}]
+
+ xrd_alias = request.urlgen(
+ 'mediagoblin.user_pages.user_home',
+ user=user.username,
+ qualified=True)
+
+ return render_to_response(
+ request,
+ 'mediagoblin/webfinger/xrd.xml',
+ {'request': request,
+ 'subject': xrd_subject,
+ 'alias': xrd_alias,
+ 'links': xrd_links })
+ else:
+ return render_404(request)
+
+class MockUser(object):
+ '''
+ TEMPORARY user object
+ '''
+ username = None
diff --git a/mediagoblin/workbench.py b/mediagoblin/workbench.py
index 722f8e27..9578494c 100644
--- a/mediagoblin/workbench.py
+++ b/mediagoblin/workbench.py
@@ -42,10 +42,15 @@ class Workbench(object):
def __unicode__(self):
return unicode(self.dir)
+
def __str__(self):
return str(self.dir)
+
def __repr__(self):
- return repr(self.dir)
+ try:
+ return str(self)
+ except AttributeError:
+ return 'None'
def joinpath(self, *args):
return os.path.join(self.dir, *args)
@@ -140,7 +145,7 @@ class WorkbenchManager(object):
self.base_workbench_dir = os.path.abspath(base_workbench_dir)
if not os.path.exists(self.base_workbench_dir):
os.makedirs(self.base_workbench_dir)
-
+
def create_workbench(self):
"""
Create and return the path to a new workbench (directory).