Merge remote-tracking branch 'refs/remotes/upstream/master' into 569-application-middleware

Conflicts:
	mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html
This commit is contained in:
Nathan Yergler 2011-10-01 12:08:58 -07:00
commit 6bfbe02426
83 changed files with 4135 additions and 1610 deletions

View File

@ -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!

20
extlib/960.gs/MIT.txt Normal file
View File

@ -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.

BIN
extlib/lato/Lato-Bold.ttf Normal file

Binary file not shown.

Binary file not shown.

BIN
extlib/lato/Lato-Italic.ttf Normal file

Binary file not shown.

Binary file not shown.

97
extlib/lato/OFL_1.1.txt Normal file
View File

@ -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.

View File

@ -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'):

View File

@ -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()])

View File

@ -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)

View File

@ -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')]

View File

@ -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

View File

@ -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()

View File

@ -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)

View File

@ -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']

View File

@ -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')

View File

@ -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',

View File

@ -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)

View File

@ -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:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr "اكتبها مرة أخرى هنا للتأكد من عدم وجود أخطاء إملائية."
#: mediagoblin/auth/forms.py:42
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
#: mediagoblin/auth/forms.py:45
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
msgid "Slug"
msgstr ""
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr ""
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "الوسوم"
#: mediagoblin/edit/forms.py:38
#: 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 "السيرة"
#: 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. (Were 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/user_pages/forms.py:24
msgid "Comment"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
msgid "Newer"
msgstr ""
#: mediagoblin/user_pages/views.py:176
#: 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:175
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""

View File

@ -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
msgid "Slug"
msgstr "Kurztitel"
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr "Bitte gib einen Kurztitel ein"
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Markierungen"
#: mediagoblin/edit/forms.py:38
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Kurztitel"
#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Bitte gib einen Kurztitel ein"
#: 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: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."

View File

@ -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
msgid "Slug"
msgstr ""
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr ""
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr ""
#: mediagoblin/edit/forms.py:38
#: 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 ""
#: 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 ""

View File

@ -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
msgid "Slug"
msgstr "La distingiga adresparto"
#: mediagoblin/edit/forms.py:30
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
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Etikedoj"
#: mediagoblin/edit/forms.py:38
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "La distingiga adresparto"
#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "La distingiga adresparto ne povas esti malplena"
#: 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: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. (Were a <a href=\"http://gnu.org\">GNU</a> project, "
"after all.)"
msgstr ""
"Libera verko. (Ni ja estas projekto de &lt;a "
"href=\"http://gnu.org\"&gt;GNU&lt;/a&gt;.)"
"Libera verko. (Ni ja estas projekto de <a href=\"http://gnu.org\">GNU</a>.)"
#: mediagoblin/templates/mediagoblin/root.html:32
msgid ""
"Aiming to make the world a better place through decentralization and "
"(eventually, coming soon!) federation!"
msgstr ""
"Celanta plibonigi la mondon per sencentreco kaj (iam, baldaŭ!) federateco!"
#: mediagoblin/templates/mediagoblin/root.html:33
msgid ""
"Built for extensibility. (Multiple media types coming soon to the software,"
" including video support!)"
msgstr ""
"Kreita por etendado. (Baldaŭ en la programo aperos subteno de pluraj "
"informspecoj, inkluzive de filmoj!)"
#: mediagoblin/templates/mediagoblin/root.html:34
msgid ""
@ -229,6 +244,63 @@ msgid ""
"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
" software!</a>)"
msgstr ""
"Vivanta per homoj kiel vi. (<a "
"href=\"http://mediagoblin.org/pages/join.html\">Vi povas helpi al ni "
"plibonigi la programon!</a>)"
#: mediagoblin/templates/mediagoblin/root.html:38
msgid "Excited to join us?"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:39
#, python-format
msgid ""
"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
" or\n"
" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
msgstr ""
#: mediagoblin/templates/mediagoblin/root.html:53
msgid "Most recent media"
msgstr "Plej nove aldonitaj dosieroj"
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
msgid "Enter your new password"
msgstr "Enigu vian novan pasvorton"
#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
msgid "Enter your username or email"
msgstr "Enigu vian salutnomon aŭ retpoŝtadreson"
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
msgid "Your password has been changed. Try to log in now."
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
msgid ""
"Check your inbox. We sent an email with a URL for changing your password."
msgstr ""
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
#, python-format
msgid ""
"Hi %(username)s,\n"
"\n"
"to change your GNU MediaGoblin password, open the following URL in \n"
"your web browser:\n"
"\n"
"%(verification_url)s\n"
"\n"
"If you think this is an error, just ignore this email and continue being\n"
"a happy goblin!"
msgstr ""
"Saluton, %(username)s,\n"
"\n"
"por ŝanĝi vian pasvorton ĉe GNUa MediaGoblin, sekvu la jenan retadreson per via TTT-legilo:\n"
"\n"
"%(verification_url)s\n"
"\n"
"Se vi pensas, ke ĉi tiu retletero estas sendita erare, simple ignoru ĝin kaj plu restu feliĉa koboldo!"
#: mediagoblin/templates/mediagoblin/auth/login.html:29
msgid "Logging in failed!"
@ -242,6 +314,14 @@ msgstr "Ĉu ankoraŭ sen konto?"
msgid "Create one here!"
msgstr "Kreu ĝin ĉi tie!"
#: mediagoblin/templates/mediagoblin/auth/login.html:48
msgid "Forgot your password?"
msgstr "Ĉu vi forgesis vian pasvorton?"
#: mediagoblin/templates/mediagoblin/auth/login.html:51
msgid "Change it!"
msgstr "Ŝanĝu ĝin!"
#: mediagoblin/templates/mediagoblin/auth/register.html:27
msgid "Create an account!"
msgstr "Kreu konton!"
@ -272,12 +352,12 @@ msgid "Editing %(media_title)s"
msgstr "Priredaktado de %(media_title)s"
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
msgid "Cancel"
msgstr "Nuligi"
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
msgid "Save changes"
msgstr "Konservi ŝanĝojn"
@ -311,34 +391,34 @@ msgstr "Uzanto ne trovita."
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
#, python-format
msgid "Really delete %(title)s?"
msgstr ""
msgstr "Ĉu efektive forigi %(title)s?"
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
msgid ""
"If you choose yes, the media entry will be deleted "
"<strong>permanently.</strong>"
msgstr ""
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
msgid "Delete Permanently"
msgstr "Forigi senrevene"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
msgid "Media processing panel"
msgstr ""
msgstr "Kontrolejo pri dosierpreparado."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
msgid ""
"You can track the state of media being processed for your gallery here."
msgstr ""
"Ĉi tie vi povas informiĝi pri la stato de preparado de dosieroj por via "
"galerio."
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
msgid "Media in-processing"
msgstr ""
msgstr "Dosieroj preparataj"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
msgid "No media in-processing"
msgstr ""
msgstr "Neniu dosieroj preparatas"
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
msgid "These uploads failed to process:"
msgstr ""
msgstr "Preparado de ĉi tiuj alŝutaĵoj malsukcesis:"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
@ -347,7 +427,7 @@ msgstr "Necesas konfirmo de retpoŝtadreso"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
msgid "Almost done! Your account still needs to be activated."
msgstr ""
msgstr "Preskaŭ finite! Restas nur validigi vian konton."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
msgid ""
@ -368,6 +448,8 @@ msgid ""
"Someone has registered an account with this username, but it still has to be"
" activated."
msgstr ""
"Iu registris konton kun tiu ĉi uzantonomo, sed ĝi devas ankoraŭ esti "
"aktivigita."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
#, python-format
@ -394,7 +476,7 @@ msgstr "Redakti profilon"
#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
msgid "This user hasn't filled in their profile (yet)."
msgstr ""
msgstr "Ĉi tiu uzanto ne jam aldonis informojn pri si."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
#, python-format
@ -406,6 +488,7 @@ msgid ""
"This is where your media will appear, but you don't seem to have added "
"anything yet."
msgstr ""
"Ĝuste ĉi tie aperos viaj dosieroj, sed vi ŝajne ankoraŭ nenion alŝutis."
#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
msgid "Add media"
@ -421,14 +504,26 @@ msgstr "flusimbolo"
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
msgid "Atom feed"
msgstr ""
msgstr "Atom-a informfluo"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
msgid "Newer"
msgstr "Plinovaj"
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
msgid "Older"
msgstr "Malplinovaj"
#: mediagoblin/user_pages/forms.py:24
msgid "Comment"
msgstr "Komento"
#: mediagoblin/user_pages/views.py:176
#: mediagoblin/user_pages/forms.py:30
msgid "I am sure I want to delete this"
msgstr "Mi estas certa, ke mi volas forigi ĉi tion"
#: mediagoblin/user_pages/views.py:175
msgid "You are about to delete another user's media. Proceed with caution."
msgstr ""
msgstr "Vi estas forigonta dosieron de alia uzanto. Estu singardema."

View File

@ -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
msgid "Slug"
msgstr "Ficha"
#: mediagoblin/edit/forms.py:30
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
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Etiquetas"
#: mediagoblin/edit/forms.py:38
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Ficha"
#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "La ficha no puede estar vacía"
#: 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: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."

View File

@ -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
msgid "Slug"
msgstr "Légende"
#: mediagoblin/edit/forms.py:30
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
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Tags"
#: mediagoblin/edit/forms.py:38
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Légende"
#: 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: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: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. (Were 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
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 ""
"Vous êtes sur le point de supprimer des médias d'un autre utilisateur. "
"Procédez avec prudence."

Binary file not shown.

View File

@ -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. (Were 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."

View File

@ -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
msgid "Slug"
msgstr "スラグ"
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr "スラグは必要です。"
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "タグ"
#: mediagoblin/edit/forms.py:38
#: 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 "自己紹介"
#: 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 ""

View File

@ -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
msgid "Slug"
msgstr ""
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr ""
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Etiket"
#: mediagoblin/edit/forms.py:38
#: 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: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 ""

View File

@ -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
msgid "Slug"
msgstr "Adressetittel"
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr "Adressetittelen kan ikkje vera tom"
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Merkelappar"
#: mediagoblin/edit/forms.py:38
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Adressetittel"
#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Adressetittelen kan ikkje vera tom"
#: 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 "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 ""

View File

@ -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
msgid "Slug"
msgstr ""
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr ""
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Tags"
#: mediagoblin/edit/forms.py:38
#: 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 "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 ""

View File

@ -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:39
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr "Introdu parola din nou pentru verificare."
#: mediagoblin/auth/forms.py:42
msgid "Type it again here to make sure there are no spelling mistakes."
msgstr ""
#: mediagoblin/auth/forms.py:45
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
msgid "Slug"
msgstr "Identificator"
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr "Identificatorul nu poate să lipsească"
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Etichete"
#: mediagoblin/edit/forms.py:38
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Identificator"
#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Identificatorul nu poate să lipsească"
#: 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: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 "Editi 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 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ță."

View File

@ -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
msgid "Slug"
msgstr "Отличительная часть адреса"
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr "Отличительная часть адреса необходима"
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Метки"
#: mediagoblin/edit/forms.py:38
msgid "Bio"
msgstr "Биограаия"
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Отличительная часть адреса"
#: mediagoblin/edit/forms.py:41
#: 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 "Биография"
#: 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. (Were 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 "Вы на пороге удаления файла другого пользователя. Будьте осторожны."

View File

@ -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
msgid "Slug"
msgstr "Oznaka"
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr "Oznaka ne sme biti prazna"
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Oznake"
#: mediagoblin/edit/forms.py:38
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Oznaka"
#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Oznaka ne sme biti prazna"
#: 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 "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 ""

View File

@ -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
msgid "Slug"
msgstr ""
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr ""
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr ""
#: mediagoblin/edit/forms.py:38
#: 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 ""
#: 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 ""

View File

@ -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
msgid "Slug"
msgstr "Sökvägsnamn"
#: mediagoblin/edit/forms.py:30
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
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "Taggar"
#: mediagoblin/edit/forms.py:38
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "Sökvägsnamn"
#: mediagoblin/edit/forms.py:34
msgid "The slug can't be empty"
msgstr "Sökvägsnamnet kan inte vara tomt"
#: 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: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."

View File

@ -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
msgid "Slug"
msgstr "自訂字串"
#: mediagoblin/edit/forms.py:30
msgid "The slug can't be empty"
msgstr "自訂字串不能空白"
#: mediagoblin/edit/forms.py:33 mediagoblin/submit/forms.py:31
#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32
msgid "Tags"
msgstr "標籤"
#: mediagoblin/edit/forms.py:38
msgid "Bio"
msgstr "自"
#: mediagoblin/edit/forms.py:33
msgid "Slug"
msgstr "自訂字串"
#: mediagoblin/edit/forms.py:41
#: 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 "自我介紹"
#: 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 "你在刪除其他人的媒體檔案。請小心處理喔。"

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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;
}

View File

@ -0,0 +1 @@
../../../extlib/lato/Lato-Bold.ttf

View File

@ -0,0 +1 @@
../../../extlib/lato/Lato-BoldItalic.ttf

View File

@ -0,0 +1 @@
../../../extlib/lato/Lato-Italic.ttf

View File

@ -0,0 +1 @@
../../../extlib/lato/Lato-Regular.ttf

View File

@ -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)

View File

@ -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)

View File

@ -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()

View File

@ -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)

View File

@ -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)

View File

@ -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])

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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>

View File

@ -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 %}

View File

@ -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>

View File

@ -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:

View File

@ -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>

View File

@ -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):

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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'))

View File

@ -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'])):

View File

@ -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)