aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AUTHORS2
-rw-r--r--extlib/960.gs/MIT.txt20
-rw-r--r--extlib/lato/Lato-Bold.ttfbin0 -> 93224 bytes
-rw-r--r--extlib/lato/Lato-BoldItalic.ttfbin0 -> 81936 bytes
-rw-r--r--extlib/lato/Lato-Italic.ttfbin0 -> 83680 bytes
-rw-r--r--extlib/lato/Lato-Regular.ttfbin0 -> 96044 bytes
-rw-r--r--extlib/lato/OFL_1.1.txt97
-rw-r--r--mediagoblin/app.py5
-rw-r--r--mediagoblin/auth/forms.py44
-rw-r--r--mediagoblin/auth/lib.py40
-rw-r--r--mediagoblin/auth/routing.py12
-rw-r--r--mediagoblin/auth/views.py133
-rw-r--r--mediagoblin/config_spec.ini8
-rw-r--r--mediagoblin/db/migrations.py15
-rw-r--r--mediagoblin/db/models.py2
-rw-r--r--mediagoblin/edit/forms.py11
-rw-r--r--mediagoblin/edit/views.py20
-rw-r--r--mediagoblin/gmg_commands/import_export.py92
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mobin9432 -> 11461 bytes
-rw-r--r--mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po221
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mobin9038 -> 10827 bytes
-rw-r--r--mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po179
-rw-r--r--mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po152
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mobin8775 -> 10686 bytes
-rw-r--r--mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po217
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mobin9157 -> 11175 bytes
-rw-r--r--mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po243
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mobin9083 -> 11144 bytes
-rw-r--r--mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po234
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mobin0 -> 10898 bytes
-rw-r--r--mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po520
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mobin9308 -> 11096 bytes
-rw-r--r--mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po156
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mobin8779 -> 10567 bytes
-rw-r--r--mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po156
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mobin8385 -> 10173 bytes
-rw-r--r--mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po156
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mobin8732 -> 10520 bytes
-rw-r--r--mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po156
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mobin9081 -> 10905 bytes
-rw-r--r--mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po222
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mobin11171 -> 13546 bytes
-rw-r--r--mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po196
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mobin8848 -> 10636 bytes
-rw-r--r--mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po156
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mobin8711 -> 10499 bytes
-rw-r--r--mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po154
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mobin8972 -> 10748 bytes
-rw-r--r--mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po166
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mobin8541 -> 10375 bytes
-rw-r--r--mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po193
-rw-r--r--mediagoblin/init/__init__.py16
-rw-r--r--mediagoblin/mg_globals.py3
-rw-r--r--mediagoblin/process_media/__init__.py19
-rw-r--r--mediagoblin/static/css/base.css28
l---------mediagoblin/static/fonts/Lato-Bold.ttf1
l---------mediagoblin/static/fonts/Lato-BoldItalic.ttf1
l---------mediagoblin/static/fonts/Lato-Italic.ttf1
l---------mediagoblin/static/fonts/Lato-Regular.ttf1
-rw-r--r--mediagoblin/storage.py541
-rw-r--r--mediagoblin/storage/__init__.py240
-rw-r--r--mediagoblin/storage/cloudfiles.py156
-rw-r--r--mediagoblin/storage/filestorage.py78
-rw-r--r--mediagoblin/storage/mountstorage.py156
-rw-r--r--mediagoblin/submit/forms.py3
-rw-r--r--mediagoblin/templates/mediagoblin/auth/change_fp.html37
-rw-r--r--mediagoblin/templates/mediagoblin/auth/forgot_password.html37
-rw-r--r--mediagoblin/templates/mediagoblin/auth/fp_changed_success.html (renamed from mediagoblin/templates/mediagoblin/auth/resent_verification_email.html)7
-rw-r--r--mediagoblin/templates/mediagoblin/auth/fp_email_sent.html28
-rw-r--r--mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt30
-rw-r--r--mediagoblin/templates/mediagoblin/auth/login.html6
-rw-r--r--mediagoblin/templates/mediagoblin/root.html13
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html24
-rw-r--r--mediagoblin/templates/mediagoblin/utils/pagination.html17
-rw-r--r--mediagoblin/templates/mediagoblin/utils/prev_next.html8
-rw-r--r--mediagoblin/tests/test_auth.py88
-rw-r--r--mediagoblin/tests/test_cache.py52
-rw-r--r--mediagoblin/tests/test_mgoblin_app.ini4
-rw-r--r--mediagoblin/tests/test_storage.py6
-rw-r--r--mediagoblin/tests/test_submission.py5
-rw-r--r--mediagoblin/user_pages/forms.py6
-rw-r--r--mediagoblin/user_pages/views.py7
-rw-r--r--mediagoblin/util.py2
83 files changed, 4062 insertions, 1537 deletions
diff --git a/AUTHORS b/AUTHORS
index 9653a332..c9fc5c8e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -24,11 +24,13 @@ Thank you!
* Karen Rustad
* Mark Holmquist
* Matt Lee
+* Nathan Yergler
* Odin Hørthe Omdal
* Osama Khalid
* Rasmus Larsson
* Sam Kleinman
* Sebastian Spaeth
+* Shawn Khan
* Will Kahn-Greene
If you think your name should be on this list, let us know!
diff --git a/extlib/960.gs/MIT.txt b/extlib/960.gs/MIT.txt
new file mode 100644
index 00000000..5a2aeb47
--- /dev/null
+++ b/extlib/960.gs/MIT.txt
@@ -0,0 +1,20 @@
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/extlib/lato/Lato-Bold.ttf b/extlib/lato/Lato-Bold.ttf
new file mode 100644
index 00000000..bc3529fc
--- /dev/null
+++ b/extlib/lato/Lato-Bold.ttf
Binary files differ
diff --git a/extlib/lato/Lato-BoldItalic.ttf b/extlib/lato/Lato-BoldItalic.ttf
new file mode 100644
index 00000000..2cf5ae0d
--- /dev/null
+++ b/extlib/lato/Lato-BoldItalic.ttf
Binary files differ
diff --git a/extlib/lato/Lato-Italic.ttf b/extlib/lato/Lato-Italic.ttf
new file mode 100644
index 00000000..11ca3eb6
--- /dev/null
+++ b/extlib/lato/Lato-Italic.ttf
Binary files differ
diff --git a/extlib/lato/Lato-Regular.ttf b/extlib/lato/Lato-Regular.ttf
new file mode 100644
index 00000000..26ce1002
--- /dev/null
+++ b/extlib/lato/Lato-Regular.ttf
Binary files differ
diff --git a/extlib/lato/OFL_1.1.txt b/extlib/lato/OFL_1.1.txt
new file mode 100644
index 00000000..f1a20ac1
--- /dev/null
+++ b/extlib/lato/OFL_1.1.txt
@@ -0,0 +1,97 @@
+Copyright (c) <dates>, <Copyright Holder> (<URL|email>),
+with Reserved Font Name <Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>),
+with Reserved Font Name <additional Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>).
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/mediagoblin/app.py b/mediagoblin/app.py
index 45b5e3ce..dd5f0b89 100644
--- a/mediagoblin/app.py
+++ b/mediagoblin/app.py
@@ -25,7 +25,7 @@ from mediagoblin.mg_globals import setup_globals
from mediagoblin.init.celery import setup_celery_from_config
from mediagoblin.init import (get_jinja_loader, get_staticdirector,
setup_global_and_app_config, setup_workbench, setup_database,
- setup_storage)
+ setup_storage, setup_beaker_cache)
class MediaGoblinApp(object):
@@ -71,6 +71,9 @@ class MediaGoblinApp(object):
# set up staticdirector tool
self.staticdirector = get_staticdirector(app_config)
+ # set up caching
+ self.cache = setup_beaker_cache()
+
# Setup celery, if appropriate
if setup_celery and not app_config.get('celery_setup_elsewhere'):
if os.environ.get('CELERY_ALWAYS_EAGER'):
diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py
index daf7b993..6339b4a3 100644
--- a/mediagoblin/auth/forms.py
+++ b/mediagoblin/auth/forms.py
@@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import wtforms
+import re
from mediagoblin.util import fake_ugettext_passthrough as _
@@ -24,18 +25,14 @@ class RegistrationForm(wtforms.Form):
_('Username'),
[wtforms.validators.Required(),
wtforms.validators.Length(min=3, max=30),
- wtforms.validators.Regexp(r'^\w+$')],
- description=_(
- u"This is the name other users will identify you with."))
+ wtforms.validators.Regexp(r'^\w+$')])
password = wtforms.PasswordField(
_('Password'),
[wtforms.validators.Required(),
wtforms.validators.Length(min=6, max=30),
wtforms.validators.EqualTo(
'confirm_password',
- _('Passwords must match.'))],
- description=_(
- u"Try to use a strong password!"))
+ _('Passwords must match.'))])
confirm_password = wtforms.PasswordField(
_('Confirm password'),
[wtforms.validators.Required()],
@@ -44,9 +41,7 @@ class RegistrationForm(wtforms.Form):
email = wtforms.TextField(
_('Email address'),
[wtforms.validators.Required(),
- wtforms.validators.Email()],
- description=_(
- u"Your email will never be published."))
+ wtforms.validators.Email()])
class LoginForm(wtforms.Form):
@@ -57,3 +52,34 @@ class LoginForm(wtforms.Form):
password = wtforms.PasswordField(
_('Password'),
[wtforms.validators.Required()])
+
+
+class ForgotPassForm(wtforms.Form):
+ username = wtforms.TextField(
+ '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)):
+ raise wtforms.ValidationError(u'Incorrect input')
+
+
+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()])
+ 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 89cfb6ff..d7d351a5 100644
--- a/mediagoblin/auth/lib.py
+++ b/mediagoblin/auth/lib.py
@@ -47,7 +47,7 @@ def bcrypt_check_password(raw_pass, stored_hash, extra_salt=None):
# number (thx to zooko on this advice, which I hopefully
# incorporated right.)
#
- # See also:
+ # See also:
rand_salt = bcrypt.gensalt(5)
randplus_stored_hash = bcrypt.hashpw(stored_hash, rand_salt)
randplus_hashed_pass = bcrypt.hashpw(hashed_pass, rand_salt)
@@ -99,7 +99,7 @@ def send_verification_email(user, request):
Args:
- user: a user object
- - request: the request
+ - request: the request
"""
rendered_email = render_template(
request, 'mediagoblin/auth/verification_email.txt',
@@ -116,8 +116,38 @@ def send_verification_email(user, request):
[user['email']],
# TODO
# Due to the distributed nature of GNU MediaGoblin, we should
- # find a way to send some additional information about the
- # specific GNU MediaGoblin instance in the subject line. For
- # example "GNU MediaGoblin @ Wandborg - [...]".
+ # find a way to send some additional information about the
+ # specific GNU MediaGoblin instance in the subject line. For
+ # example "GNU MediaGoblin @ Wandborg - [...]".
'GNU MediaGoblin - Verify your email!',
rendered_email)
+
+
+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.
+
+ Args:
+ - user: a user object
+ - request: the request
+ """
+ rendered_email = render_template(
+ request, 'mediagoblin/auth/fp_verification_email.txt',
+ {'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'])})
+
+ # TODO: There is no error handling in place
+ send_email(
+ mg_globals.app_config['email_sender_address'],
+ [user['email']],
+ 'GNU MediaGoblin - Change forgotten password!',
+ rendered_email)
+
diff --git a/mediagoblin/auth/routing.py b/mediagoblin/auth/routing.py
index 76c7ceed..912d89fa 100644
--- a/mediagoblin/auth/routing.py
+++ b/mediagoblin/auth/routing.py
@@ -30,4 +30,16 @@ auth_routes = [
Route('mediagoblin.auth.resend_verification_success',
'/resend_verification_success/',
template='mediagoblin/auth/resent_verification_email.html',
+ 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')]
diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py
index 1b942280..f67f0588 100644
--- a/mediagoblin/auth/views.py
+++ b/mediagoblin/auth/views.py
@@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import uuid
+import datetime
from webob import exc
@@ -22,10 +23,11 @@ from mediagoblin import messages
from mediagoblin import mg_globals
from mediagoblin.util import render_to_response, redirect, render_404
from mediagoblin.util import pass_to_ugettext as _
-from mediagoblin.db.util import ObjectId
+from mediagoblin.db.util import ObjectId, InvalidId
from mediagoblin.auth import lib as auth_lib
from mediagoblin.auth import forms as auth_forms
-from mediagoblin.auth.lib import send_verification_email
+from mediagoblin.auth.lib import send_verification_email, \
+ send_fp_verification_email
def register(request):
@@ -151,9 +153,12 @@ def verify_email(request):
{'_id': ObjectId(unicode(request.GET['userid']))})
if user and user['verification_key'] == unicode(request.GET['token']):
- user['status'] = u'active'
- user['email_verified'] = True
+ user[u'status'] = u'active'
+ user[u'email_verified'] = True
+ user[u'verification_key'] = None
+
user.save()
+
messages.add_message(
request,
messages.SUCCESS,
@@ -176,7 +181,7 @@ def resend_activation(request):
Resend the activation email.
"""
- request.user['verification_key'] = unicode(uuid.uuid4())
+ request.user[u'verification_key'] = unicode(uuid.uuid4())
request.user.save()
send_verification_email(request.user, request)
@@ -188,3 +193,121 @@ def resend_activation(request):
return redirect(
request, 'mediagoblin.user_pages.user_home',
user=request.user['username'])
+
+
+def forgot_password(request):
+ """
+ Forgot password view
+
+ Sends an email whit an url to renew forgoten password
+ """
+ fp_form = auth_forms.ForgotPassForm(request.POST)
+
+ if request.method == 'POST' and fp_form.validate():
+ # '$or' not available till mongodb 1.5.3
+ user = request.db.User.find_one(
+ {'username': request.POST['username']})
+ if not user:
+ user = request.db.User.find_one(
+ {'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() + \
+ datetime.timedelta(days=10)
+ user.save()
+
+ send_fp_verification_email(user, request)
+ else:
+ # special case... we can't send the email because the
+ # username is inactive / hasn't verified their email
+ messages.add_message(
+ request,
+ messages.WARNING,
+ _("Could not send password recovery email as "
+ "your username is inactive or your account's "
+ "email address has not been verified."))
+
+ 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')
+
+ return render_to_response(
+ request,
+ 'mediagoblin/auth/forgot_password.html',
+ {'fp_form': fp_form})
+
+
+def verify_forgot_password(request):
+ """
+ Check the forgot-password verification and possibly let the user
+ change their password because of it.
+ """
+ # get form data variables, and specifically check for presence of token
+ formdata = _process_for_token(request)
+ if not formdata['has_userid_and_token']:
+ return render_404(request)
+
+ formdata_token = formdata['vars']['token']
+ formdata_userid = formdata['vars']['userid']
+ formdata_vars = formdata['vars']
+
+ # check if it's a valid Id
+ try:
+ user = request.db.User.find_one(
+ {'_id': ObjectId(unicode(formdata_userid))})
+ except InvalidId:
+ 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')):
+
+ 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(
+ request.POST['password'])
+ user[u'fp_verification_key'] = None
+ user[u'fp_token_expire'] = None
+ user.save()
+
+ return redirect(request, 'mediagoblin.auth.fp_changed_success')
+ else:
+ return render_to_response(
+ request,
+ 'mediagoblin/auth/change_fp.html',
+ {'cp_form': cp_form})
+
+ # in case there is a valid id but no user whit that id in the db
+ # or the token expired
+ else:
+ return render_404(request)
+
+
+def _process_for_token(request):
+ """
+ Checks for tokens in formdata without prior knowledge of request method
+
+ For now, returns whether the userid and token formdata variables exist, and
+ the formdata variables in a hash. Perhaps an object is warranted?
+ """
+ # retrieve the formdata variables
+ if request.method == 'GET':
+ formdata_vars = request.GET
+ else:
+ formdata_vars = request.POST
+
+ formdata = {
+ 'vars': formdata_vars,
+ 'has_userid_and_token':
+ formdata_vars.has_key('userid') and formdata_vars.has_key('token')}
+
+ return formdata
diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini
index 8018b243..37fe7130 100644
--- a/mediagoblin/config_spec.ini
+++ b/mediagoblin/config_spec.ini
@@ -46,13 +46,21 @@ secret_key = string(default="Something Super Duper Secrit!")
csrf_cookie_name = string(default='mediagoblin_nonce')
[storage:publicstore]
+storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage")
base_dir = string(default="%(here)s/user_dev/media/public")
base_url = string(default="/mgoblin_media/")
[storage:queuestore]
+storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage")
base_dir = string(default="%(here)s/user_dev/media/queue")
+[beaker.cache]
+type = string(default="file")
+data_dir = string(default="%(here)s/user_dev/beaker/cache/data")
+lock_dir = string(default="%(here)s/user_dev/beaker/cache/lock")
+
+
[celery]
# known booleans
celery_result_persistent = boolean()
diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py
index b07681a6..755f49c5 100644
--- a/mediagoblin/db/migrations.py
+++ b/mediagoblin/db/migrations.py
@@ -92,3 +92,18 @@ def mediaentry_add_fail_error_and_metadata(database):
{'fail_metadata': {'$exists': False}},
{'$set': {'fail_metadata': {}}},
multi=True)
+
+
+@RegisterMigration(6)
+def user_add_forgot_password_token_and_expires(database):
+ """
+ Add token and expiration fields to help recover forgotten passwords
+ """
+ database['users'].update(
+ {'fp_verification_key': {'$exists': False}},
+ {'$set': {'fp_verification_key': None}},
+ multi=True)
+ database['users'].update(
+ {'fp_token_expire': {'$exists': False}},
+ {'$set': {'fp_token_expire': None}},
+ multi=True)
diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py
index 792a515e..bbddada6 100644
--- a/mediagoblin/db/models.py
+++ b/mediagoblin/db/models.py
@@ -78,6 +78,8 @@ class User(Document):
'url' : unicode,
'bio' : unicode, # May contain markdown
'bio_html': unicode, # May contain plaintext, or HTML
+ 'fp_verification_key': unicode, # forgotten password verification key
+ 'fp_token_expire': datetime.datetime
}
required_fields = ['username', 'created', 'pw_hash', 'email']
diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py
index 7bf3c6a8..f81d58b2 100644
--- a/mediagoblin/edit/forms.py
+++ b/mediagoblin/edit/forms.py
@@ -25,13 +25,17 @@ class EditForm(wtforms.Form):
title = wtforms.TextField(
_('Title'),
[wtforms.validators.Length(min=0, max=500)])
- slug = wtforms.TextField(
- _('Slug'),
- [wtforms.validators.Required(message=_("The slug can't be empty"))])
description = wtforms.TextAreaField('Description of this work')
tags = wtforms.TextField(
_('Tags'),
[tag_length_validator])
+ slug = wtforms.TextField(
+ _('Slug'),
+ [wtforms.validators.Required(message=_("The slug can't be empty"))],
+ description=_(
+ "The title part of this media's URL. "
+ "You usually don't need to change this."))
+
class EditProfileForm(wtforms.Form):
bio = wtforms.TextAreaField(
@@ -42,6 +46,7 @@ class EditProfileForm(wtforms.Form):
[wtforms.validators.Optional(),
wtforms.validators.URL(message='Improperly formed URL')])
+
class EditAttachmentsForm(wtforms.Form):
attachment_name = wtforms.TextField(
'Title')
diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py
index e1af1a23..15edfdd6 100644
--- a/mediagoblin/edit/views.py
+++ b/mediagoblin/edit/views.py
@@ -46,9 +46,6 @@ def edit_media(request, media):
description=media['description'],
tags=media_tags_as_string(media['tags']))
- if len(media['attachment_files']):
- defaults['attachment_name'] = media['attachment_files'][0]['name']
-
form = forms.EditForm(
request.POST,
**defaults)
@@ -73,19 +70,11 @@ def edit_media(request, media):
media['description_html'] = cleaned_markdown_conversion(
media['description'])
- if 'attachment_name' in request.POST:
- media['attachment_files'][0]['name'] = \
- request.POST['attachment_name']
-
- if 'attachment_delete' in request.POST \
- and 'y' == request.POST['attachment_delete']:
- del media['attachment_files'][0]
-
media['slug'] = unicode(request.POST['slug'])
media.save()
- return redirect(request, "mediagoblin.user_pages.media_home",
- user=media.uploader()['username'], media=media['slug'])
+ return exc.HTTPFound(
+ location=media.url_for_self(request.urlgen))
if request.user['is_admin'] \
and media['uploader'] != request.user['_id'] \
@@ -141,9 +130,8 @@ def edit_attachments(request, media):
% (request.POST['attachment_name']
or request.POST['attachment_file'].filename))
- return redirect(request, 'mediagoblin.user_pages.media_home',
- user=media.uploader()['username'],
- media=media['slug'])
+ return exc.HTTPFound(
+ location=media.url_for_self(request.urlgen))
return render_to_response(
request,
'mediagoblin/edit/attachments.html',
diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py
index 2e227e77..05edbfc8 100644
--- a/mediagoblin/gmg_commands/import_export.py
+++ b/mediagoblin/gmg_commands/import_export.py
@@ -17,7 +17,7 @@
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 import BasicFileStorage
+from mediagoblin.storage.filestorage import BasicFileStorage
from mediagoblin.init import setup_storage, setup_global_and_app_config
import shutil
@@ -27,8 +27,13 @@ import subprocess
import os.path
import os
import sys
+import logging
from contextlib import closing
+_log = logging.getLogger('gmg.import_export')
+logging.basicConfig()
+_log.setLevel(logging.INFO)
+
def import_export_parse_setup(subparser):
# TODO: Add default
@@ -49,12 +54,12 @@ def import_export_parse_setup(subparser):
def _import_media(db, args):
- """
+ '''
Import media files
Must be called after _import_database()
- """
- print "\n== Importing media ==\n"
+ '''
+ _log.info('-> Importing media...')
media_cache = BasicFileStorage(
args._cache_path['media'])
@@ -65,18 +70,22 @@ def _import_media(db, args):
for entry in db.media_entries.find():
for name, path in entry['media_files'].items():
+ _log.info('Importing: {0} - {1}'.format(
+ entry['title'],
+ name))
+
media_file = mg_globals.public_store.get_file(path, mode='wb')
media_file.write(
media_cache.get_file(path, mode='rb').read())
- print "\n== Media imported ==\n"
+ _log.info('...Media imported')
def _import_database(db, args):
- """
+ '''
Restore mongo database from ___.bson files
- """
- print "\n== Importing database ==\n"
+ '''
+ _log.info('-> Importing database...')
p = subprocess.Popen([
args.mongorestore_path,
@@ -85,13 +94,13 @@ def _import_database(db, args):
p.wait()
- print "\n== Database imported ==\n"
+ _log.info('...Database imported')
def env_import(args):
- """
+ '''
Restore mongo database and media files from a tar archive
- """
+ '''
if not args.cache_path:
args.cache_path = tempfile.mkdtemp()
@@ -100,9 +109,9 @@ def env_import(args):
# Creates mg_globals.public_store and mg_globals.queue_store
setup_storage()
- 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)
tf = tarfile.open(
args.tar_file,
@@ -123,9 +132,9 @@ def env_import(args):
def _setup_paths(args):
- """
+ '''
Populate ``args`` variable with cache subpaths
- """
+ '''
args._cache_path = dict()
PATH_MAP = {
'media': 'media',
@@ -139,10 +148,10 @@ def _setup_paths(args):
def _create_archive(args):
- """
+ '''
Create the tar archive
- """
- print "\n== Compressing to archive ==\n"
+ '''
+ _log.info('-> Compressing to archive')
tf = tarfile.open(
args.tar_file,
@@ -151,27 +160,27 @@ def _create_archive(args):
with closing(tf):
tf.add(args.cache_path, 'mediagoblin-data/')
- print "\n== Archiving done ==\n"
+ _log.info('...Archiving done')
def _clean(args):
- """
+ '''
Remove cache directory
- """
+ '''
shutil.rmtree(args.cache_path)
def _export_check(args):
- """
+ '''
Run security checks for export command
- """
+ '''
if os.path.exists(args.tar_file):
overwrite = raw_input(
'The output file already exists. '
'Are you **SURE** you want to overwrite it? '
'(yes/no)> ')
if not overwrite == 'yes':
- print "Aborting."
+ print 'Aborting.'
return False
@@ -179,12 +188,7 @@ def _export_check(args):
def _export_database(db, args):
- print "\n== Exporting database ==\n"
-
- command = '{mongodump_path} -d {database} -o {mongodump_cache}'.format(
- mongodump_path=args.mongodump_path,
- database=db.name,
- mongodump_cache=args._cache_path['database'])
+ _log.info('-> Exporting database...')
p = subprocess.Popen([
args.mongodump_path,
@@ -193,11 +197,11 @@ def _export_database(db, args):
p.wait()
- print "\n== Database exported ==\n"
+ _log.info('...Database exported')
def _export_media(db, args):
- print "\n== Exporting media ==\n"
+ _log.info('-> Exporting media...')
media_cache = BasicFileStorage(
args._cache_path['media'])
@@ -208,21 +212,25 @@ def _export_media(db, args):
for entry in db.media_entries.find():
for name, path in entry['media_files'].items():
+ _log.info('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())
- print "\n== Media exported ==\n"
+ _log.info('...Media exported')
def env_export(args):
- """
+ '''
Export database and media files to a tar archive
- """
+ '''
if args.cache_path:
if os.path.exists(args.cache_path):
- print 'The cache directory must not exist before you run this script'
- print 'Cache directory: ', args.cache_path
+ _log.error('The cache directory must not exist before you run this script')
+ _log.error('Cache directory: {0}'.format(args.cache_path))
return False
else:
@@ -231,15 +239,15 @@ def env_export(args):
args = _setup_paths(args)
if not _export_check(args):
- print "\n== Checks did not pass, exiting ==\n"
+ _log.error('Checks did not pass, exiting')
sys.exit(0)
- setup_global_and_app_config(args.conf_file)
- setup_storage()
+ globa_config, app_config = setup_global_and_app_config(args.conf_file)
- config, validation_result = read_mediagoblin_config(args.conf_file)
+ setup_storage()
+
connection, db = setup_connection_and_db_from_config(
- config['mediagoblin'], use_pymongo=True)
+ app_config, use_pymongo=True)
_export_database(db, args)
diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo
index dafcdb66..1d75d517 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 df47bac4..b5057b9d 100644
--- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po
@@ -2,15 +2,16 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# Majid Al-Dharrab <majid@aldharrab.com>, 2011.
-# <osamak@gnu.org>, 2011.
# <Omar.w.kh@gmail.com>, 2011.
+# <osamak@gnu.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-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -20,103 +21,102 @@ 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:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "اسم المستخدم"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
-msgstr "كلمة المرور"
+msgstr "كلمة السر"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
-msgstr "يجب أن تتطابق كلمتا المرور."
+msgstr "يجب أن تتطابق كلمتا السر."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
-msgstr "تأكيد كلمة المرور"
+msgstr "أكّد كلمة السر"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
+msgstr "اكتبها مرة أخرى هنا للتأكد من عدم وجود أخطاء إملائية."
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "عنوان البريد الإلكتروني"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "عفوًا، التسجيل غير متاح هنا."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
-msgstr "عذرا، مستخدم بهذا الاسم موجود فعلا."
+msgstr "عذرًا، لقد اختار مستخدم آخر هذا الاسم."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "عفوًا، هذا العنوان البريدي مستخدم."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-"تم التحقق من بريدك الإلكتروني. يمكنك الآن الولوج، تحرير ملفك، وإرسال الصور!"
+"تم التحقق من بريدك الإلكتروني. يمكنك الآن الولوج، وتحرير ملفك الشخصي، ونشر "
+"الصور!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "مفتاح التحقق أو معرف المستخدم خاطئ"
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
-msgstr "أعيد إرسال رسالة التحقق."
+msgstr "أعدنا إرسال رسالة التحقق."
+
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "العنوان"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "الوسوم"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "الوسوم"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "السيرة"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "الموقع الإلكتروني"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
@@ -126,11 +126,15 @@ msgstr ""
#: mediagoblin/submit/forms.py:25
msgid "File"
+msgstr "الملف"
+
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
msgstr ""
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
-msgstr ""
+msgstr "يجب أن تضع ملفًا."
#: mediagoblin/submit/views.py:50
msgid "The file doesn't seem to be an image!"
@@ -138,7 +142,7 @@ msgstr "لا يبدو أن هذا الملف صورة!"
#: mediagoblin/submit/views.py:122
msgid "Woohoo! Submitted!"
-msgstr ""
+msgstr "يا سلام! نُشرَت!"
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
@@ -146,13 +150,14 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr ""
+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/404.html:32
msgid "Image of 404 goblin stressing out"
@@ -172,13 +177,13 @@ msgstr "أرسل وسائط"
#: mediagoblin/templates/mediagoblin/base.html:63
msgid "verify your email!"
-msgstr "أكد بريدك"
+msgstr "أكّد بريدك"
#: mediagoblin/templates/mediagoblin/base.html:73
#: mediagoblin/templates/mediagoblin/auth/login.html:26
#: mediagoblin/templates/mediagoblin/auth/login.html:34
msgid "Log in"
-msgstr "لُج"
+msgstr "لِج"
#: mediagoblin/templates/mediagoblin/base.html:89
msgid ""
@@ -186,9 +191,13 @@ msgid ""
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "مرحبا بكم يا محبوا الوسائط! ميدياغوبلن هو..."
+msgstr "مرحبًا بكم يا محبي الوسائط! ميدياغوبلن هو..."
#: mediagoblin/templates/mediagoblin/root.html:29
msgid "The perfect place for your media!"
@@ -204,19 +213,20 @@ msgstr "مكان يجتمع فيه الناس ليتعاونوا ويعرضوا
msgid ""
"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
"after all.)"
-msgstr ""
+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 ""
+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 ""
@@ -225,21 +235,76 @@ msgid ""
" 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr "فشل الولوج!"
#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Don't have an account yet?"
-msgstr "ألا تملك حسابا؟"
+msgstr "ألا تملك حسابًا بعد؟"
#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Create one here!"
-msgstr "أنشئ حسابا هنا!"
+msgstr "أنشئ حسابًا هنا!"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
-msgstr "أنشئ حسابا!"
+msgstr "أنشئ حسابًا!"
#: mediagoblin/templates/mediagoblin/auth/register.html:30
msgid "Create"
@@ -255,36 +320,36 @@ msgid ""
"\n"
"%(verification_url)s"
msgstr ""
-"أهلا %(username)s،\n"
+"أهلًا يا %(username)s،\n"
"\n"
-"لتفعيل حسابك في غنو ميدياغوبلن، افتح الرابط التالي\n"
-"في متصفحك:\n"
+"افتح الرابط التالي\n"
+"في متصفحك لتفعيل حسابك في غنو ميدياغوبلن:\n"
"\n"
"%(verification_url)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:29
#, python-format
msgid "Editing %(media_title)s"
-msgstr "تعديل %(media_title)s"
+msgstr "تحرير %(media_title)s"
#: 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_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "احفظ التغييرات"
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
msgid "Editing %(username)s's profile"
-msgstr "تعديل ملف %(username)s"
+msgstr "تحرير ملف %(username)s الشخصي"
#: mediagoblin/templates/mediagoblin/listings/tag.html:31
msgid "Media tagged with:"
-msgstr "الوسائط الموسومة بـ:"
+msgstr "الوسائط الموسومة ب‍"
#: mediagoblin/templates/mediagoblin/submit/start.html:26
msgid "Submit yer media"
@@ -302,17 +367,15 @@ 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 "عذرا، لا يوجد مستخدم مماثل"
+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:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
@@ -343,7 +406,7 @@ msgstr "يجب التحقق من البريد الإلكتروني"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
msgid "Almost done! Your account still needs to be activated."
-msgstr "انتهينا تقريبا! لا زال حسابك يحتاج إلى التفعيل."
+msgstr "أوشكنا على الانتهاء! ما زال حسابك بحاجة إلى التفعيل."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
msgid ""
@@ -376,7 +439,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
#, python-format
msgid "%(username)s's profile"
-msgstr "ملف %(username)s's"
+msgstr "ملف %(username)s الشخصي"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
msgid "Here's a spot to tell others about yourself."
@@ -385,7 +448,7 @@ msgstr "هذه زاوية لتخبر الآخرين فيها عن نفسك."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
msgid "Edit profile"
-msgstr "عدل الملف"
+msgstr "حرِّر الملف الشخصي"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "This user hasn't filled in their profile (yet)."
@@ -394,7 +457,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
#, python-format
msgid "View all of %(username)s's media"
-msgstr "اعرض كل وسائط %(username)s"
+msgstr "أظهِر كل وسائط %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
msgid ""
@@ -408,7 +471,7 @@ msgstr "أضف وسائط"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
msgid "There doesn't seem to be any media here yet..."
-msgstr "لا يبدو أنه يوجد أي وسائط هنا حتى الآن..."
+msgstr "لا يبدو أنه توجد أي وسائط هنا حتى الآن..."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
@@ -418,11 +481,23 @@ msgstr ""
msgid "Atom feed"
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr ""
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
+msgstr "علِّق"
+
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
msgstr ""
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/views.py:175
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 848ea148..06a01632 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 22836525..81462e27 100644
--- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po
@@ -2,18 +2,20 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
-# Rafael Maguiña <rafael.maguina@gmail.com>, 2011.
+# Translators:
# <benjamin@lebsanft.org>, 2011.
-# <mediagoblin.org@samba-tng.org>, 2011.
-# Elrond <elrond+mediagoblin.org@samba-tng.org>, 2011.
# <cwebber@dustycloud.org>, 2011.
+# Elrond <elrond+mediagoblin.org@samba-tng.org>, 2011.
# Jan-Christoph Borchardt <JanCBorchardt@fsfe.org>, 2011.
+# <mediagoblin.org@samba-tng.org>, 2011.
+# Rafael Maguiña <rafael.maguina@gmail.com>, 2011.
+# Vinzenz Vietzke <vinz@fedoraproject.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-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+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"
@@ -23,55 +25,43 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Benutzername"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Passwort"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Passwörter müssen übereinstimmen."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "Passwort wiederholen"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
+msgstr "Hier nochmal eintragen, um Tippfehler zu verhindern."
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "Email-Adresse"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "Registrierung ist auf dieser Instanz leider deaktiviert."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "Leider gibt es bereits einen Benutzer mit diesem Namen."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "Tut und Leid, aber diese Email-Adresse wird bereits verwendet."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -79,48 +69,60 @@ msgstr ""
"Deine Email-Adresse wurde bestätigt. Du kannst dich nun anmelden, Dein "
"Profil bearbeiten und Bilder hochladen!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "Der Bestätigungssschlüssel oder die Nutzernummer ist falsch."
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "Bestätigungs-Email wurde erneut versandt."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Markierungen"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Kurztitel"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Bitte gib einen Kurztitel ein"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Markierungen"
+#: mediagoblin/edit/forms.py:35
+msgid ""
+"The title part of this media's URL. You usually don't need to change this."
+msgstr ""
+"Der Titelteil der Medienadresse. Normalerweise muss hier nichts geändert "
+"werden."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Biographie"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Webseite"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr "Diesen Kurztitel hast du bereits vergeben."
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
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:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Du bearbeitest das Profil eines Anderen. Bitte sei vorsichtig."
@@ -132,6 +134,10 @@ msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein."
msgid "File"
msgstr "Datei"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Beschreibung des Werkes"
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "Du musst eine Datei angeben."
@@ -191,6 +197,12 @@ msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+"Läuft mit <a href=\"http://mediagoblin.org/\">MediaGoblin</a>, einem <a "
+"href=\"http://gnu.org/\">GNU</a>-Projekt"
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
@@ -242,6 +254,53 @@ msgstr ""
"href=\"http://mediagoblin.org/pages/join.html\">Du kannst uns dabei helfen, "
"die Software zu verbessern!</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"
+" or\n"
+" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr "Anmeldevorgang fehlgeschlagen!"
@@ -254,13 +313,21 @@ msgstr "Hast du noch kein Konto?"
msgid "Create one here!"
msgstr "Registriere dich!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "Neues Konto registrieren!"
#: mediagoblin/templates/mediagoblin/auth/register.html:30
msgid "Create"
-msgstr "Erstellen"
+msgstr "Registrieren"
#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19
#, python-format
@@ -284,12 +351,12 @@ msgid "Editing %(media_title)s"
msgstr "%(media_title)s bearbeiten"
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Abbrechen"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Änderungen speichern"
@@ -323,13 +390,11 @@ msgstr "Dieser Benutzer wurde leider nicht gefunden."
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "%(title)s wirklich löschen?"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
+msgstr "Dauerhaft löschen."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
@@ -403,7 +468,7 @@ msgstr "%(username)ss Profil"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
msgid "Here's a spot to tell others about yourself."
-msgstr "Hier kannst du Anderen etwas über dich zu erzählen."
+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
@@ -441,12 +506,24 @@ 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:46
+msgid "Older"
+msgstr "Ältere"
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Kommentar"
-#: mediagoblin/user_pages/views.py:176
+#: 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:175
msgid "You are about to delete another user's media. Proceed with caution."
-msgstr ""
+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 f9022543..16a235a2 100644
--- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2011-08-30 22:51-0500\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,102 +17,99 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 0.9.6\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr ""
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr ""
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr ""
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr ""
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr ""
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr ""
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr ""
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your "
"profile, and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr ""
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or "
+"your account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr ""
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr ""
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
@@ -124,6 +121,10 @@ msgstr ""
msgid "File"
msgstr ""
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr ""
@@ -182,6 +183,10 @@ msgid ""
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
msgstr ""
@@ -221,6 +226,55 @@ msgid ""
"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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr ""
@@ -233,6 +287,14 @@ msgstr ""
msgid "Create one here!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr ""
@@ -258,12 +320,12 @@ 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_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr ""
@@ -299,10 +361,8 @@ msgstr ""
msgid "Really delete %(title)s?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
@@ -404,11 +464,23 @@ msgstr ""
msgid "Atom feed"
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr ""
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr ""
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:175
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 4fb13eef..506e882b 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 c4a286e2..270b043f 100644
--- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po
@@ -2,15 +2,16 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <deletesoftware@yandex.ru>, 2011.
-# <john_w1954@fastmail.fm>, 2011.
# Fernando Inocencio <faigos@gmail.com>, 2011.
+# <john_w1954@fastmail.fm>, 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-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -20,55 +21,43 @@ msgstr ""
"Language: eo\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Uzantnomo"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Pasvorto"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Pasvortoj devas esti egalaj."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "Retajpu pasvorton"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
+msgstr "Retajpu ĝin por certigi, ke ne okazis mistajpoj."
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "Retpoŝtadreso"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "Bedaŭrinde, registrado estas malaktivigita en tiu ĉi instalaĵo."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "Bedaŭrinde, uzanto kun tiu nomo jam ekzistas."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "Tiu retpoŝtadreso jam estas uzata."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -76,59 +65,75 @@ msgstr ""
"Via retpoŝtadreso estas konfirmita. Vi povas nun ensaluti, redakti vian "
"profilon, kaj alŝuti bildojn!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "La kontrol-kodo aŭ la uzantonomo ne estas korekta"
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "Resendi vian kontrol-mesaĝon."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titolo"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Etikedoj"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "La distingiga adresparto"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "La distingiga adresparto ne povas esti malplena"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Etikedoj"
+#: mediagoblin/edit/forms.py:35
+msgid ""
+"The title part of this media's URL. 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Retejo"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
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:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr "Vi priredaktas dosieron de alia uzanto. Agu singardeme."
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
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 ""
+msgstr "La provizita dosiero ne konformas al la informtipo."
#: 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:47
msgid "You must provide a file."
msgstr "Vi devas provizi dosieron."
@@ -143,11 +148,11 @@ msgstr "Hura! Alŝutitas!"
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
-msgstr ""
+msgstr "Oj!"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr ""
+msgstr "Verŝajne ĉe ĉi tiu adreso ne estas paĝo. Ni bedaŭras!"
#: mediagoblin/templates/mediagoblin/404.html:26
msgid ""
@@ -159,7 +164,7 @@ msgstr ""
#: mediagoblin/templates/mediagoblin/404.html:32
msgid "Image of 404 goblin stressing out"
-msgstr ""
+msgstr "Bildo de 404-koboldo penŝvitanta."
#: mediagoblin/templates/mediagoblin/base.html:22
msgid "GNU MediaGoblin"
@@ -188,10 +193,16 @@ msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+"Funkcias per <a href=\"http://mediagoblin.org\">MediaGoblin</a>, unu el la "
+"<a href=\"http://gnu.org/\">projektoj de GNU</a>"
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
-msgstr ""
+msgstr "Saluton, artemulo! MediaGoblin estas…"
#: mediagoblin/templates/mediagoblin/root.html:29
msgid "The perfect place for your media!"
@@ -202,26 +213,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 &lt;a "
-"href=\"http://gnu.org\"&gt;GNU&lt;/a&gt;.)"
+"Libera verko. (Ni ja estas projekto de <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 ""
+"Celanta plibonigi la mondon per sencentreco kaj (iam, baldaŭ!) federateco!"
#: 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
msgid ""
@@ -229,6 +244,63 @@ msgid ""
"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
" software!</a>)"
msgstr ""
+"Vivanta per homoj kiel vi. (<a "
+"href=\"http://mediagoblin.org/pages/join.html\">Vi povas helpi al ni "
+"plibonigi la programon!</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"
+" or\n"
+" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr "Plej nove aldonitaj dosieroj"
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr "Enigu vian novan pasvorton"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Enter your username or email"
+msgstr "Enigu vian salutnomon aŭ retpoŝtadreson"
+
+#: 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/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/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 ""
+"Saluton, %(username)s,\n"
+"\n"
+"por ŝanĝi vian pasvorton ĉe GNUa MediaGoblin, sekvu la jenan retadreson per via TTT-legilo:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"Se vi pensas, ke ĉi tiu retletero estas sendita erare, simple ignoru ĝin kaj plu restu feliĉa koboldo!"
#: mediagoblin/templates/mediagoblin/auth/login.html:29
msgid "Logging in failed!"
@@ -242,6 +314,14 @@ msgstr "Ĉu ankoraŭ sen konto?"
msgid "Create one here!"
msgstr "Kreu ĝin ĉi tie!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr "Ĉu vi forgesis vian pasvorton?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr "Ŝanĝu ĝin!"
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "Kreu konton!"
@@ -272,12 +352,12 @@ msgid "Editing %(media_title)s"
msgstr "Priredaktado de %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Nuligi"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Konservi ŝanĝojn"
@@ -311,34 +391,34 @@ msgstr "Uzanto ne trovita."
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "Ĉu efektive forigi %(title)s?"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
+msgstr "Forigi senrevene"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
-msgstr ""
+msgstr "Kontrolejo pri dosierpreparado."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
msgid ""
"You can track the state of media being processed for your gallery here."
msgstr ""
+"Ĉi tie vi povas informiĝi pri la stato de preparado de dosieroj por via "
+"galerio."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
msgid "Media in-processing"
-msgstr ""
+msgstr "Dosieroj preparataj"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
-msgstr ""
+msgstr "Neniu dosieroj preparatas"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
-msgstr ""
+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
@@ -347,7 +427,7 @@ msgstr "Necesas konfirmo de retpoŝtadreso"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
msgid "Almost done! Your account still needs to be activated."
-msgstr ""
+msgstr "Preskaŭ finite! Restas nur validigi vian konton."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
msgid ""
@@ -368,6 +448,8 @@ msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
+"Iu registris konton kun tiu ĉi uzantonomo, sed ĝi devas ankoraŭ esti "
+"aktivigita."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
#, python-format
@@ -394,7 +476,7 @@ msgstr "Redakti profilon"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "This user hasn't filled in their profile (yet)."
-msgstr ""
+msgstr "Ĉi tiu uzanto ne jam aldonis informojn pri si."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
#, python-format
@@ -406,6 +488,7 @@ 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"
@@ -421,14 +504,26 @@ msgstr "flusimbolo"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
-msgstr ""
+msgstr "Atom-a informfluo"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr "Plinovaj"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr "Malplinovaj"
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Komento"
-#: mediagoblin/user_pages/views.py:176
+#: 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:175
msgid "You are about to delete another user's media. Proceed with caution."
-msgstr ""
+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 58531d96..2e64b814 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 cfe19a1e..083a87a5 100644
--- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po
@@ -2,15 +2,18 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <ekenbrand@hotmail.com>, 2011.
-# <juangsub@gmail.com>, 2011.
# <jacobo@gnu.org>, 2011.
+# Javier Di Mauro <javierdimauro@gmail.com>, 2011.
+# <juangsub@gmail.com>, 2011.
+# Mario Rodriguez <msrodriguez00@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: 2011-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+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"
@@ -20,120 +23,127 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Nombre de Usuario"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Contraseña"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Las contraseñas deben coincidir."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
-msgstr "Confirme su contraseña"
+msgstr "Confirma tu contraseña"
-#: mediagoblin/auth/forms.py:42
+#: 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:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "Dirección de correo electrónico"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "Lo sentimos, la registración está deshabilitado en este momento."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "Lo sentimos, ya existe un usuario con ese nombre."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
-msgstr "Lo sentimos, su dirección de correo electrónico ya ha sido tomada."
+msgstr "Lo sentimos, esa dirección de correo electrónico ya ha sido tomada."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-"Su dirección de correo electrónico ha sido verificada. ¡Ahora puede "
-"ingresar, editar su perfil, y enviar imágenes!"
+"Tu dirección de correo electrónico ha sido verificada. ¡Ahora puedes "
+"ingresar, editar tu perfil, y enviar imágenes!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
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:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
-msgstr "Reenvíe su correo electrónico de verificación."
+msgstr "Se reenvió tu correo electrónico de verificación."
+
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+"No se pudo enviar un correo electrónico de recuperación de contraseñas "
+"porque su nombre de usuario está inactivo o la dirección de su cuenta de "
+"correo electrónico no ha sido verificada."
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Título"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Ficha"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "La ficha no puede estar vacía"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Etiquetas"
+#: mediagoblin/edit/forms.py:35
+msgid ""
+"The title part of this media's URL. 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Sitio web"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
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:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
-msgstr ""
-"Usted está editando el contenido de otro usuario. Proceder con precaución."
+msgstr "Estás editando el contenido de otro usuario. Proceder con precaución."
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
-msgstr "Usted está editando un perfil de usuario. Proceder con precaución."
+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 inálido para el formato seleccionado."
+msgstr "Archivo inválido para el formato seleccionado."
#: 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:47
msgid "You must provide a file."
-msgstr "Usted debe proporcionar un archivo."
+msgstr "Debes proporcionar un archivo."
#: mediagoblin/submit/views.py:50
msgid "The file doesn't seem to be an image!"
@@ -156,12 +166,12 @@ msgid ""
"If you're sure the address is correct, maybe the page you're looking for has"
" been moved or deleted."
msgstr ""
-"Si estas seguro que la dirección es correcta, puede ser que la pagina halla "
+"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 "404 el goblin esta estresado"
+msgstr "Imagen de 404 goblin estresándose"
#: mediagoblin/templates/mediagoblin/base.html:22
msgid "GNU MediaGoblin"
@@ -177,7 +187,7 @@ msgstr "Enviar contenido"
#: mediagoblin/templates/mediagoblin/base.html:63
msgid "verify your email!"
-msgstr "Verifique su correo electrónico"
+msgstr "Verifica tu correo electrónico!"
#: mediagoblin/templates/mediagoblin/base.html:73
#: mediagoblin/templates/mediagoblin/auth/login.html:26
@@ -190,21 +200,27 @@ msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+"Potenciado por <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU</a> project"
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr "Explorar"
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "Hola, amante de los medios de comunicación! MediaGoblin es ..."
+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 cosas!"
+msgstr "El lugar ideal para tus contenidos!"
#: mediagoblin/templates/mediagoblin/root.html:30
msgid ""
"A place for people to collaborate and show off original and derived "
"creations!"
msgstr ""
-"Un lugar para colaborar y exhibir tus creaciones orignales y derivadas"
+"Un lugar para colaborar y exhibir tus creaciones orignales y derivadas!"
#: mediagoblin/templates/mediagoblin/root.html:31
msgid ""
@@ -220,7 +236,7 @@ msgid ""
"(eventually, coming soon!) federation!"
msgstr ""
"Queriendo hacer del mundo un mejor lugar a través de la descentralización y "
-"(eventualmente!) la federalización!"
+"(eventualmente, muy pronto!) la federalización!"
#: mediagoblin/templates/mediagoblin/root.html:33
msgid ""
@@ -240,9 +256,60 @@ msgstr ""
"href=\"http://mediagoblin.org/pages/join.html\"> Vos podés ayudarnos a "
"mejorar este programa</a>)"
+#: mediagoblin/templates/mediagoblin/root.html:38
+msgid "Excited to join us?"
+msgstr "Te emociona trabajar con nosotros?"
+
+#: 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr "El contenido más reciente"
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr "Ingrese su nueva contraseña"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Enter your username or email"
+msgstr "Introduzca su nombre de usuario o correo electrónico"
+
+#: 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/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/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 ""
+"Hola %(username)s , para cambiar su contraseña de GNU MediaGoblin, abra lal "
+"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!"
+
#: mediagoblin/templates/mediagoblin/auth/login.html:29
msgid "Logging in failed!"
-msgstr "Fallo el inicio de sesión!"
+msgstr "Falló el inicio de sesión!"
#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Don't have an account yet?"
@@ -252,6 +319,14 @@ msgstr "¿No tienes una cuenta?"
msgid "Create one here!"
msgstr "¡Crea una aquí!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr "¿Olvidaste tu contraseña?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr "Cambiarlo!"
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "¡Crea una cuenta!"
@@ -270,8 +345,11 @@ msgid ""
"\n"
"%(verification_url)s"
msgstr ""
-"Hola %(username)s , para activar su cuenta GNU MediaGoblin, abra la "
-"siguiente URL en su navegador: %(verification_url)s "
+"Hola %(username)s,\n"
+"\n"
+"para activar tu cuenta de GNU MediaGoblin, abre la siguiente URL en tu navegador:\n"
+"\n"
+"%(verification_url)s "
#: mediagoblin/templates/mediagoblin/edit/edit.html:29
#, python-format
@@ -279,14 +357,14 @@ msgid "Editing %(media_title)s"
msgstr "Edición %(media_title)s "
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Cancelar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
-msgstr "Salvar cambios"
+msgstr "Guardar cambios"
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
#, python-format
@@ -299,7 +377,7 @@ msgstr "Contenido etiquetado con:"
#: mediagoblin/templates/mediagoblin/submit/start.html:26
msgid "Submit yer media"
-msgstr "Envíe su contenido"
+msgstr "Envía tu contenido"
#: mediagoblin/templates/mediagoblin/submit/start.html:29
msgid "Submit"
@@ -313,18 +391,16 @@ 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 ha encontrado ese usuario."
+msgstr "Lo sentimos, no se encontró ese usuario."
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "Realmente deseas eliminar %(title)s ?"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
+msgstr "Eliminar permanentemente"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
@@ -362,8 +438,8 @@ msgstr "Casi terminas! Solo falta activar la cuenta."
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
msgstr ""
-"Un e-mail debería llegar en unos momentos con las instrucciones para "
-"hacerlo."
+"En unos momentos te debería llegar un correo electrónico con las "
+"instrucciones para hacerlo."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
msgid "In case it doesn't:"
@@ -387,13 +463,13 @@ 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 ""
-"Si usted es esa persona, pero ha perdido su correo electrónico de "
-"verificación, puede <a href=\"%(login_url)s\">acceder</a> y reenviarlo."
+"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's"
+msgstr "Perfil de %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
msgid "Here's a spot to tell others about yourself."
@@ -411,15 +487,14 @@ msgstr "Este usuario (todavia) no ha completado su perfil."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
#, python-format
msgid "View all of %(username)s's media"
-msgstr "Ver todo el contenido de %(username)s's "
+msgstr "Ver todo el contenido de %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
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 no haz agregado contenido"
-" todavia."
+"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"
@@ -427,7 +502,7 @@ msgstr "Añadir contenido"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
msgid "There doesn't seem to be any media here yet..."
-msgstr "Parece que no hay ningún contenido aquí todavia..."
+msgstr "Parece que aún no hay ningún contenido aquí..."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
@@ -437,12 +512,26 @@ 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:46
+msgid "Older"
+msgstr "Antiguas"
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Comentario"
-#: mediagoblin/user_pages/views.py:176
+#: 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:175
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 "
+"precaución."
diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo
index fe006cdc..5b3adb77 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 a3b0eb53..a9b9f160 100644
--- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po
@@ -2,16 +2,18 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
-# <maxineb@members.fsf.org>, 2011.
+# Translators:
+# <joehillen@gmail.com>, 2011.
# <marktraceur@gmail.com>, 2011.
-# Valentin Villenave <valentin@villenave.net>, 2011.
+# <maxineb@members.fsf.org>, 2011.
# <transifex@wandborg.se>, 2011.
+# Valentin Villenave <valentin@villenave.net>, 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-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -21,55 +23,45 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Nom d'utilisateur"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Mot de passe"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Les mots de passe doivent correspondre."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "Confirmer le mot de passe"
-#: mediagoblin/auth/forms.py:42
+#: 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 "
+"d'orthographe."
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "Adresse e-mail"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "L'inscription n'est pas activée sur ce serveur, désolé."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "Un utilisateur existe déjà avec ce nom, désolé."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "Désolé, cette adresse courriel a déjà été prise."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -77,50 +69,60 @@ msgstr ""
"Votre adresse e-mail a bien été vérifiée. Vous pouvez maintenant vous "
"identifier, modifier votre profil, et soumettre des images !"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
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:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "E-mail de vérification renvoyé."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titre"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Tags"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Légende"
-#: mediagoblin/edit/forms.py:30
+#: 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/submit/forms.py:31
-msgid "Tags"
-msgstr "Tags"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Site web"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
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:95
+#: mediagoblin/edit/views.py:84
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:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
"Vous vous apprêtez à modifier le profil d'un utilisateur. Veuillez prendre "
@@ -128,12 +130,16 @@ msgstr ""
#: mediagoblin/process_media/errors.py:44
msgid "Invalid file given for media type."
-msgstr ""
+msgstr "Invalide fichier donné pour le type de média."
#: mediagoblin/submit/forms.py:25
msgid "File"
msgstr "Fichier"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "Il vous faut fournir un fichier."
@@ -148,21 +154,23 @@ msgstr "Youhou, c'est envoyé !"
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
-msgstr ""
+msgstr "Zut!"
#: mediagoblin/templates/mediagoblin/404.html:24
msgid "There doesn't seem to be a page at this address. Sorry!"
-msgstr ""
+msgstr "Il ne semble pas être une page à cette adresse. Désolé!"
#: 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 ""
+"Si vous êtes sûr que l'adresse est correcte, peut-être la page que vous "
+"recherchez a été déplacé ou supprimé."
#: mediagoblin/templates/mediagoblin/404.html:32
msgid "Image of 404 goblin stressing out"
-msgstr ""
+msgstr "Image de 404 gobelin stresser"
#: mediagoblin/templates/mediagoblin/base.html:22
msgid "GNU MediaGoblin"
@@ -170,7 +178,7 @@ msgstr "GNU MediaGoblin"
#: mediagoblin/templates/mediagoblin/base.html:47
msgid "MediaGoblin logo"
-msgstr ""
+msgstr "Logo MediaGoblin"
#: mediagoblin/templates/mediagoblin/base.html:52
msgid "Submit media"
@@ -191,38 +199,52 @@ 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"
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
-msgstr ""
+msgstr "Salut à tous, amateur de médias! MediaGoblin est ..."
#: mediagoblin/templates/mediagoblin/root.html:29
msgid "The perfect place for your media!"
-msgstr ""
+msgstr "L'endroit idéal pour vos médias!"
#: mediagoblin/templates/mediagoblin/root.html:30
msgid ""
"A place for people to collaborate and show off original and derived "
"creations!"
msgstr ""
+"Un lieu pour les personnes de collaborer et de montrer des créations "
+"originales et dérivées!"
#: 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
msgid ""
@@ -230,26 +252,84 @@ msgid ""
"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
" software!</a>)"
msgstr ""
+"Propulsé par des gens comme vous. (<a "
+"href=\"http://mediagoblin.org/pages/join.html\">Vous pouvez nous aider à "
+"améliorer ce logiciel!</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"
+" or\n"
+" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
-msgstr ""
+msgstr "Connexion a échoué!"
#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Don't have an account yet?"
-msgstr "Pas encore de compte ?"
+msgstr "Pas encore de compte?"
#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Create one here!"
-msgstr "Créez-en un ici !"
+msgstr "Créez-en un ici!"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
#: 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:30
msgid "Create"
-msgstr ""
+msgstr "Créer"
#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19
#, python-format
@@ -273,12 +353,12 @@ msgid "Editing %(media_title)s"
msgstr "Modification de %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Annuler"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Enregistrer les modifications"
@@ -312,43 +392,43 @@ msgstr "Impossible de trouver cet utilisateur, désolé."
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "Voulez-vous vraiment supprimer %(title)s ?"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: 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 ""
+msgstr "Panneau pour le traitement des médias"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
msgid ""
"You can track the state of media being processed for your gallery here."
msgstr ""
+"Vous pouvez suivre l'état des médias en cours de traitement pour votre "
+"galerie ici."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
msgid "Media in-processing"
-msgstr ""
+msgstr "Médias en transformation"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
-msgstr ""
+msgstr "Aucun média en transformation"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
-msgstr ""
+msgstr "Ces ajouts n'etaient pas processé:"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
msgid "Email verification needed"
-msgstr ""
+msgstr "Vérification d'email nécessaire"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
msgid "Almost done! Your account still needs to be activated."
-msgstr ""
+msgstr "Presque fini! Votre compte a encore besoin d'être activé."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
msgid ""
@@ -370,6 +450,8 @@ msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
+"Quelqu'un a enregistré un compte avec ce nom, mais il doit encore être "
+"activé."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
#, python-format
@@ -388,7 +470,7 @@ msgstr "profil de %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
msgid "Here's a spot to tell others about yourself."
-msgstr ""
+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
@@ -397,7 +479,7 @@ msgstr "Modifier le profil"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "This user hasn't filled in their profile (yet)."
-msgstr ""
+msgstr "Cet utilisateur n'a pas rempli leur profil (encore)."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
#, python-format
@@ -409,29 +491,45 @@ 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é."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
msgid "Add media"
-msgstr ""
+msgstr "Ajouter des médias"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
msgid "There doesn't seem to be any media here yet..."
-msgstr ""
+msgstr "Il ne semble pas être un média encore là ..."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
-msgstr ""
+msgstr "icon de flux"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
+msgstr "flux Atom"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
msgstr ""
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Commentaire"
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:175
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+"Vous êtes sur le point de supprimer des médias d'un autre utilisateur. "
+"Procédez avec prudence."
diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
new file mode 100644
index 00000000..9a010192
--- /dev/null
+++ 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
new file mode 100644
index 00000000..67db7ca2
--- /dev/null
+++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
@@ -0,0 +1,520 @@
+# Translations template for PROJECT.
+# Copyright (C) 2011 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# <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-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+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: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
+msgid "Username"
+msgstr "Nome utente"
+
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
+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
+msgid "Email address"
+msgstr "Indirizzo email"
+
+#: mediagoblin/auth/views.py:42
+msgid "Sorry, registration is disabled on this instance."
+msgstr "Spiacente, registrazione è disabilitata su questa istanza"
+
+#: mediagoblin/auth/views.py:60
+msgid "Sorry, a user with that name already exists."
+msgstr "Spiacente, esiste già un utente con quel nome"
+
+#: mediagoblin/auth/views.py:64
+msgid "Sorry, that email address has already been taken."
+msgstr "Spiacente, quell'indirizzo email è già stato preso."
+
+#: mediagoblin/auth/views.py:165
+msgid ""
+"Your email address has been verified. You may now login, edit your profile, "
+"and submit images!"
+msgstr ""
+"Il tuo indirizzo email è stato verificato. Puoi ora fare login, modificare "
+"il tuo profilo, e inserire immagini!"
+
+#: mediagoblin/auth/views.py:171
+msgid "The verification key or user id is incorrect"
+msgstr "La chiave di verifica o l'id utente è sbagliato"
+
+#: mediagoblin/auth/views.py:192
+msgid "Resent your verification email."
+msgstr "Rispedisci email di verifica"
+
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
+#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
+msgid "Title"
+msgstr "Titolo"
+
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Tags"
+
+#: mediagoblin/edit/forms.py:33
+msgid "Slug"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:34
+msgid "The slug can't be empty"
+msgstr ""
+
+#: 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:42
+msgid "Bio"
+msgstr "Bio"
+
+#: mediagoblin/edit/forms.py:45
+msgid "Website"
+msgstr "Sito web"
+
+#: mediagoblin/edit/views.py:63
+msgid "An entry with that slug already exists for this user."
+msgstr ""
+
+#: mediagoblin/edit/views.py:84
+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:154
+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/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:47
+msgid "You must provide a file."
+msgstr "Devi specificare un documento."
+
+#: mediagoblin/submit/views.py:50
+msgid "The file doesn't seem to be an image!"
+msgstr "Il documento non sembra essere un'immagine!"
+
+#: mediagoblin/submit/views.py:122
+msgid "Woohoo! Submitted!"
+msgstr "Evviva! "
+
+#: mediagoblin/templates/mediagoblin/404.html:21
+msgid "Oops!"
+msgstr "Oops!"
+
+#: mediagoblin/templates/mediagoblin/404.html:24
+msgid "There doesn't seem to be a page at this address. Sorry!"
+msgstr "Non sembra esserci una pagina a questo indirizzo. Spiacente!"
+
+#: 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 ""
+"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
+msgid "MediaGoblin logo"
+msgstr "MediaGoblin logo"
+
+#: mediagoblin/templates/mediagoblin/base.html:52
+msgid "Submit media"
+msgstr "Inoltra file multimediale"
+
+#: mediagoblin/templates/mediagoblin/base.html:63
+msgid "verify your email!"
+msgstr "verifica il tuo indirizzo email!"
+
+#: mediagoblin/templates/mediagoblin/base.html:73
+#: mediagoblin/templates/mediagoblin/auth/login.html:26
+#: mediagoblin/templates/mediagoblin/auth/login.html:34
+msgid "Log in"
+msgstr "Accedi"
+
+#: mediagoblin/templates/mediagoblin/base.html:89
+msgid ""
+"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
+"href=\"http://gnu.org/\">GNU</a> project"
+msgstr ""
+"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un progetto "
+"<a href=\"http://gnu.org/\">GNU</a>"
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+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:29
+msgid "The perfect place for your media!"
+msgstr "Il posto perfetto per i tuoi documenti multimediali!"
+
+#: mediagoblin/templates/mediagoblin/root.html:30
+msgid ""
+"A place for people to collaborate and show off original and derived "
+"creations!"
+msgstr ""
+"Un posto per collaborare con altri e mostrare le proprie creazioni originali"
+" e 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 ""
+"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
+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 "Eccitato di unirti a noi?"
+
+#: 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr "Documenti multimediali più recenti"
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr "Inserisci la tua nuova password"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
+msgid "Logging in failed!"
+msgstr "Accesso fallito!"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:42
+msgid "Don't have an account yet?"
+msgstr "Non hai ancora un account?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:45
+msgid "Create one here!"
+msgstr "Creane uno qui!"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr "Hai dimenticato la password?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:27
+msgid "Create an account!"
+msgstr "Crea un account!"
+
+#: mediagoblin/templates/mediagoblin/auth/register.html:30
+msgid "Create"
+msgstr "Crea"
+
+#: 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 ""
+"Ciao %(username)s,\n"
+"\n"
+"per attivare il tuo account GNU MediaGoblin, apri il seguente URL nel tuo navigatore web.\n"
+"\n"
+"%(verification_url)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:29
+#, python-format
+msgid "Editing %(media_title)s"
+msgstr "Stai modificando %(media_title)s"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
+msgid "Cancel"
+msgstr "Annulla"
+
+#: mediagoblin/templates/mediagoblin/edit/edit.html:37
+#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
+msgid "Save changes"
+msgstr "Salva i cambiamenti"
+
+#: 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/submit/start.html:26
+msgid "Submit yer media"
+msgstr "Inoltra documento multimediale"
+
+#: mediagoblin/templates/mediagoblin/submit/start.html:29
+msgid "Submit"
+msgstr "Conferma"
+
+#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
+#, 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_confirm_delete.html:30
+#, python-format
+msgid "Really delete %(title)s?"
+msgstr "Vuoi davvero cancellare %(title)s?"
+
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
+msgstr "Cancella permanentemente"
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
+msgid "Media processing panel"
+msgstr "Pannello di elaborazione media"
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
+msgid ""
+"You can track the state of media being processed for your gallery here."
+msgstr "Puoi seguire lo stato dell'elaborazione per la tua galleria qui."
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
+msgid "Media in-processing"
+msgstr "Media in elaborazione"
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
+msgid "No media in-processing"
+msgstr "Nessun documento multimediale in elaborazione"
+
+#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
+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
+msgid "Email verification needed"
+msgstr "è necessario verificare email"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
+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
+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
+msgid "In case it doesn't:"
+msgstr "Nel caso non fosse:"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
+msgid "Resend verification email"
+msgstr "Rispedisci email di verifica"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
+msgid ""
+"Someone has registered an account with this username, but it still has to be"
+" activated."
+msgstr ""
+"Qualcuno ha registrato un account con questo nome utente, ma deve ancora "
+"essere attivato."
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
+#, 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 ""
+"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
+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
+msgid "Edit profile"
+msgstr "Modifica profilo"
+
+#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
+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
+#, 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
+msgid ""
+"This is where your media will appear, but you don't seem to have added "
+"anything yet."
+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
+msgid "There doesn't seem to be any media here yet..."
+msgstr "Non sembra ci sia ancora nessun documento multimediali qui.."
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
+msgid "feed icon"
+msgstr "feed icon"
+
+#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
+msgid "Atom feed"
+msgstr "Atom feed"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr "Più nuovo"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr "Più vecchio"
+
+#: mediagoblin/user_pages/forms.py:24
+msgid "Comment"
+msgstr "Commento"
+
+#: 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:175
+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 "
+"attenzione."
+
+
diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo
index 6308eaa6..4bdc4d5a 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 089a352a..ebc8ad52 100644
--- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po
@@ -2,13 +2,14 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <averym@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: 2011-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,102 +19,100 @@ msgstr ""
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "ユーザネーム"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "パスワード"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "パスワードが一致している必要があります。"
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "パスワードを確認"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "メールアドレス"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "申し訳ありませんが、このインスタンスで登録は無効になっています。"
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "申し訳ありませんが、その名前を持つユーザーがすでに存在しています。"
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr ""
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "メアドが確認されています。これで、ログインしてプロファイルを編集し、画像を提出することができます!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "検証キーまたはユーザーIDが間違っています"
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "検証メールを再送しました。"
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "タイトル"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "タグ"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "スラグ"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "スラグは必要です。"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "タグ"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "自己紹介"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "URL"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr "そのスラグを持つエントリは、このユーザーは既に存在します。"
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr "あなたは、他のユーザーのメディアを編集しています。ご注意ください。"
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr "あなたは、他のユーザーのプロファイルを編集しています。ご注意ください。"
@@ -125,6 +124,10 @@ msgstr ""
msgid "File"
msgstr "ファイル"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "ファイルを提供する必要があります。"
@@ -183,6 +186,10 @@ msgid ""
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
msgstr ""
@@ -222,6 +229,53 @@ msgid ""
" 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr ""
@@ -234,6 +288,14 @@ msgstr "まだアカウントを持っていませんか?"
msgid "Create one here!"
msgstr "ここで作成!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "アカウントを作成!"
@@ -264,12 +326,12 @@ msgid "Editing %(media_title)s"
msgstr "%(media_title)sを編集中"
#: 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_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "投稿する"
@@ -305,10 +367,8 @@ msgstr "申し訳ありませんが、そのユーザーは見つかりません
msgid "Really delete %(title)s?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
@@ -412,11 +472,23 @@ msgstr ""
msgid "Atom feed"
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr ""
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr ""
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:175
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 809cd90d..57447395 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 7eed6f4e..c982eb95 100644
--- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po
@@ -2,13 +2,14 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <mail@jefvanschendel.nl>, 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-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,55 +19,43 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Gebruikersnaam"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Wachtwoord"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Wachtwoorden moeten overeenkomen."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "Bevestig wachtwoord"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "E-mail adres"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "Sorry, registratie is uitgeschakeld op deze instantie."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "Sorry, er bestaat al een gebruiker met die naam."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "Sorry, dat e-mailadres is al ingenomen."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -74,50 +63,60 @@ msgstr ""
"Uw e-mailadres is geverifieerd. U kunt nu inloggen, uw profiel bewerken, en "
"afbeeldingen toevoegen!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "De verificatie sleutel of gebruikers-ID is onjuist"
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "Verificatie e-mail opnieuw opgestuurd."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Etiket"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Etiket"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Bio"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Website"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
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:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
"U bent een gebruikersprofiel aan het aanpassen. Ga voorzichtig te werk."
@@ -130,6 +129,10 @@ msgstr ""
msgid "File"
msgstr "Bestand"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "U moet een bestand aangeven."
@@ -188,6 +191,10 @@ msgid ""
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
msgstr ""
@@ -227,6 +234,53 @@ msgid ""
" 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr ""
@@ -239,6 +293,14 @@ msgstr "Heeft u nog geen account?"
msgid "Create one here!"
msgstr "Maak er hier een!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "Maak een account aan!"
@@ -266,12 +328,12 @@ msgid "Editing %(media_title)s"
msgstr "%(media_title)s aanpassen"
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Annuleren"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Wijzigingen opslaan"
@@ -307,10 +369,8 @@ msgstr "Sorry, die gebruiker kon niet worden gevonden."
msgid "Really delete %(title)s?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
@@ -418,11 +478,23 @@ msgstr ""
msgid "Atom feed"
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr ""
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Commentaar"
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:175
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo
index 8c196295..7bf5a87a 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 c4b42d89..4e1c382b 100644
--- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po
@@ -2,13 +2,14 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <odin.omdal@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: 2011-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,55 +19,43 @@ msgstr ""
"Language: nn_NO\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Brukarnamn"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Passord"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Passorda må vera like."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "Gjenta passord"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "E-postadresse"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "Registrering er slege av. Orsak."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "Ein konto med dette brukarnamnet finst allereide."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "Den epostadressa er allereide teken."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -74,48 +63,58 @@ msgstr ""
"E-postadressa di, og dimed kontoen din er stadfesta. Du kan no logga inn, "
"endra profilen din og lasta opp filer."
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "Stadfestingsnykelen eller brukar-ID-en din er feil."
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "Send ein ny stadfestingsepost."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Tittel"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Merkelappar"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Adressetittel"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Adressetittelen kan ikkje vera tom"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Merkelappar"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Presentasjon"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Heimeside"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr "Eit innlegg med denne adressetittelen finst allereie."
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr "Ver forsiktig, du redigerer ein annan konto sitt innlegg."
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Ver forsiktig, du redigerer ein annan konto sin profil."
@@ -127,6 +126,10 @@ msgstr "Ugyldig fil for mediatypen."
msgid "File"
msgstr "Fil"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "Du må velja ei fil."
@@ -186,6 +189,10 @@ msgid ""
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
msgstr "Hei der mediaentusiast, MediaGoblin..."
@@ -232,6 +239,53 @@ msgstr ""
"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 ""
+
+#: 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr "Innlogging feila"
@@ -244,6 +298,14 @@ msgstr "Har du ingen konto?"
msgid "Create one here!"
msgstr "Lag ein!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "Lag ein konto."
@@ -274,12 +336,12 @@ msgid "Editing %(media_title)s"
msgstr "Redigerer %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Avbryt"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Lagra"
@@ -315,10 +377,8 @@ msgstr "Fann ingen slik brukar"
msgid "Really delete %(title)s?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
@@ -424,11 +484,23 @@ msgstr " "
msgid "Atom feed"
msgstr "Atom-kjelde"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr ""
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Innspel"
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:175
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo
index 28cf6af2..189733f6 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 8c5ab19e..6d0195fe 100644
--- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po
@@ -2,13 +2,14 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <snd.noise@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: 2011-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+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"
@@ -18,55 +19,43 @@ msgstr ""
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Nome de Usuário"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Senha"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Senhas devem ser iguais."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "Confirmar senha"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "Endereço de email"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "Desculpa, o registro está desativado neste momento."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "Desculpe, um usuário com este nome já existe."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr ""
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -74,48 +63,58 @@ 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:166
+#: mediagoblin/auth/views.py:171
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:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "O email de verificação foi reenviado."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Título"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Tags"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Tags"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Biográfia"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Website"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
@@ -127,6 +126,10 @@ msgstr ""
msgid "File"
msgstr "Arquivo"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "Você deve fornecer um arquivo."
@@ -185,6 +188,10 @@ msgid ""
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
msgstr ""
@@ -224,6 +231,53 @@ msgid ""
" 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr ""
@@ -236,6 +290,14 @@ msgstr "Ainda não tem conta?"
msgid "Create one here!"
msgstr "Crie uma aqui!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "Criar uma conta!"
@@ -266,12 +328,12 @@ msgid "Editing %(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
msgid "Cancel"
msgstr "Cancelar"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Salvar mudanças"
@@ -307,10 +369,8 @@ msgstr "Desculpe, tal usuário não encontrado."
msgid "Really delete %(title)s?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
@@ -416,11 +476,23 @@ msgstr ""
msgid "Atom feed"
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr ""
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr ""
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:175
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo
index 4c3e785c..f43e25f6 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 1c366b06..2d2ce467 100644
--- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po
@@ -2,13 +2,14 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <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-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,107 +19,109 @@ 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:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Nume de utilizator"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Parolă"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Parolele trebuie să fie identice."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
-msgstr "Reintroduceți parola"
+msgstr "Reintrodu parola"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
+msgstr "Introdu parola din nou pentru verificare."
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "Adresa de e-mail"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
-msgstr "Ne pare rău, dar înscrierile sunt dezactivate pe această instanță."
+msgstr "Ne pare rău, dar înscrierile sunt dezactivate pe acest server."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
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:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "Ne pare rău, această adresă de e-mail este deja rezervată."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-"Adresa dvs. de e-mail a fost confirmată. Puteți să vă autentificați, să vă "
-"modificați profilul și să trimiteți imagini!"
+"Adresa ta de e-mail a fost confirmată. Poți să te autentifici, să îți "
+"completezi profilul și să trimiți imagini!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "Cheie de verificare sau user ID incorect."
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "E-mail-ul de verificare a fost retrimis."
+#: mediagoblin/auth/views.py:228
+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ă."
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titlu"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Etichete"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Identificator"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Identificatorul nu poate să lipsească"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Etichete"
+#: mediagoblin/edit/forms.py:35
+msgid ""
+"The title part of this media's URL. 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Biografie"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Sit Web"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
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:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
-msgstr "Editați fișierul unui alt utilizator. Se recomandă prudență."
+msgstr "Editezi fișierul unui alt utilizator. Se recomandă prudență."
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
-msgstr "Editați profilul unui utilizator. Se recomandă prudență."
+msgstr "Editezi profilul unui utilizator. Se recomandă prudență."
#: mediagoblin/process_media/errors.py:44
msgid "Invalid file given for media type."
@@ -128,9 +131,13 @@ msgstr "Formatul fișierului nu corespunde cu tipul de media selectat."
msgid "File"
msgstr "Fișier"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Descrierea acestui fișier"
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
-msgstr "Trebuie să selectați un fișier."
+msgstr "Trebuie să selectezi un fișier."
#: mediagoblin/submit/views.py:50
msgid "The file doesn't seem to be an image!"
@@ -153,8 +160,8 @@ msgid ""
"If you're sure the address is correct, maybe the page you're looking for has"
" been moved or deleted."
msgstr ""
-"Dacă sunteți sigur că adresa este coresctă, poate că pagina pe care o "
-"căutați a fost mutată sau ștearsă."
+"Dacă ești sigur că adresa este 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"
@@ -170,11 +177,11 @@ msgstr "logo MediaGoblin"
#: mediagoblin/templates/mediagoblin/base.html:52
msgid "Submit media"
-msgstr "Transmiteți un fișier media"
+msgstr "Transmite un fișier media"
#: mediagoblin/templates/mediagoblin/base.html:63
msgid "verify your email!"
-msgstr "verificați e-mail-ul!"
+msgstr "verifică e-mail-ul!"
#: mediagoblin/templates/mediagoblin/base.html:73
#: mediagoblin/templates/mediagoblin/auth/login.html:26
@@ -187,6 +194,12 @@ msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+"Construit cu <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un proiect "
+"<a href=\"http://gnu.org/\">GNU</a>"
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr "Explorează"
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
@@ -225,7 +238,7 @@ msgid ""
" including video support!)"
msgstr ""
"Proiectat să fie extensibil. (Software-ul va avea în curând suport pentru "
-"multiple formate de media, inclusiv pentru video!)"
+"mai multe formate de media, inclusiv pentru video!)"
#: mediagoblin/templates/mediagoblin/root.html:34
msgid ""
@@ -237,21 +250,83 @@ msgstr ""
"href=\"http://mediagoblin.org/pages/join.html\">Ne poți ajuta să îmbunătățim"
" acest software!</a>)"
+#: mediagoblin/templates/mediagoblin/root.html:38
+msgid "Excited to join us?"
+msgstr "Vrei să ni te alături?"
+
+#: 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr "Cele mai recente fișiere"
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr "Introdu noua parolă"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+msgid "Enter your username or email"
+msgstr "Introdu numele de utilizator sau adresa de e-mail"
+
+#: 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/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/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 ""
+"Bună, %(username)s\n"
+"\n"
+"Pentru a modifica parola ta la GNU MediaGoblin, accesează adresa următoare:\n"
+"\n"
+"%(verification_url)s\n"
+"\n"
+"Dacă ai primit acest mesaj din greșeală, ignoră-l și fii mai departe un elf fericit!"
+
#: mediagoblin/templates/mediagoblin/auth/login.html:29
msgid "Logging in failed!"
msgstr "Autentificare eșuată!"
#: mediagoblin/templates/mediagoblin/auth/login.html:42
msgid "Don't have an account yet?"
-msgstr "Nu aveți un cont?"
+msgstr "Nu ai un cont?"
#: mediagoblin/templates/mediagoblin/auth/login.html:45
msgid "Create one here!"
-msgstr "Creați-l aici!"
+msgstr "Creează-l aici!"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr "Ai uitat parola?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr "Schimb-o!"
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
-msgstr "Creați un cont!"
+msgstr "Creează un cont!"
#: mediagoblin/templates/mediagoblin/auth/register.html:30
msgid "Create"
@@ -269,7 +344,7 @@ msgid ""
msgstr ""
"Bună, %(username)s,\n"
"\n"
-"pentru activarea contului tău GNU MediaGoblin, accesează adresa următoare:\n"
+"pentru activarea contului tău la GNU MediaGoblin, accesează adresa următoare:\n"
"\n"
"%(verification_url)s"
@@ -279,12 +354,12 @@ msgid "Editing %(media_title)s"
msgstr "Editare %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Anulare"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Salvează modificările"
@@ -318,13 +393,11 @@ msgstr "Ne pare rău, nu am găsit utilizatorul căutat."
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "Sigur dorești să ștergi %(title)s?"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
+msgstr "Șterge definitiv"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
@@ -350,7 +423,7 @@ 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
msgid "Email verification needed"
-msgstr "Este necesară verificarea adresei de e-mail"
+msgstr "Este necesară confirmarea adresei de e-mail"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
msgid "Almost done! Your account still needs to be activated."
@@ -359,11 +432,11 @@ msgstr "Aproape gata! Mai trebuie doar să activezi contul."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
msgid ""
"An email should arrive in a few moments with instructions on how to do so."
-msgstr "Veți primi în scurt timp un mesaj prin e-mail cu instrucțiuni."
+msgstr "Vei primi în scurt timp un mesaj prin e-mail cu instrucțiuni."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
msgid "In case it doesn't:"
-msgstr "Dacă nu primiți mesajul:"
+msgstr "Dacă nu primești mesajul:"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
msgid "Resend verification email"
@@ -383,9 +456,8 @@ 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 ""
-"Dacă dvs. sunteți persoana respectivă și nu mai aveți e-mail-ul de "
-"verificare, puteți să vă <a href=\"%(login_url)s\">autentificați</a> pentru "
-"a-l retrimite."
+"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
@@ -408,7 +480,7 @@ msgstr "Acest utilizator nu și-a completat (încă) profilul."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
#, python-format
msgid "View all of %(username)s's media"
-msgstr "Toate fișierele media ale lui %(username)s"
+msgstr "Vezi toate fișierele media ale lui %(username)s"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
msgid ""
@@ -434,12 +506,26 @@ 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:46
+msgid "Older"
+msgstr "Mai vechi"
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Scrie un comentariu"
-#: mediagoblin/user_pages/views.py:176
+#: 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:175
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
+"Urmează să ștergi fișierele media ale unui alt utilizator. Se recomandă "
+"prudență."
diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo
index babdb60e..c1eab2ba 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 6fee7f3a..ffdeab2e 100644
--- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po
@@ -2,13 +2,14 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <deletesoftware@yandex.ru>, 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-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,55 +19,43 @@ 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:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Логин"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Пароль"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Пароли должны совпадать."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "Подтвердите пароль"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
+msgstr "Наберите его ещё раз здесь, чтобы избежать опечаток."
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "Адрес электронной почты"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "Извините, на этом разделе регистрация запрещена."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "Извините, пользователь с этим именем уже зарегистрирован."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
-msgstr "Извините, этот адрес электнонной почты уже занят."
+msgstr "Извините, этот адрес электронной почты уже занят."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -74,49 +63,61 @@ msgstr ""
"Адрес вашей электронной потвержден. Вы теперь можете войти и начать "
"редактировать свой профиль и загружать новые изображения!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "Неверный ключ проверки или идентификатор пользователя"
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "Переслать сообщение с подтверждением аккаунта."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Название"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Метки"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Отличительная часть адреса"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Отличительная часть адреса необходима"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Метки"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
-msgstr "Биограаия"
+msgstr "Биография"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Сайт"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr ""
"У этого пользователя уже есть файл с такой отличительной частью адреса."
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr "Вы редактируете файлы другого пользователя. Будьте осторожны."
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Вы редактируете профиль пользователя. Будьте осторожны."
@@ -128,6 +129,10 @@ msgstr "Неправильный формат файла."
msgid "File"
msgstr "Файл"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Описание этого произведения"
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "Вы должны загрузить файл."
@@ -186,9 +191,13 @@ msgid ""
"href=\"http://gnu.org/\">GNU</a> project"
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 это..."
+msgstr "Привет, любитель мультимедиа! MediaGoblin…"
#: mediagoblin/templates/mediagoblin/root.html:29
msgid "The perfect place for your media!"
@@ -206,7 +215,7 @@ msgstr ""
msgid ""
"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
"after all.)"
-msgstr ""
+msgstr "Свободное ПО. (Мы же проект <a href=\"http://gnu.org\">GNU</a>.)"
#: mediagoblin/templates/mediagoblin/root.html:32
msgid ""
@@ -221,6 +230,8 @@ msgid ""
"Built for extensibility. (Multiple media types coming soon to the software,"
" including video support!)"
msgstr ""
+"Рассчитан на расширяемость. (В программе скоро должна появиться поддержка "
+"других видов мультимедиа, таких как видео!)"
#: mediagoblin/templates/mediagoblin/root.html:34
msgid ""
@@ -232,6 +243,53 @@ msgstr ""
"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"
+" or\n"
+" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr "Самые новые файлы"
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr "Введите свой новый пароль"
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr "Авторизация неуспешна!"
@@ -244,6 +302,14 @@ msgstr "Ещё нету аккаунта?"
msgid "Create one here!"
msgstr "Создайте здесь!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr "Забыли свой пароль?"
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr "Смените его!"
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "Создать аккаунт!"
@@ -274,12 +340,12 @@ msgid "Editing %(media_title)s"
msgstr "Редактирование %(media_title)s"
#: 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_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Сохранить изменения"
@@ -303,7 +369,7 @@ msgstr "Подтвердить"
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
-msgstr ""
+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
@@ -313,13 +379,11 @@ msgstr "Извините, но такой пользователь не найд
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "Действительно удалить %(title)s?"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
-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"
@@ -346,11 +410,11 @@ msgstr "Обработка этих файлов вызвала ошибку:"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
msgid "Email verification needed"
-msgstr "Нужно подтверджение почтового адреса"
+msgstr "Нужно подтверждение почтового адреса"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
msgid "Almost done! Your account still needs to be activated."
-msgstr "Почти закончили! Теперь надо активизировать ваш аккаунт."
+msgstr "Почти закончили! Теперь надо активировать ваш аккаунт."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
msgid ""
@@ -365,13 +429,13 @@ msgstr "А если нет, то:"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
msgid "Resend verification email"
-msgstr "Повторно отправить подверждение на адрес электнонной почты"
+msgstr "Повторно отправить подверждение на адрес электронной почты"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
-msgstr "Кто-то создал аккаунт с этим именем, но его еще надо активизировать."
+msgstr "Кто‐то создал аккаунт с этим именем, но его еще надо активировать."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
#, python-format
@@ -379,8 +443,8 @@ 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> и отпраыить его повторно."
+"Если это были вы, и если вы потеряли сообщение для подтверждения аккаунта, "
+"то вы можете <a href=\"%(login_url)s\">войти</a> и отправить его повторно."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
#, python-format
@@ -409,7 +473,7 @@ msgstr "Смотреть все файлы %(username)s"
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
-msgstr "Ваши файлы появятся здесь, кодга вы их добавите."
+msgstr "Ваши файлы появятся здесь, когда вы их добавите."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
msgid "Add media"
@@ -417,22 +481,34 @@ msgstr "Добавить файлы"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
msgid "There doesn't seem to be any media here yet..."
-msgstr "Пока что тут файлов нет..."
+msgstr "Пока что тут файлов нет…"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
-msgstr ""
+msgstr "значок ленты"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
msgstr "лента в формате Atom"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr "Более новые"
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr "Более старые"
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Комментарий"
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr "Я уверен, что хочу удалить это"
+
+#: mediagoblin/user_pages/views.py:175
msgid "You are about to delete another user's media. Proceed with caution."
-msgstr ""
+msgstr "Вы на пороге удаления файла другого пользователя. Будьте осторожны."
diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo
index 97723319..4c433381 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 c2a28308..39c6b9a5 100644
--- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po
@@ -2,13 +2,14 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# Jure Repinc <jlp@holodeck1.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-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,55 +19,43 @@ 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:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Uporabniško ime"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Geslo"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Gesli morata biti enaki."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "Potrdite geslo"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "E-poštni naslov"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "Oprostite, prijava za ta izvod ni omogočena."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "Oprostite, uporabnik s tem imenom že obstaja."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "Oprostite, ta e-poštni naslov je že v uporabi."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -74,48 +63,58 @@ msgstr ""
"Vaš e-poštni naslov je bil potrjen. Sedaj se lahko prijavite, uredite svoj "
"profil in pošljete slike."
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "Potrditveni ključ ali uporabniška identifikacija je napačna"
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "Ponovno pošiljanje potrditvene e-pošte."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Naslov"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Oznake"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Oznaka"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Oznaka ne sme biti prazna"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Oznake"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Biografija"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Spletna stran"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
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:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr "Urejate vsebino drugega uporabnika. Nadaljujte pazljivo."
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Urejate uporabniški profil. Nadaljujte pazljivo."
@@ -127,6 +126,10 @@ msgstr "Za vrsto vsebine je bila podana napačna datoteka."
msgid "File"
msgstr "Datoteka"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "Podati morate datoteko."
@@ -187,6 +190,10 @@ msgid ""
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
msgstr "Pozdravljen, ljubitelj večpredstavnostnih vsebin! MediaGoblin je ..."
@@ -235,6 +242,53 @@ msgstr ""
"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?"
+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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr "Prijava ni uspela."
@@ -247,6 +301,14 @@ msgstr "Še nimate računa?"
msgid "Create one here!"
msgstr "Ustvarite si ga."
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "Ustvarite račun."
@@ -278,12 +340,12 @@ msgid "Editing %(media_title)s"
msgstr "Urejanje %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Prekliči"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Shrani spremembe"
@@ -319,10 +381,8 @@ msgstr "Oprostite, tega uporabnika ni bilo moč najti."
msgid "Really delete %(title)s?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
@@ -430,11 +490,23 @@ msgstr "Ikona vira"
msgid "Atom feed"
msgstr "Ikona Atom"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr ""
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Komentar"
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:175
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 d3336ad0..3c5d864b 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 e37ae3c1..8f2373c8 100644
--- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po
@@ -2,12 +2,13 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU MediaGoblin\n"
"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n"
-"POT-Creation-Date: 2011-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+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"
@@ -17,102 +18,100 @@ 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:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr ""
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr ""
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr ""
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr ""
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr ""
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr ""
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr ""
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr ""
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr ""
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr ""
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr ""
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr ""
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr ""
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr ""
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr ""
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr ""
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr ""
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr ""
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr ""
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr ""
@@ -124,6 +123,10 @@ msgstr ""
msgid "File"
msgstr ""
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr ""
@@ -182,6 +185,10 @@ msgid ""
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
msgstr ""
@@ -221,6 +228,53 @@ msgid ""
" 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr ""
@@ -233,6 +287,14 @@ msgstr ""
msgid "Create one here!"
msgstr ""
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr ""
@@ -258,12 +320,12 @@ 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_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr ""
@@ -299,10 +361,8 @@ msgstr ""
msgid "Really delete %(title)s?"
msgstr ""
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
@@ -406,11 +466,23 @@ msgstr ""
msgid "Atom feed"
msgstr ""
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr ""
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr ""
-#: mediagoblin/user_pages/views.py:176
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
+msgstr ""
+
+#: mediagoblin/user_pages/views.py:175
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 f84cb70a..2cdf2fee 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 b3883533..08a4bc15 100644
--- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po
@@ -2,13 +2,14 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <transifex@wandborg.se>, 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-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+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"
@@ -18,55 +19,43 @@ msgstr ""
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "Användarnamn"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "Lösenord"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "Lösenorden måste vara identiska."
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "Bekräfta lösenord"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
+msgstr "Skriv in det igen för att undvika stavfel."
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "E-postadress"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "Vi beklagar, registreringen är avtängd på den här instansen."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "En användare med det användarnamnet finns redan."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "Den e-postadressen är redan tagen."
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
@@ -74,48 +63,58 @@ msgstr ""
"Din e-postadress är verifierad. Du kan nu logga in, redigera din profil och "
"ladda upp filer!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "Verifieringsnyckeln eller användar-IDt är fel."
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "Skickade ett nytt verifierings-email."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
msgstr "Titel"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "Taggar"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Sökvägsnamn"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Sökvägsnamnet kan inte vara tomt"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "Taggar"
+#: mediagoblin/edit/forms.py:35
+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."
-#: mediagoblin/edit/forms.py:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
msgstr "Presentation"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "Hemsida"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
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:95
+#: mediagoblin/edit/views.py:84
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:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr "Var försiktig, du redigerar en annan användares profil."
@@ -127,6 +126,10 @@ msgstr "Ogiltig fil för mediatypen."
msgid "File"
msgstr "Fil"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr "Beskrivning av verket"
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "Du måste ange en fil"
@@ -186,6 +189,12 @@ msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+"Drivs av <a href=\"http://mediagoblin.org\">MediaGoblin</a>, ett <a "
+"href=\"http://gnu.org/\">GNU</a>-projekt"
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
@@ -240,6 +249,53 @@ msgstr ""
"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 ""
+
+#: 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>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr "Inloggning misslyckades!"
@@ -252,6 +308,14 @@ msgstr "Har du inget konto?"
msgid "Create one here!"
msgstr "Skapa ett!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "Skapa ett konto!"
@@ -282,12 +346,12 @@ msgid "Editing %(media_title)s"
msgstr "Redigerar %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Avbryt"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Spara"
@@ -321,13 +385,11 @@ msgstr "Finns ingen sådan användare ännu."
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "Vill du verkligen radera %(title)s?"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
-msgstr ""
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
+msgstr "Radera permanent"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
@@ -438,12 +500,24 @@ 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:46
+msgid "Older"
+msgstr "Äldre"
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Kommentar"
-#: mediagoblin/user_pages/views.py:176
+#: 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:175
msgid "You are about to delete another user's media. Proceed with caution."
-msgstr ""
+msgstr "Du tänker radera en annan användares media. Var försiktig."
diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo
index e2cdd52f..adc3548e 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 3020df07..1d86f1f9 100644
--- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
+++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po
@@ -2,13 +2,15 @@
# Copyright (C) 2011 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
#
+# Translators:
# <chc@citi.sinica.edu.tw>, 2011.
+# Harry Chen <harryhow@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: 2011-08-30 22:51-0500\n"
-"PO-Revision-Date: 2011-08-31 03:51+0000\n"
+"POT-Creation-Date: 2011-09-25 20:26-0500\n"
+"PO-Revision-Date: 2011-09-26 01:25+0000\n"
"Last-Translator: cwebber <cwebber@dustycloud.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
@@ -18,102 +20,100 @@ msgstr ""
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0\n"
-#: mediagoblin/auth/forms.py:24 mediagoblin/auth/forms.py:54
+#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49
msgid "Username"
msgstr "使用者名稱"
-#: mediagoblin/auth/forms.py:28
-msgid "This is the name other users will identify you with."
-msgstr ""
-
-#: mediagoblin/auth/forms.py:31 mediagoblin/auth/forms.py:58
+#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53
msgid "Password"
msgstr "密碼"
-#: mediagoblin/auth/forms.py:36
+#: mediagoblin/auth/forms.py:35
msgid "Passwords must match."
msgstr "密碼必須一致"
#: mediagoblin/auth/forms.py:37
-msgid "Try to use a strong password!"
-msgstr ""
-
-#: mediagoblin/auth/forms.py:40
msgid "Confirm password"
msgstr "確認密碼"
-#: mediagoblin/auth/forms.py:42
+#: mediagoblin/auth/forms.py:39
msgid "Type it again here to make sure there are no spelling mistakes."
-msgstr ""
+msgstr "再輸入一次,確定你沒有打錯字。"
-#: mediagoblin/auth/forms.py:45
+#: mediagoblin/auth/forms.py:42
msgid "Email address"
msgstr "電子郵件位置"
-#: mediagoblin/auth/forms.py:48
-msgid "Your email will never be published."
-msgstr ""
-
-#: mediagoblin/auth/views.py:40
+#: mediagoblin/auth/views.py:42
msgid "Sorry, registration is disabled on this instance."
msgstr "抱歉, 這個項目已經被暫停註冊."
-#: mediagoblin/auth/views.py:58
+#: mediagoblin/auth/views.py:60
msgid "Sorry, a user with that name already exists."
msgstr "抱歉, 這個使用者名稱已經存在."
-#: mediagoblin/auth/views.py:62
+#: mediagoblin/auth/views.py:64
msgid "Sorry, that email address has already been taken."
msgstr "抱歉,這個電子郵件已經被其他人使用了。"
-#: mediagoblin/auth/views.py:160
+#: mediagoblin/auth/views.py:165
msgid ""
"Your email address has been verified. You may now login, edit your profile, "
"and submit images!"
msgstr "你的電子郵件位址已被認證. 你現在就可以登入, 編輯你的個人檔案而且遞交照片!"
-#: mediagoblin/auth/views.py:166
+#: mediagoblin/auth/views.py:171
msgid "The verification key or user id is incorrect"
msgstr "認證碼或是使用者帳號錯誤"
-#: mediagoblin/auth/views.py:187
-#: mediagoblin/templates/mediagoblin/auth/resent_verification_email.html:22
+#: mediagoblin/auth/views.py:192
msgid "Resent your verification email."
msgstr "重送認證信."
+#: mediagoblin/auth/views.py:228
+msgid ""
+"Could not send password recovery email as your username is inactive or your "
+"account's email address has not been verified."
+msgstr ""
+
#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27
msgid "Title"
-msgstr "稱謂"
+msgstr "標題"
-#: mediagoblin/edit/forms.py:29
+#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
+msgid "Tags"
+msgstr "標籤"
+
+#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "自訂字串"
-#: mediagoblin/edit/forms.py:30
+#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "自訂字串不能空白"
-#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
-msgid "Tags"
-msgstr "標籤"
+#: 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:38
+#: mediagoblin/edit/forms.py:42
msgid "Bio"
-msgstr "自傳"
+msgstr "自我介紹"
-#: mediagoblin/edit/forms.py:41
+#: mediagoblin/edit/forms.py:45
msgid "Website"
msgstr "網站"
-#: mediagoblin/edit/views.py:66
+#: mediagoblin/edit/views.py:63
msgid "An entry with that slug already exists for this user."
msgstr "這個自訂字串已經被其他人用了"
-#: mediagoblin/edit/views.py:95
+#: mediagoblin/edit/views.py:84
msgid "You are editing another user's media. Proceed with caution."
msgstr "你正在編輯他人的媒體檔案. 請謹慎處理."
-#: mediagoblin/edit/views.py:166
+#: mediagoblin/edit/views.py:154
msgid "You are editing a user's profile. Proceed with caution."
msgstr "你正在編輯一位用戶的檔案. 請謹慎處理."
@@ -125,6 +125,10 @@ msgstr "指定錯誤的媒體類別!"
msgid "File"
msgstr "檔案"
+#: mediagoblin/submit/forms.py:30
+msgid "Description of this work"
+msgstr ""
+
#: mediagoblin/submit/views.py:47
msgid "You must provide a file."
msgstr "你必須提供一個檔案"
@@ -135,7 +139,7 @@ msgstr "檔案似乎不是一個圖片喔!"
#: mediagoblin/submit/views.py:122
msgid "Woohoo! Submitted!"
-msgstr "呼嚕! 送出去了!"
+msgstr "呼呼! 送出去嚕!"
#: mediagoblin/templates/mediagoblin/404.html:21
msgid "Oops!"
@@ -182,10 +186,16 @@ msgid ""
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
"href=\"http://gnu.org/\">GNU</a> project"
msgstr ""
+"由 <a href=\"http://mediagoblin.org\">MediaGoblin</a>製作, 它是一個 <a "
+"href=\"http://gnu.org/\">GNU</a> 專案"
+
+#: mediagoblin/templates/mediagoblin/root.html:24
+msgid "Explore"
+msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:27
msgid "Hi there, media lover! MediaGoblin is..."
-msgstr "嗨!媒體愛好者!MediaGoblin是..."
+msgstr "嗨!多媒體檔案愛好者!MediaGoblin是..."
#: mediagoblin/templates/mediagoblin/root.html:29
msgid "The perfect place for your media!"
@@ -195,7 +205,7 @@ msgstr "你的媒體檔案的最佳所在!"
msgid ""
"A place for people to collaborate and show off original and derived "
"creations!"
-msgstr "這是一個地方,可以讓人們協同且展示他們的創作或是衍生作品!"
+msgstr "這是一個可以讓人們共同展示他們的創作、衍生作品的地方!"
#: mediagoblin/templates/mediagoblin/root.html:31
msgid ""
@@ -207,13 +217,13 @@ msgstr "免費但是我們更重視自由 (畢竟我們是個 <a href=\"http://g
msgid ""
"Aiming to make the world a better place through decentralization and "
"(eventually, coming soon!) federation!"
-msgstr "目的是要透過分散式且自由的方式讓這個世界更美好!(終究,很快就會到來的!)"
+msgstr "目的是要透過分散式且自由的方式讓這個世界更美好!(總有一天,它很快會到來的!)"
#: mediagoblin/templates/mediagoblin/root.html:33
msgid ""
"Built for extensibility. (Multiple media types coming soon to the software,"
" including video support!)"
-msgstr "天生的擴充性. (軟體將支援多種多媒體格式, 也支援影音檔案!)"
+msgstr "天生的擴充性。(軟體將支援多種多媒體格式, 也支援影音檔案!)"
#: mediagoblin/templates/mediagoblin/root.html:34
msgid ""
@@ -224,6 +234,53 @@ 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"
+" or\n"
+" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/root.html:53
+msgid "Most recent media"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
+msgid "Enter your new password"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
+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."
+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/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:29
msgid "Logging in failed!"
msgstr "登入失敗!"
@@ -236,6 +293,14 @@ msgstr "還沒有帳號嗎?"
msgid "Create one here!"
msgstr "在這裡建立一個吧!"
+#: mediagoblin/templates/mediagoblin/auth/login.html:48
+msgid "Forgot your password?"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/auth/login.html:51
+msgid "Change it!"
+msgstr ""
+
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "建立一個帳號!"
@@ -266,12 +331,12 @@ msgid "Editing %(media_title)s"
msgstr "編輯 %(media_title)s 中"
#: 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_profile.html:35
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "儲存變更"
@@ -282,7 +347,7 @@ msgstr "編輯 %(username)s'的檔案中"
#: mediagoblin/templates/mediagoblin/listings/tag.html:31
msgid "Media tagged with:"
-msgstr "媒體被標籤為:"
+msgstr "媒體檔案被標籤為:"
#: mediagoblin/templates/mediagoblin/submit/start.html:26
msgid "Submit yer media"
@@ -295,7 +360,7 @@ msgstr "送出"
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
#, python-format
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
-msgstr "<a href=\"%(user_url)s\">%(username)s</a>的媒體"
+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
@@ -305,12 +370,10 @@ msgstr "抱歉,找不到這個使用者."
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
-msgstr ""
+msgstr "真的要刪除 %(title)s?"
-#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
-msgid ""
-"If you choose yes, the media entry will be deleted "
-"<strong>permanently.</strong>"
+#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
+msgid "Delete Permanently"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
@@ -328,7 +391,7 @@ msgstr "媒體處理中"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
-msgstr "沒有媒體正在處理"
+msgstr "沒有正在處理中的媒體"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
@@ -341,7 +404,7 @@ msgstr "需要認證電子郵件"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
msgid "Almost done! Your account still needs to be activated."
-msgstr "幾乎完成了!你的帳號仍然需要被啟用。"
+msgstr "幾乎完成了!但你的帳號仍然需要被啟用。"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
msgid ""
@@ -396,15 +459,15 @@ msgstr "查看%(username)s的全部媒體檔案"
msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
-msgstr "這個地方是你的媒體會出現的地方,但是你似乎還沒有加入東西。"
+msgstr "這個地方是你的媒體檔案會出現的地方,但是你似乎還沒有加入任何東西。"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
msgid "Add media"
-msgstr "新增媒體"
+msgstr "新增媒體檔案"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
msgid "There doesn't seem to be any media here yet..."
-msgstr "似乎還沒有任何的媒體..."
+msgstr "似乎還沒有任何的媒體檔案..."
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
msgid "feed icon"
@@ -414,12 +477,24 @@ msgstr "feed圖示"
msgid "Atom feed"
msgstr "Atom feed"
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
+msgid "Newer"
+msgstr ""
+
+#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
+msgid "Older"
+msgstr ""
+
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "評論"
-#: mediagoblin/user_pages/views.py:176
-msgid "You are about to delete another user's media. Proceed with caution."
+#: mediagoblin/user_pages/forms.py:30
+msgid "I am sure I want to delete this"
msgstr ""
+#: mediagoblin/user_pages/views.py:175
+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 81d3a430..b7f52595 100644
--- a/mediagoblin/init/__init__.py
+++ b/mediagoblin/init/__init__.py
@@ -14,7 +14,10 @@
# 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 beaker.cache import CacheManager
+from beaker.util import parse_cache_config_options
import jinja2
+
from mediagoblin import staticdirect
from mediagoblin.init.config import (
read_mediagoblin_config, generate_validation_report)
@@ -135,3 +138,16 @@ def setup_workbench():
workbench_manager = WorkbenchManager(app_config['workbench_path'])
setup_globals(workbench_manager = workbench_manager)
+
+
+def setup_beaker_cache():
+ """
+ Setup the Beaker Cache manager.
+ """
+ cache_config = mg_globals.global_config['beaker.cache']
+ cache_config = dict(
+ [(u'cache.%s' % key, value)
+ for key, value in cache_config.iteritems()])
+ cache = CacheManager(**parse_cache_config_options(cache_config))
+ setup_globals(cache=cache)
+ return cache
diff --git a/mediagoblin/mg_globals.py b/mediagoblin/mg_globals.py
index 4aeefc32..2d304111 100644
--- a/mediagoblin/mg_globals.py
+++ b/mediagoblin/mg_globals.py
@@ -31,6 +31,9 @@ db_connection = None
# mongokit.Connection
database = None
+# beaker's cache manager
+cache = None
+
# should be the same as the
public_store = None
queue_store = None
diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py
index db913f5f..2b9eed6e 100644
--- a/mediagoblin/process_media/__init__.py
+++ b/mediagoblin/process_media/__init__.py
@@ -16,7 +16,6 @@
import Image
-from contextlib import contextmanager
from celery.task import Task
from celery import registry
@@ -36,14 +35,6 @@ def create_pub_filepath(entry, filename):
filename])
-@contextmanager
-def closing(callback):
- try:
- yield callback
- finally:
- pass
-
-
################################
# Media processing initial steps
################################
@@ -66,7 +57,7 @@ class ProcessMedia(Task):
except BaseProcessingFail, exc:
mark_entry_failed(entry[u'_id'], exc)
return
-
+
entry['state'] = u'processed'
entry.save()
@@ -144,7 +135,7 @@ def process_image(entry):
thumb_filepath = create_pub_filepath(entry, 'thumbnail.jpg')
thumb_file = mgg.public_store.get_file(thumb_filepath, 'w')
- with closing(thumb_file):
+ with thumb_file:
thumb.save(thumb_file, "JPEG", quality=90)
# If the size of the original file exceeds the specified size of a `medium`
@@ -162,7 +153,7 @@ def process_image(entry):
medium_filepath = create_pub_filepath(entry, 'medium.jpg')
medium_file = mgg.public_store.get_file(medium_filepath, 'w')
- with closing(medium_file):
+ with medium_file:
medium.save(medium_file, "JPEG", quality=90)
medium_processed = True
@@ -172,8 +163,8 @@ def process_image(entry):
with queued_file:
original_filepath = create_pub_filepath(entry, queued_filepath[-1])
-
- with closing(mgg.public_store.get_file(original_filepath, 'wb')) as original_file:
+
+ 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)
diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css
index 307e2970..b108cc9e 100644
--- a/mediagoblin/static/css/base.css
+++ b/mediagoblin/static/css/base.css
@@ -4,25 +4,25 @@
font-family: 'Lato';
font-style: normal;
font-weight: 700;
- src: local('Lato Bold'), local('Lato-Bold'), url('http://themes.googleusercontent.com/static/fonts/lato/v1/wkfQbvfT_02e2IWO3yYueQ.woff') format('woff');
+ src: local('Lato Bold'), local('Lato-Bold'), url('../fonts/Lato-Bold.ttf') format('truetype');
}
@font-face {
font-family: 'Lato';
font-style: italic;
font-weight: 400;
- src: local('Lato Italic'), local('Lato-Italic'), url('http://themes.googleusercontent.com/static/fonts/lato/v1/oUan5VrEkpzIazlUe5ieaA.woff') format('woff');
+ src: local('Lato Italic'), local('Lato-Italic'), url('../fonts/Lato-Italic.ttf') format('truetype');
}
@font-face {
font-family: 'Lato';
font-style: italic;
font-weight: 700;
- src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url('http://themes.googleusercontent.com/static/fonts/lato/v1/HkF_qI1x_noxlxhrhMQYED8E0i7KZn-EPnyo3HZu7kw.woff') format('woff');
+ src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url('../fonts/Lato-BoldItalic.ttf') format('truetype');
}
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 400;
- src: local('Lato Regular'), local('Lato-Regular'), url('http://themes.googleusercontent.com/static/fonts/lato/v1/9k-RPmcnxYEPm8CNFsH2gg.woff') format('woff');
+ src: local('Lato Regular'), local('Lato-Regular'), url('../fonts/Lato-Regular.woff') format('truetype');
}
body {
@@ -141,7 +141,7 @@ background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109,
/* common website elements */
-.button {
+.button, .cancel_link {
height: 32px;
min-width: 99px;
background-color: #86d4b1;
@@ -165,6 +165,16 @@ background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109,
font-weight: bold;
}
+.cancel_link {
+ 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);
+}
+
.pagination{
text-align: center;
}
@@ -355,3 +365,11 @@ table.media_panel th {
font-weight: bold;
padding-bottom: 4px;
}
+
+
+/* Delete panel */
+
+.delete_checkbox_box {
+ margin-top: 10px;
+ margin-left: 10px;
+}
diff --git a/mediagoblin/static/fonts/Lato-Bold.ttf b/mediagoblin/static/fonts/Lato-Bold.ttf
new file mode 120000
index 00000000..8b747690
--- /dev/null
+++ b/mediagoblin/static/fonts/Lato-Bold.ttf
@@ -0,0 +1 @@
+../../../extlib/lato/Lato-Bold.ttf \ No newline at end of file
diff --git a/mediagoblin/static/fonts/Lato-BoldItalic.ttf b/mediagoblin/static/fonts/Lato-BoldItalic.ttf
new file mode 120000
index 00000000..20886f02
--- /dev/null
+++ b/mediagoblin/static/fonts/Lato-BoldItalic.ttf
@@ -0,0 +1 @@
+../../../extlib/lato/Lato-BoldItalic.ttf \ No newline at end of file
diff --git a/mediagoblin/static/fonts/Lato-Italic.ttf b/mediagoblin/static/fonts/Lato-Italic.ttf
new file mode 120000
index 00000000..3e4ee80c
--- /dev/null
+++ b/mediagoblin/static/fonts/Lato-Italic.ttf
@@ -0,0 +1 @@
+../../../extlib/lato/Lato-Italic.ttf \ No newline at end of file
diff --git a/mediagoblin/static/fonts/Lato-Regular.ttf b/mediagoblin/static/fonts/Lato-Regular.ttf
new file mode 120000
index 00000000..ff8e9d2c
--- /dev/null
+++ b/mediagoblin/static/fonts/Lato-Regular.ttf
@@ -0,0 +1 @@
+../../../extlib/lato/Lato-Regular.ttf \ No newline at end of file
diff --git a/mediagoblin/storage.py b/mediagoblin/storage.py
deleted file mode 100644
index e3df72be..00000000
--- a/mediagoblin/storage.py
+++ /dev/null
@@ -1,541 +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/>.
-
-import os
-import shutil
-import urlparse
-import uuid
-import cloudfiles
-import mimetypes
-import tempfile
-
-from werkzeug.utils import secure_filename
-
-from mediagoblin import util
-
-########
-# Errors
-########
-
-
-class Error(Exception):
- pass
-
-
-class InvalidFilepath(Error):
- pass
-
-
-class NoWebServing(Error):
- pass
-
-
-class NotImplementedError(Error):
- pass
-
-
-###############################################
-# Storage interface & basic file implementation
-###############################################
-
-class StorageInterface(object):
- """
- Interface for the storage API.
-
- This interface doesn't actually provide behavior, but it defines
- what kind of storage patterns subclasses should provide.
-
- It is important to note that the storage API idea of a "filepath"
- is actually like ['dir1', 'dir2', 'file.jpg'], so keep that in
- mind while reading method documentation.
-
- You should set up your __init__ method with whatever keyword
- arguments are appropriate to your storage system, but you should
- also passively accept all extraneous keyword arguments like:
-
- def __init__(self, **kwargs):
- pass
-
- See BasicFileStorage as a simple implementation of the
- StorageInterface.
- """
-
- # Whether this file store is on the local filesystem.
- local_storage = False
-
- def __raise_not_implemented(self):
- """
- Raise a warning about some component not implemented by a
- subclass of this interface.
- """
- raise NotImplementedError(
- "This feature not implemented in this storage API implementation.")
-
- def file_exists(self, filepath):
- """
- Return a boolean asserting whether or not file at filepath
- exists in our storage system.
-
- Returns:
- True / False depending on whether file exists or not.
- """
- # Subclasses should override this method.
- self.__raise_not_implemented()
-
- def get_file(self, filepath, mode='r'):
- """
- Return a file-like object for reading/writing from this filepath.
-
- Should create directories, buckets, whatever, as necessary.
- """
- # Subclasses should override this method.
- self.__raise_not_implemented()
-
- def delete_file(self, filepath):
- """
- Delete or dereference the file at filepath.
-
- This might need to delete directories, buckets, whatever, for
- cleanliness. (Be sure to avoid race conditions on that though)
- """
- # Subclasses should override this method.
- self.__raise_not_implemented()
-
- def file_url(self, filepath):
- """
- Get the URL for this file. This assumes our storage has been
- mounted with some kind of URL which makes this possible.
- """
- # Subclasses should override this method.
- self.__raise_not_implemented()
-
- def get_unique_filepath(self, filepath):
- """
- If a filename at filepath already exists, generate a new name.
-
- Eg, if the filename doesn't exist:
- >>> storage_handler.get_unique_filename(['dir1', 'dir2', 'fname.jpg'])
- [u'dir1', u'dir2', u'fname.jpg']
-
- But if a file does exist, let's get one back with at uuid tacked on:
- >>> storage_handler.get_unique_filename(['dir1', 'dir2', 'fname.jpg'])
- [u'dir1', u'dir2', u'd02c3571-dd62-4479-9d62-9e3012dada29-fname.jpg']
- """
- # Make sure we have a clean filepath to start with, since
- # we'll be possibly tacking on stuff to the filename.
- filepath = clean_listy_filepath(filepath)
-
- if self.file_exists(filepath):
- return filepath[:-1] + ["%s-%s" % (uuid.uuid4(), filepath[-1])]
- else:
- return filepath
-
- def get_local_path(self, filepath):
- """
- If this is a local_storage implementation, give us a link to
- the local filesystem reference to this file.
-
- >>> storage_handler.get_local_path(['foo', 'bar', 'baz.jpg'])
- u'/path/to/mounting/foo/bar/baz.jpg'
- """
- # Subclasses should override this method, if applicable.
- self.__raise_not_implemented()
-
- def copy_locally(self, filepath, dest_path):
- """
- Copy this file locally.
-
- A basic working method for this is provided that should
- function both for local_storage systems and remote storge
- systems, but if more efficient systems for copying locally
- apply to your system, override this method with something more
- appropriate.
- """
- if self.local_storage:
- shutil.copy(
- self.get_local_path(filepath), dest_path)
- else:
- with self.get_file(filepath, 'rb') as source_file:
- with file(dest_path, 'wb') as dest_file:
- dest_file.write(source_file.read())
-
-
-class BasicFileStorage(StorageInterface):
- """
- Basic local filesystem implementation of storage API
- """
-
- local_storage = True
-
- def __init__(self, base_dir, base_url=None, **kwargs):
- """
- Keyword arguments:
- - base_dir: Base directory things will be served out of. MUST
- be an absolute path.
- - base_url: URL files will be served from
- """
- self.base_dir = base_dir
- self.base_url = base_url
-
- def _resolve_filepath(self, filepath):
- """
- Transform the given filepath into a local filesystem filepath.
- """
- return os.path.join(
- self.base_dir, *clean_listy_filepath(filepath))
-
- def file_exists(self, filepath):
- return os.path.exists(self._resolve_filepath(filepath))
-
- def get_file(self, filepath, mode='r'):
- # Make directories if necessary
- if len(filepath) > 1:
- directory = self._resolve_filepath(filepath[:-1])
- if not os.path.exists(directory):
- os.makedirs(directory)
-
- # Grab and return the file in the mode specified
- return open(self._resolve_filepath(filepath), mode)
-
- def delete_file(self, filepath):
- # TODO: Also delete unused directories if empty (safely, with
- # checks to avoid race conditions).
- os.remove(self._resolve_filepath(filepath))
-
- def file_url(self, filepath):
- if not self.base_url:
- raise NoWebServing(
- "base_url not set, cannot provide file urls")
-
- return urlparse.urljoin(
- self.base_url,
- '/'.join(clean_listy_filepath(filepath)))
-
- def get_local_path(self, filepath):
- return self._resolve_filepath(filepath)
-
-
-# ----------------------------------------------------
-# OpenStack/Rackspace Cloud's Swift/CloudFiles support
-# ----------------------------------------------------
-
-class CloudFilesStorage(StorageInterface):
- def __init__(self, **kwargs):
- self.param_container = kwargs.get('cloudfiles_container')
- self.param_user = kwargs.get('cloudfiles_user')
- self.param_api_key = kwargs.get('cloudfiles_api_key')
- self.param_host = kwargs.get('cloudfiles_host')
- self.param_use_servicenet = kwargs.get('cloudfiles_use_servicenet')
-
- if not self.param_host:
- print('No CloudFiles host URL specified, '
- 'defaulting to Rackspace US')
-
- self.connection = cloudfiles.get_connection(
- username=self.param_user,
- api_key=self.param_api_key,
- servicenet=True if self.param_use_servicenet == 'true' or \
- self.param_use_servicenet == True else False)
-
- if not self.param_container == \
- self.connection.get_container(self.param_container):
- self.container = self.connection.create_container(
- self.param_container)
- self.container.make_public(
- ttl=60 * 60 * 2)
- else:
- self.container = self.connection.get_container(
- self.param_container)
-
- self.container_uri = self.container.public_uri()
-
- def _resolve_filepath(self, filepath):
- return '/'.join(
- clean_listy_filepath(filepath))
-
- def file_exists(self, filepath):
- try:
- object = self.container.get_object(
- self._resolve_filepath(filepath))
- return True
- except cloudfiles.errors.NoSuchObject:
- return False
-
- def get_file(self, filepath, *args, **kwargs):
- """
- - Doesn't care about the "mode" argument
- """
- try:
- obj = self.container.get_object(
- self._resolve_filepath(filepath))
- except cloudfiles.errors.NoSuchObject:
- obj = self.container.create_object(
- self._resolve_filepath(filepath))
-
- mimetype = mimetypes.guess_type(
- filepath[-1])
-
- if mimetype:
- obj.content_type = mimetype[0]
-
- return StorageObjectWrapper(obj, *args, **kwargs)
-
- 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))
-
- def file_url(self, filepath):
- return '/'.join([
- self.container_uri,
- self._resolve_filepath(filepath)])
-
-
-class StorageObjectWrapper():
- """
- Wrapper for python-cloudfiles's cloudfiles.storage_object.Object
- used to circumvent the mystic `medium.jpg` corruption issue, where
- we had both python-cloudfiles and PIL doing buffering on both
- ends and that breaking things.
-
- This wrapper currently meets mediagoblin's needs for a public_store
- file-like object.
- """
- def __init__(self, storage_object, *args, **kwargs):
- self.storage_object = storage_object
-
- def read(self, *args, **kwargs):
- return self.storage_object.read(*args, **kwargs)
-
- def write(self, data, *args, **kwargs):
- if self.storage_object.size and type(data) == str:
- data = self.read() + data
-
- self.storage_object.write(data, *args, **kwargs)
-
-
-# ------------
-# MountStorage
-# ------------
-
-class MountStorage(StorageInterface):
- """
- Experimental "Mount" virtual Storage Interface
-
- This isn't an interface to some real storage, instead it's a
- redirecting interface, that redirects requests to other
- "StorageInterface"s.
-
- For example, say you have the paths:
-
- 1. ['user_data', 'cwebber', 'avatar.jpg']
- 2. ['user_data', 'elrond', 'avatar.jpg']
- 3. ['media_entries', '34352f304c3f4d0ad8ad0f043522b6f2', 'thumb.jpg']
-
- You could mount media_entries under CloudFileStorage and user_data
- under BasicFileStorage. Then 1 would be passed to
- BasicFileStorage under the path ['cwebber', 'avatar.jpg'] and 3
- would be passed to CloudFileStorage under
- ['34352f304c3f4d0ad8ad0f043522b6f2', 'thumb.jpg'].
-
- In other words, this is kind of like mounting /home/ and /etc/
- under different filesystems on your operating system... but with
- mediagoblin filestorages :)
-
- To set this up, you currently need to call the mount() method with
- the target path and a backend, that shall be available under that
- target path. You have to mount things in a sensible order,
- especially you can't mount ["a", "b"] before ["a"].
- """
- def __init__(self, **kwargs):
- self.mounttab = {}
-
- def mount(self, dirpath, backend):
- """
- Mount a new backend under dirpath
- """
- new_ent = clean_listy_filepath(dirpath)
-
- print "Mounting:", repr(new_ent)
- already, rem_1, table, rem_2 = self._resolve_to_backend(new_ent, True)
- print "===", repr(already), repr(rem_1), repr(rem_2), len(table)
-
- assert (len(rem_2) > 0) or (None not in table), \
- "That path is already mounted"
- assert (len(rem_2) > 0) or (len(table)==0), \
- "A longer path is already mounted here"
-
- for part in rem_2:
- table[part] = {}
- table = table[part]
- table[None] = backend
-
- def _resolve_to_backend(self, filepath, extra_info = False):
- """
- extra_info = True is for internal use!
-
- Normally, returns the backend and the filepath inside that backend.
-
- With extra_info = True it returns the last directory node and the
- remaining filepath from there in addition.
- """
- table = self.mounttab
- filepath = filepath[:]
- res_fp = None
- while True:
- new_be = table.get(None)
- if (new_be is not None) or res_fp is None:
- res_be = new_be
- res_fp = filepath[:]
- res_extra = (table, filepath[:])
- # print "... New res: %r, %r, %r" % (res_be, res_fp, res_extra)
- if len(filepath) == 0:
- break
- query = filepath.pop(0)
- entry = table.get(query)
- if entry is not None:
- table = entry
- res_extra = (table, filepath[:])
- else:
- break
- if extra_info:
- return (res_be, res_fp) + res_extra
- else:
- return (res_be, res_fp)
-
- def resolve_to_backend(self, filepath):
- backend, filepath = self._resolve_to_backend(filepath)
- if backend is None:
- raise Error("Path not mounted")
- return backend, filepath
-
- def __repr__(self, table = None, indent = []):
- res = []
- if table is None:
- res.append("MountStorage<")
- table = self.mounttab
- v = table.get(None)
- if v:
- res.append(" " * len(indent) + repr(indent) + ": " + repr(v))
- for k, v in table.iteritems():
- if k == None:
- continue
- res.append(" " * len(indent) + repr(k) + ":")
- res += self.__repr__(v, indent + [k])
- if table is self.mounttab:
- res.append(">")
- return "\n".join(res)
- else:
- return res
-
- def file_exists(self, filepath):
- backend, filepath = self.resolve_to_backend(filepath)
- return backend.file_exists(filepath)
-
- def get_file(self, filepath, mode='r'):
- backend, filepath = self.resolve_to_backend(filepath)
- return backend.get_file(filepath, mode)
-
- def delete_file(self, filepath):
- backend, filepath = self.resolve_to_backend(filepath)
- return backend.delete_file(filepath)
-
- def file_url(self, filepath):
- backend, filepath = self.resolve_to_backend(filepath)
- return backend.file_url(filepath)
-
- def get_local_path(self, filepath):
- backend, filepath = self.resolve_to_backend(filepath)
- return backend.get_local_path(filepath)
-
- def copy_locally(self, filepath, dest_path):
- """
- Need to override copy_locally, because the local_storage
- attribute is not correct.
- """
- backend, filepath = self.resolve_to_backend(filepath)
- backend.copy_locally(filepath, dest_path)
-
-
-###########
-# Utilities
-###########
-
-def clean_listy_filepath(listy_filepath):
- """
- Take a listy filepath (like ['dir1', 'dir2', 'filename.jpg']) and
- clean out any nastiness from it.
-
-
- >>> clean_listy_filepath([u'/dir1/', u'foo/../nasty', u'linooks.jpg'])
- [u'dir1', u'foo_.._nasty', u'linooks.jpg']
-
- Args:
- - listy_filepath: a list of filepath components, mediagoblin
- storage API style.
-
- Returns:
- A cleaned list of unicode objects.
- """
- cleaned_filepath = [
- unicode(secure_filename(filepath))
- for filepath in listy_filepath]
-
- if u'' in cleaned_filepath:
- raise InvalidFilepath(
- "A filename component could not be resolved into a usable name.")
-
- return cleaned_filepath
-
-
-def storage_system_from_config(config_section):
- """
- Utility for setting up a storage system from a config section.
-
- Note that a special argument may be passed in to
- the config_section which is "storage_class" which will provide an
- import path to a storage system. This defaults to
- "mediagoblin.storage:BasicFileStorage" if otherwise undefined.
-
- Arguments:
- - config_section: dictionary of config parameters
-
- Returns:
- An instantiated storage system.
-
- Example:
- storage_system_from_config(
- {'base_url': '/media/',
- 'base_dir': '/var/whatever/media/'})
-
- Will return:
- BasicFileStorage(
- base_url='/media/',
- base_dir='/var/whatever/media')
- """
- # This construct is needed, because dict(config) does
- # not replace the variables in the config items.
- config_params = dict(config_section.iteritems())
-
- if 'storage_class' in config_params:
- storage_class = config_params['storage_class']
- config_params.pop('storage_class')
- else:
- storage_class = "mediagoblin.storage:BasicFileStorage"
-
- storage_class = util.import_component(storage_class)
- return storage_class(**config_params)
diff --git a/mediagoblin/storage/__init__.py b/mediagoblin/storage/__init__.py
new file mode 100644
index 00000000..8665d9e5
--- /dev/null
+++ b/mediagoblin/storage/__init__.py
@@ -0,0 +1,240 @@
+# 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 shutil
+import urlparse
+import uuid
+
+from werkzeug.utils import secure_filename
+
+from mediagoblin import util
+
+########
+# Errors
+########
+
+
+class Error(Exception):
+ pass
+
+
+class InvalidFilepath(Error):
+ pass
+
+
+class NoWebServing(Error):
+ pass
+
+
+class NotImplementedError(Error):
+ pass
+
+
+###############################################
+# Storage interface & basic file implementation
+###############################################
+
+class StorageInterface(object):
+ """
+ Interface for the storage API.
+
+ This interface doesn't actually provide behavior, but it defines
+ what kind of storage patterns subclasses should provide.
+
+ It is important to note that the storage API idea of a "filepath"
+ is actually like ['dir1', 'dir2', 'file.jpg'], so keep that in
+ mind while reading method documentation.
+
+ You should set up your __init__ method with whatever keyword
+ arguments are appropriate to your storage system, but you should
+ also passively accept all extraneous keyword arguments like:
+
+ def __init__(self, **kwargs):
+ pass
+
+ See BasicFileStorage as a simple implementation of the
+ StorageInterface.
+ """
+
+ # Whether this file store is on the local filesystem.
+ local_storage = False
+
+ def __raise_not_implemented(self):
+ """
+ Raise a warning about some component not implemented by a
+ subclass of this interface.
+ """
+ raise NotImplementedError(
+ "This feature not implemented in this storage API implementation.")
+
+ def file_exists(self, filepath):
+ """
+ Return a boolean asserting whether or not file at filepath
+ exists in our storage system.
+
+ Returns:
+ True / False depending on whether file exists or not.
+ """
+ # Subclasses should override this method.
+ self.__raise_not_implemented()
+
+ def get_file(self, filepath, mode='r'):
+ """
+ Return a file-like object for reading/writing from this filepath.
+
+ Should create directories, buckets, whatever, as necessary.
+ """
+ # Subclasses should override this method.
+ self.__raise_not_implemented()
+
+ def delete_file(self, filepath):
+ """
+ Delete or dereference the file at filepath.
+
+ This might need to delete directories, buckets, whatever, for
+ cleanliness. (Be sure to avoid race conditions on that though)
+ """
+ # Subclasses should override this method.
+ self.__raise_not_implemented()
+
+ def file_url(self, filepath):
+ """
+ Get the URL for this file. This assumes our storage has been
+ mounted with some kind of URL which makes this possible.
+ """
+ # Subclasses should override this method.
+ self.__raise_not_implemented()
+
+ def get_unique_filepath(self, filepath):
+ """
+ If a filename at filepath already exists, generate a new name.
+
+ Eg, if the filename doesn't exist:
+ >>> storage_handler.get_unique_filename(['dir1', 'dir2', 'fname.jpg'])
+ [u'dir1', u'dir2', u'fname.jpg']
+
+ But if a file does exist, let's get one back with at uuid tacked on:
+ >>> storage_handler.get_unique_filename(['dir1', 'dir2', 'fname.jpg'])
+ [u'dir1', u'dir2', u'd02c3571-dd62-4479-9d62-9e3012dada29-fname.jpg']
+ """
+ # Make sure we have a clean filepath to start with, since
+ # we'll be possibly tacking on stuff to the filename.
+ filepath = clean_listy_filepath(filepath)
+
+ if self.file_exists(filepath):
+ return filepath[:-1] + ["%s-%s" % (uuid.uuid4(), filepath[-1])]
+ else:
+ return filepath
+
+ def get_local_path(self, filepath):
+ """
+ If this is a local_storage implementation, give us a link to
+ the local filesystem reference to this file.
+
+ >>> storage_handler.get_local_path(['foo', 'bar', 'baz.jpg'])
+ u'/path/to/mounting/foo/bar/baz.jpg'
+ """
+ # Subclasses should override this method, if applicable.
+ self.__raise_not_implemented()
+
+ def copy_locally(self, filepath, dest_path):
+ """
+ Copy this file locally.
+
+ A basic working method for this is provided that should
+ function both for local_storage systems and remote storge
+ systems, but if more efficient systems for copying locally
+ apply to your system, override this method with something more
+ appropriate.
+ """
+ if self.local_storage:
+ shutil.copy(
+ self.get_local_path(filepath), dest_path)
+ else:
+ with self.get_file(filepath, 'rb') as source_file:
+ with file(dest_path, 'wb') as dest_file:
+ dest_file.write(source_file.read())
+
+
+###########
+# Utilities
+###########
+
+def clean_listy_filepath(listy_filepath):
+ """
+ Take a listy filepath (like ['dir1', 'dir2', 'filename.jpg']) and
+ clean out any nastiness from it.
+
+
+ >>> clean_listy_filepath([u'/dir1/', u'foo/../nasty', u'linooks.jpg'])
+ [u'dir1', u'foo_.._nasty', u'linooks.jpg']
+
+ Args:
+ - listy_filepath: a list of filepath components, mediagoblin
+ storage API style.
+
+ Returns:
+ A cleaned list of unicode objects.
+ """
+ cleaned_filepath = [
+ unicode(secure_filename(filepath))
+ for filepath in listy_filepath]
+
+ if u'' in cleaned_filepath:
+ raise InvalidFilepath(
+ "A filename component could not be resolved into a usable name.")
+
+ return cleaned_filepath
+
+
+def storage_system_from_config(config_section):
+ """
+ Utility for setting up a storage system from a config section.
+
+ Note that a special argument may be passed in to
+ the config_section which is "storage_class" which will provide an
+ import path to a storage system. This defaults to
+ "mediagoblin.storage:BasicFileStorage" if otherwise undefined.
+
+ Arguments:
+ - config_section: dictionary of config parameters
+
+ Returns:
+ An instantiated storage system.
+
+ Example:
+ storage_system_from_config(
+ {'base_url': '/media/',
+ 'base_dir': '/var/whatever/media/'})
+
+ Will return:
+ BasicFileStorage(
+ base_url='/media/',
+ base_dir='/var/whatever/media')
+ """
+ # This construct is needed, because dict(config) does
+ # not replace the variables in the config items.
+ config_params = dict(config_section.iteritems())
+
+ if 'storage_class' in config_params:
+ storage_class = config_params['storage_class']
+ config_params.pop('storage_class')
+ else:
+ storage_class = 'mediagoblin.storage.filestorage:BasicFileStorage'
+
+ storage_class = util.import_component(storage_class)
+ return storage_class(**config_params)
diff --git a/mediagoblin/storage/cloudfiles.py b/mediagoblin/storage/cloudfiles.py
new file mode 100644
index 00000000..b1dd9450
--- /dev/null
+++ b/mediagoblin/storage/cloudfiles.py
@@ -0,0 +1,156 @@
+# 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/>.
+
+'''
+Make it so that ``import cloudfiles`` does not pick THIS file, but the
+python-cloudfiles one.
+
+http://docs.python.org/whatsnew/2.5.html#pep-328-absolute-and-relative-imports
+'''
+from __future__ import absolute_import
+
+from mediagoblin.storage import StorageInterface, clean_listy_filepath
+
+import cloudfiles
+import mimetypes
+
+class CloudFilesStorage(StorageInterface):
+ '''
+ OpenStack/Rackspace Cloud's Swift/CloudFiles support
+ '''
+
+ local_storage = False
+
+ def __init__(self, **kwargs):
+ self.param_container = kwargs.get('cloudfiles_container')
+ self.param_user = kwargs.get('cloudfiles_user')
+ self.param_api_key = kwargs.get('cloudfiles_api_key')
+ self.param_host = kwargs.get('cloudfiles_host')
+ self.param_use_servicenet = kwargs.get('cloudfiles_use_servicenet')
+
+ if not self.param_host:
+ print('No CloudFiles host URL specified, '
+ 'defaulting to Rackspace US')
+
+ self.connection = cloudfiles.get_connection(
+ username=self.param_user,
+ api_key=self.param_api_key,
+ servicenet=True if self.param_use_servicenet == 'true' or \
+ self.param_use_servicenet == True else False)
+
+ if not self.param_container == \
+ self.connection.get_container(self.param_container):
+ self.container = self.connection.create_container(
+ self.param_container)
+ self.container.make_public(
+ ttl=60 * 60 * 2)
+ else:
+ self.container = self.connection.get_container(
+ self.param_container)
+
+ self.container_uri = self.container.public_uri()
+
+ def _resolve_filepath(self, filepath):
+ return '/'.join(
+ clean_listy_filepath(filepath))
+
+ def file_exists(self, filepath):
+ try:
+ object = self.container.get_object(
+ self._resolve_filepath(filepath))
+ return True
+ except cloudfiles.errors.NoSuchObject:
+ return False
+
+ def get_file(self, filepath, *args, **kwargs):
+ """
+ - Doesn't care about the "mode" argument
+ """
+ try:
+ obj = self.container.get_object(
+ self._resolve_filepath(filepath))
+ except cloudfiles.errors.NoSuchObject:
+ obj = self.container.create_object(
+ self._resolve_filepath(filepath))
+
+ mimetype = mimetypes.guess_type(
+ filepath[-1])
+
+ if mimetype:
+ obj.content_type = mimetype[0]
+
+ return CloudFilesStorageObjectWrapper(obj, *args, **kwargs)
+
+ 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))
+
+ def file_url(self, filepath):
+ return '/'.join([
+ self.container_uri,
+ self._resolve_filepath(filepath)])
+
+
+class CloudFilesStorageObjectWrapper():
+ """
+ Wrapper for python-cloudfiles's cloudfiles.storage_object.Object
+ used to circumvent the mystic `medium.jpg` corruption issue, where
+ we had both python-cloudfiles and PIL doing buffering on both
+ ends and that breaking things.
+
+ This wrapper currently meets mediagoblin's needs for a public_store
+ file-like object.
+ """
+ def __init__(self, storage_object, *args, **kwargs):
+ self.storage_object = storage_object
+
+ def read(self, *args, **kwargs):
+ return self.storage_object.read(*args, **kwargs)
+
+ def write(self, data, *args, **kwargs):
+ """
+ write data to the cloudfiles storage object
+
+ The original motivation for this wrapper is to ensure
+ that buffered writing to a cloudfiles storage object does not overwrite
+ any preexisting data.
+
+ Currently this method does not support any write modes except "append".
+ However if we should need it it would be easy implement.
+ """
+ if self.storage_object.size and type(data) == str:
+ data = self.read() + data
+
+ self.storage_object.write(data, *args, **kwargs)
+
+ def close(self):
+ pass
+
+ def __enter__(self):
+ """
+ Context Manager API implementation
+ http://docs.python.org/library/stdtypes.html#context-manager-types
+ """
+ return self
+
+ def __exit__(self, *exc_info):
+ """
+ Context Manger API implementation
+ see self.__enter__()
+ """
+ self.close()
diff --git a/mediagoblin/storage/filestorage.py b/mediagoblin/storage/filestorage.py
new file mode 100644
index 00000000..22d6eb5a
--- /dev/null
+++ b/mediagoblin/storage/filestorage.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/>.
+
+from mediagoblin.storage import (
+ StorageInterface,
+ clean_listy_filepath,
+ NoWebServing)
+
+import os
+import urlparse
+
+
+class BasicFileStorage(StorageInterface):
+ """
+ Basic local filesystem implementation of storage API
+ """
+
+ local_storage = True
+
+ def __init__(self, base_dir, base_url=None, **kwargs):
+ """
+ Keyword arguments:
+ - base_dir: Base directory things will be served out of. MUST
+ be an absolute path.
+ - base_url: URL files will be served from
+ """
+ self.base_dir = base_dir
+ self.base_url = base_url
+
+ def _resolve_filepath(self, filepath):
+ """
+ Transform the given filepath into a local filesystem filepath.
+ """
+ return os.path.join(
+ self.base_dir, *clean_listy_filepath(filepath))
+
+ def file_exists(self, filepath):
+ return os.path.exists(self._resolve_filepath(filepath))
+
+ def get_file(self, filepath, mode='r'):
+ # Make directories if necessary
+ if len(filepath) > 1:
+ directory = self._resolve_filepath(filepath[:-1])
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+ # Grab and return the file in the mode specified
+ return open(self._resolve_filepath(filepath), mode)
+
+ def delete_file(self, filepath):
+ # TODO: Also delete unused directories if empty (safely, with
+ # checks to avoid race conditions).
+ os.remove(self._resolve_filepath(filepath))
+
+ def file_url(self, filepath):
+ if not self.base_url:
+ raise NoWebServing(
+ "base_url not set, cannot provide file urls")
+
+ return urlparse.urljoin(
+ self.base_url,
+ '/'.join(clean_listy_filepath(filepath)))
+
+ def get_local_path(self, filepath):
+ return self._resolve_filepath(filepath)
diff --git a/mediagoblin/storage/mountstorage.py b/mediagoblin/storage/mountstorage.py
new file mode 100644
index 00000000..6adb7a0d
--- /dev/null
+++ b/mediagoblin/storage/mountstorage.py
@@ -0,0 +1,156 @@
+# 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 medigoblin.storage import StorageInterface, clean_listy_filepath
+
+
+class MountStorage(StorageInterface):
+ """
+ Experimental "Mount" virtual Storage Interface
+
+ This isn't an interface to some real storage, instead it's a
+ redirecting interface, that redirects requests to other
+ "StorageInterface"s.
+
+ For example, say you have the paths:
+
+ 1. ['user_data', 'cwebber', 'avatar.jpg']
+ 2. ['user_data', 'elrond', 'avatar.jpg']
+ 3. ['media_entries', '34352f304c3f4d0ad8ad0f043522b6f2', 'thumb.jpg']
+
+ You could mount media_entries under CloudFileStorage and user_data
+ under BasicFileStorage. Then 1 would be passed to
+ BasicFileStorage under the path ['cwebber', 'avatar.jpg'] and 3
+ would be passed to CloudFileStorage under
+ ['34352f304c3f4d0ad8ad0f043522b6f2', 'thumb.jpg'].
+
+ In other words, this is kind of like mounting /home/ and /etc/
+ under different filesystems on your operating system... but with
+ mediagoblin filestorages :)
+
+ To set this up, you currently need to call the mount() method with
+ the target path and a backend, that shall be available under that
+ target path. You have to mount things in a sensible order,
+ especially you can't mount ["a", "b"] before ["a"].
+ """
+ def __init__(self, **kwargs):
+ self.mounttab = {}
+
+ def mount(self, dirpath, backend):
+ """
+ Mount a new backend under dirpath
+ """
+ new_ent = clean_listy_filepath(dirpath)
+
+ print "Mounting:", repr(new_ent)
+ already, rem_1, table, rem_2 = self._resolve_to_backend(new_ent, True)
+ print "===", repr(already), repr(rem_1), repr(rem_2), len(table)
+
+ assert (len(rem_2) > 0) or (None not in table), \
+ "That path is already mounted"
+ assert (len(rem_2) > 0) or (len(table) == 0), \
+ "A longer path is already mounted here"
+
+ for part in rem_2:
+ table[part] = {}
+ table = table[part]
+ table[None] = backend
+
+ def _resolve_to_backend(self, filepath, extra_info=False):
+ """
+ extra_info = True is for internal use!
+
+ Normally, returns the backend and the filepath inside that backend.
+
+ With extra_info = True it returns the last directory node and the
+ remaining filepath from there in addition.
+ """
+ table = self.mounttab
+ filepath = filepath[:]
+ res_fp = None
+ while True:
+ new_be = table.get(None)
+ if (new_be is not None) or res_fp is None:
+ res_be = new_be
+ res_fp = filepath[:]
+ res_extra = (table, filepath[:])
+ # print "... New res: %r, %r, %r" % (res_be, res_fp, res_extra)
+ if len(filepath) == 0:
+ break
+ query = filepath.pop(0)
+ entry = table.get(query)
+ if entry is not None:
+ table = entry
+ res_extra = (table, filepath[:])
+ else:
+ break
+ if extra_info:
+ return (res_be, res_fp) + res_extra
+ else:
+ return (res_be, res_fp)
+
+ def resolve_to_backend(self, filepath):
+ backend, filepath = self._resolve_to_backend(filepath)
+ if backend is None:
+ raise Error("Path not mounted")
+ return backend, filepath
+
+ def __repr__(self, table=None, indent=[]):
+ res = []
+ if table is None:
+ res.append("MountStorage<")
+ table = self.mounttab
+ v = table.get(None)
+ if v:
+ res.append(" " * len(indent) + repr(indent) + ": " + repr(v))
+ for k, v in table.iteritems():
+ if k == None:
+ continue
+ res.append(" " * len(indent) + repr(k) + ":")
+ res += self.__repr__(v, indent + [k])
+ if table is self.mounttab:
+ res.append(">")
+ return "\n".join(res)
+ else:
+ return res
+
+ def file_exists(self, filepath):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.file_exists(filepath)
+
+ def get_file(self, filepath, mode='r'):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.get_file(filepath, mode)
+
+ def delete_file(self, filepath):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.delete_file(filepath)
+
+ def file_url(self, filepath):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.file_url(filepath)
+
+ def get_local_path(self, filepath):
+ backend, filepath = self.resolve_to_backend(filepath)
+ return backend.get_local_path(filepath)
+
+ def copy_locally(self, filepath, dest_path):
+ """
+ Need to override copy_locally, because the local_storage
+ attribute is not correct.
+ """
+ backend, filepath = self.resolve_to_backend(filepath)
+ backend.copy_locally(filepath, dest_path)
diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py
index 17df6be6..a999c714 100644
--- a/mediagoblin/submit/forms.py
+++ b/mediagoblin/submit/forms.py
@@ -26,7 +26,8 @@ class SubmitStartForm(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'))
tags = wtforms.TextField(
_('Tags'),
[tag_length_validator])
diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html
new file mode 100644
index 00000000..4be7e065
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/auth/change_fp.html
@@ -0,0 +1,37 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+{% extends "mediagoblin/base.html" %}
+
+{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+
+{% block mediagoblin_content %}
+
+ <form action="{{ request.urlgen('mediagoblin.auth.verify_forgot_password') }}"
+ method="POST" enctype="multipart/form-data">
+ <div class="grid_6 prefix_1 suffix_1 form_box">
+ <h1>{% trans %}Enter your new password{% endtrans %}</h1>
+
+ {{ wtforms_util.render_divs(cp_form) }}
+ <div class="form_submit_buttons">
+ <input type="submit" value="submit" class="button"/>
+ </div>
+
+ </div>
+ </form>
+{% endblock %}
+
diff --git a/mediagoblin/templates/mediagoblin/auth/forgot_password.html b/mediagoblin/templates/mediagoblin/auth/forgot_password.html
new file mode 100644
index 00000000..23fa9eb5
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/auth/forgot_password.html
@@ -0,0 +1,37 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+{% extends "mediagoblin/base.html" %}
+
+{% 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">
+ <div class="grid_6 prefix_1 suffix_1 form_box">
+ <h1>{% trans %}Enter your username or email{% endtrans %}</h1>
+
+ {{ wtforms_util.render_divs(fp_form) }}
+ <div class="form_submit_buttons">
+ <input type="submit" value="submit" class="button"/>
+ </div>
+
+ </div>
+ </form>
+{% endblock %}
+
diff --git a/mediagoblin/templates/mediagoblin/auth/resent_verification_email.html b/mediagoblin/templates/mediagoblin/auth/fp_changed_success.html
index 37cd6b03..7cea312d 100644
--- a/mediagoblin/templates/mediagoblin/auth/resent_verification_email.html
+++ b/mediagoblin/templates/mediagoblin/auth/fp_changed_success.html
@@ -1,6 +1,6 @@
{#
# GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS.
+# Copyright (C) 2011 Free Software Foundation, Inc
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -19,6 +19,9 @@
{% block mediagoblin_content %}
<p>
- {% trans %}Resent your verification email.{% endtrans %}
+ {% trans -%}
+ Your password has been changed. Try to log in now.
+ {%- endtrans %}
</p>
{% endblock %}
+
diff --git a/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html b/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html
new file mode 100644
index 00000000..69aac6b3
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html
@@ -0,0 +1,28 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+{% 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/templates/mediagoblin/auth/fp_verification_email.txt b/mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt
new file mode 100644
index 00000000..fb5e1674
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt
@@ -0,0 +1,30 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#}
+
+{% trans username=username, verification_url=verification_url|safe -%}
+Hi {{ username }},
+
+to change your GNU MediaGoblin password, open the following URL in
+your web browser:
+
+{{ verification_url }}
+
+If you think this is an error, just ignore this email and continue being
+a happy goblin!
+{%- endtrans %}
+
diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html
index 1be58560..61c5a203 100644
--- a/mediagoblin/templates/mediagoblin/auth/login.html
+++ b/mediagoblin/templates/mediagoblin/auth/login.html
@@ -45,6 +45,12 @@
<a href="{{ request.urlgen('mediagoblin.auth.register') }}">
{%- trans %}Create one here!{% endtrans %}</a>
</p>
+ <p>
+ {% trans %}Forgot your password?{% endtrans %}
+ <br />
+ <a href="{{ request.urlgen('mediagoblin.auth.forgot_password') }}">
+ {%- trans %}Change it!{% endtrans %}</a>
+ </p>
{% endif %}
</div>
</form>
diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html
index 8fc62f32..e3ca9726 100644
--- a/mediagoblin/templates/mediagoblin/root.html
+++ b/mediagoblin/templates/mediagoblin/root.html
@@ -21,7 +21,7 @@
{% block mediagoblin_content %}
{% if request.user %}
- <h1>Explore</h1>
+ <h1>{% trans %}Explore{% endtrans %}</h1>
{% else %}
<div class="grid_11 alpha">
<h1>{% trans %}Hi there, media lover! MediaGoblin is...{% endtrans %}</h1>
@@ -35,9 +35,12 @@
</ul>
{% if allow_registration %}
- <p>Excited to join us? To add your own media, make collections and save favorites...<p>
- <a class="header_submit_highlight" href="{{ request.urlgen('mediagoblin.auth.register') }}">Create a free account</a> or
- <a class="header_submit" href="http://wiki.mediagoblin.org/HackingHowto">Set up MediaGoblin on your own server</a>
+ <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>
@@ -47,6 +50,6 @@
<div class="clear"></div>
{% endif %}
- <h2>Most recent media</h2>
+ <h2>{% trans %}Most recent media{% endtrans %}</h2>
{{ object_gallery(request, media_entries, pagination) }}
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
index 3acf802b..dd6923a9 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
@@ -31,17 +31,23 @@
Really delete {{ title }}?
{%- endtrans %}
</h1>
- <p>
- <em>
- {%- trans -%}
- If you choose yes, the media entry will be deleted <strong>permanently.</strong>
- {%- endtrans %}
- </em>
- </p>
- {{ wtforms_util.render_divs(form) }}
+ <div style="text-align: center;" >
+ <img src="{{ request.app.public_store.file_url(
+ media['media_files']['thumb']) }}" />
+ </div>
+
+ <br />
+
+ <p class="delete_checkbox_box">
+ {{ form.confirm }}
+ {{ _(form.confirm.label.text) }}
+ </p>
+
<div class="form_submit_buttons">
- <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button" />
+ {# 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" />
{{ csrf_token }}
</div>
</div>
diff --git a/mediagoblin/templates/mediagoblin/utils/pagination.html b/mediagoblin/templates/mediagoblin/utils/pagination.html
index cdac01c8..0df3bfea 100644
--- a/mediagoblin/templates/mediagoblin/utils/pagination.html
+++ b/mediagoblin/templates/mediagoblin/utils/pagination.html
@@ -33,15 +33,18 @@
<div class="pagination">
<p>
{% if pagination.has_prev %}
- <a href="{{ pagination.get_page_url_explicit(
- base_url, get_params,
- pagination.page - 1) }}"><img class="pagination_arrow" src="/mgoblin_static/images/pagination_left.png" alt="Previous page" />Newer</a>
+ {% 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>
{% endif %}
{% if pagination.has_next %}
- <a href="{{ pagination.get_page_url_explicit(
- base_url, get_params,
- pagination.page + 1) }}">Older<img class="pagination_arrow" src="/mgoblin_static/images/pagination_right.png" alt="Next page" />
- </a>
+ {% 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>
{% endif %}
<br />
Go to page:
diff --git a/mediagoblin/templates/mediagoblin/utils/prev_next.html b/mediagoblin/templates/mediagoblin/utils/prev_next.html
index 74f855ed..75903076 100644
--- a/mediagoblin/templates/mediagoblin/utils/prev_next.html
+++ b/mediagoblin/templates/mediagoblin/utils/prev_next.html
@@ -25,23 +25,23 @@
{# 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="/mgoblin_static/images/navigation_left.png" alt="Previous image" />
+ <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="/mgoblin_static/images/navigation_end.png" alt="No previous images" />
+ <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="/mgoblin_static/images/navigation_right.png" alt="Next image" />
+ <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="/mgoblin_static/images/navigation_end.png" alt="No following images" />
+ <img src="{{ request.staticdirect('/images/navigation_end.png') }}" alt="No following images" />
</p>
{% endif %}
</div>
diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py
index eed418c6..fbbe1613 100644
--- a/mediagoblin/tests/test_auth.py
+++ b/mediagoblin/tests/test_auth.py
@@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import urlparse
+import datetime
from nose.tools import assert_equal
@@ -237,6 +238,93 @@ def test_register_views(test_app):
## TODO: Also check for double instances of an email address?
+ ### Oops, forgot the password
+ # -------------------
+ util.clear_test_template_context()
+ response = test_app.post(
+ '/auth/forgot_password/',
+ {'username': 'happygirl'})
+ response.follow()
+
+ ## Did we redirect to the proper page? Use the right template?
+ assert_equal(
+ urlparse.urlsplit(response.location)[2],
+ '/auth/forgot_password/email_sent/')
+ assert util.TEMPLATE_TEST_CONTEXT.has_key(
+ 'mediagoblin/auth/fp_email_sent.html')
+
+ ## Make sure link to change password is sent by email
+ assert len(util.EMAIL_TEST_INBOX) == 1
+ message = util.EMAIL_TEST_INBOX.pop()
+ assert message['To'] == 'happygrrl@example.org'
+ email_context = util.TEMPLATE_TEST_CONTEXT[
+ 'mediagoblin/auth/fp_verification_email.txt']
+ #TODO - change the name of verification_url to something forgot-password-ish
+ assert email_context['verification_url'] in message.get_payload(decode=True)
+
+ path = urlparse.urlsplit(email_context['verification_url'])[2]
+ get_params = urlparse.urlsplit(email_context['verification_url'])[3]
+ assert path == u'/auth/forgot_password/verify/'
+ parsed_get_params = urlparse.parse_qs(get_params)
+
+ # 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']]
+
+ ### 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
+
+ ## Try using a bs password-changing verification key, shouldn't work
+ util.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'
+
+ ## Try using an expired token to change password, shouldn't work
+ util.clear_test_template_context()
+ 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
+ new_user.save()
+
+ ## Verify step 1 of password-change works -- can see form to change password
+ util.clear_test_template_context()
+ response = test_app.get("%s?%s" % (path, get_params))
+ assert util.TEMPLATE_TEST_CONTEXT.has_key('mediagoblin/auth/change_fp.html')
+
+ ## Verify step 2.1 of password-change works -- report success to user
+ util.clear_test_template_context()
+ response = test_app.post(
+ '/auth/forgot_password/verify/', {
+ 'userid': parsed_get_params['userid'],
+ 'password': 'iamveryveryhappy',
+ 'confirm_password': 'iamveryveryhappy',
+ 'token': parsed_get_params['token']})
+ response.follow()
+ assert util.TEMPLATE_TEST_CONTEXT.has_key(
+ 'mediagoblin/auth/fp_changed_success.html')
+
+ ## Verify step 2.2 of password-change works -- login w/ new password success
+ util.clear_test_template_context()
+ response = test_app.post(
+ '/auth/login/', {
+ 'username': u'happygirl',
+ 'password': 'iamveryveryhappy'})
+
+ # User should be redirected
+ response.follow()
+ assert_equal(
+ urlparse.urlsplit(response.location)[2],
+ '/')
+ assert util.TEMPLATE_TEST_CONTEXT.has_key(
+ 'mediagoblin/root.html')
+
@setup_fresh_app
def test_authentication_views(test_app):
diff --git a/mediagoblin/tests/test_cache.py b/mediagoblin/tests/test_cache.py
new file mode 100644
index 00000000..cbffeb84
--- /dev/null
+++ b/mediagoblin/tests/test_cache.py
@@ -0,0 +1,52 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+from mediagoblin.tests.tools import setup_fresh_app
+from mediagoblin import mg_globals
+
+
+DATA_TO_CACHE = {
+ 'herp': 'derp',
+ 'lol': 'cats'}
+
+
+def _get_some_data(key):
+ """
+ Stuid function that makes use of some caching.
+ """
+ some_data_cache = mg_globals.cache.get_cache('sum_data')
+ if some_data_cache.has_key(key):
+ return some_data_cache.get(key)
+
+ value = DATA_TO_CACHE.get(key)
+ some_data_cache.put(key, value)
+ return value
+
+
+@setup_fresh_app
+def test_cache_working(test_app):
+ some_data_cache = mg_globals.cache.get_cache('sum_data')
+ assert not some_data_cache.has_key('herp')
+ assert _get_some_data('herp') == 'derp'
+ assert some_data_cache.get('herp') == 'derp'
+ # should get the same value again
+ assert _get_some_data('herp') == 'derp'
+
+ # now we force-change it, but the function should use the cached
+ # version
+ some_data_cache.put('herp', 'pred')
+ assert _get_some_data('herp') == 'pred'
diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini
index 9d938b4f..ab32cccc 100644
--- a/mediagoblin/tests/test_mgoblin_app.ini
+++ b/mediagoblin/tests/test_mgoblin_app.ini
@@ -19,5 +19,9 @@ base_url = /mgoblin_media/
[storage:queuestore]
base_dir = %(here)s/test_user_dev/media/queue
+[beaker.cache]
+data_dir = %(here)s/test_user_dev/beaker/cache/data
+lock_dir = %(here)s/test_user_dev/beaker/cache/lock
+
[celery]
celery_always_eager = true
diff --git a/mediagoblin/tests/test_storage.py b/mediagoblin/tests/test_storage.py
index 9c96f6ca..46ecb2ec 100644
--- a/mediagoblin/tests/test_storage.py
+++ b/mediagoblin/tests/test_storage.py
@@ -52,7 +52,7 @@ class FakeStorageSystem():
self.foobie = foobie
self.blech = blech
-class FakeRemoteStorage(storage.BasicFileStorage):
+class FakeRemoteStorage(storage.filestorage.BasicFileStorage):
# Theoretically despite this, all the methods should work but it
# should force copying to the workbench
local_storage = False
@@ -66,7 +66,7 @@ def test_storage_system_from_config():
'garbage_arg': 'trash'})
assert this_storage.base_url == 'http://example.org/moodia/'
assert this_storage.base_dir == '/tmp/'
- assert this_storage.__class__ is storage.BasicFileStorage
+ assert this_storage.__class__ is storage.filestorage.BasicFileStorage
this_storage = storage.storage_system_from_config(
{'foobie': 'eiboof',
@@ -88,7 +88,7 @@ def get_tmp_filestorage(mount_url=None, fake_remote=False):
if fake_remote:
this_storage = FakeRemoteStorage(tmpdir, mount_url)
else:
- this_storage = storage.BasicFileStorage(tmpdir, mount_url)
+ this_storage = storage.filestorage.BasicFileStorage(tmpdir, mount_url)
return tmpdir, this_storage
diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py
index b7013839..007c0348 100644
--- a/mediagoblin/tests/test_submission.py
+++ b/mediagoblin/tests/test_submission.py
@@ -178,7 +178,8 @@ class TestSubmission:
# No work: user=media.uploader().username,
user=self.test_user['username'],
media=media['_id']),
- {'confirm': 'False'})
+ # no value means no confirm
+ {})
response.follow()
@@ -197,7 +198,7 @@ class TestSubmission:
# No work: user=media.uploader().username,
user=self.test_user['username'],
media=media['_id']),
- {'confirm': 'True'})
+ {'confirm': 'y'})
response.follow()
diff --git a/mediagoblin/user_pages/forms.py b/mediagoblin/user_pages/forms.py
index 22dedfd9..57061d34 100644
--- a/mediagoblin/user_pages/forms.py
+++ b/mediagoblin/user_pages/forms.py
@@ -26,7 +26,5 @@ class MediaCommentForm(wtforms.Form):
class ConfirmDeleteForm(wtforms.Form):
- confirm = wtforms.RadioField('Confirm',
- default='False',
- choices=[('False', 'No, I made a mistake!'),
- ('True', 'Yes, delete it!')])
+ confirm = wtforms.BooleanField(
+ _('I am sure I want to delete this'))
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py
index 2c376283..6a82d718 100644
--- a/mediagoblin/user_pages/views.py
+++ b/mediagoblin/user_pages/views.py
@@ -154,7 +154,7 @@ def media_confirm_delete(request, media):
form = user_forms.ConfirmDeleteForm(request.POST)
if request.method == 'POST' and form.validate():
- if request.POST.get('confirm') == 'True':
+ if form.confirm.data is True:
username = media.uploader()['username']
# Delete all files on the public storage
@@ -165,9 +165,8 @@ def media_confirm_delete(request, media):
return redirect(request, "mediagoblin.user_pages.user_home",
user=username)
else:
- return redirect(request, "mediagoblin.user_pages.media_home",
- user=media.uploader()['username'],
- media=media['slug'])
+ 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'])):
diff --git a/mediagoblin/util.py b/mediagoblin/util.py
index bc72f8df..dad91326 100644
--- a/mediagoblin/util.py
+++ b/mediagoblin/util.py
@@ -692,7 +692,7 @@ def delete_media_files(media):
Arguments:
- media: A MediaEntry document
"""
- for handle, listpath in media['media_files'].items():
+ for listpath in media['media_files'].itervalues():
mg_globals.public_store.delete_file(
listpath)