diff options
83 files changed, 4062 insertions, 1537 deletions
@@ -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 Binary files differnew file mode 100644 index 00000000..bc3529fc --- /dev/null +++ b/extlib/lato/Lato-Bold.ttf diff --git a/extlib/lato/Lato-BoldItalic.ttf b/extlib/lato/Lato-BoldItalic.ttf Binary files differnew file mode 100644 index 00000000..2cf5ae0d --- /dev/null +++ b/extlib/lato/Lato-BoldItalic.ttf diff --git a/extlib/lato/Lato-Italic.ttf b/extlib/lato/Lato-Italic.ttf Binary files differnew file mode 100644 index 00000000..11ca3eb6 --- /dev/null +++ b/extlib/lato/Lato-Italic.ttf diff --git a/extlib/lato/Lato-Regular.ttf b/extlib/lato/Lato-Regular.ttf Binary files differnew file mode 100644 index 00000000..26ce1002 --- /dev/null +++ b/extlib/lato/Lato-Regular.ttf 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 Binary files differindex dafcdb66..1d75d517 100644 --- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex 848ea148..06a01632 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex 4fb13eef..506e882b 100644 --- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo 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 <a " -"href=\"http://gnu.org\">GNU</a>.)" +"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 Binary files differindex 58531d96..2e64b814 100644 --- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex fe006cdc..5b3adb77 100644 --- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo 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 Binary files differnew file mode 100644 index 00000000..9a010192 --- /dev/null +++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex 6308eaa6..4bdc4d5a 100644 --- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex 809cd90d..57447395 100644 --- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex 8c196295..7bf5a87a 100644 --- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex 28cf6af2..189733f6 100644 --- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex 4c3e785c..f43e25f6 100644 --- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex babdb60e..c1eab2ba 100644 --- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex 97723319..4c433381 100644 --- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex d3336ad0..3c5d864b 100644 --- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex f84cb70a..2cdf2fee 100644 --- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo 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 Binary files differindex e2cdd52f..adc3548e 100644 --- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo 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) |