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:
commit
6bfbe02426
2
AUTHORS
2
AUTHORS
@ -24,11 +24,13 @@ Thank you!
|
||||
* Karen Rustad
|
||||
* Mark Holmquist
|
||||
* Matt Lee
|
||||
* Nathan Yergler
|
||||
* Odin Hørthe Omdal
|
||||
* Osama Khalid
|
||||
* Rasmus Larsson
|
||||
* Sam Kleinman
|
||||
* Sebastian Spaeth
|
||||
* Shawn Khan
|
||||
* Will Kahn-Greene
|
||||
|
||||
If you think your name should be on this list, let us know!
|
||||
|
20
extlib/960.gs/MIT.txt
Normal file
20
extlib/960.gs/MIT.txt
Normal 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
BIN
extlib/lato/Lato-Bold.ttf
Normal file
Binary file not shown.
BIN
extlib/lato/Lato-BoldItalic.ttf
Normal file
BIN
extlib/lato/Lato-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
extlib/lato/Lato-Italic.ttf
Normal file
BIN
extlib/lato/Lato-Italic.ttf
Normal file
Binary file not shown.
BIN
extlib/lato/Lato-Regular.ttf
Normal file
BIN
extlib/lato/Lato-Regular.ttf
Normal file
Binary file not shown.
97
extlib/lato/OFL_1.1.txt
Normal file
97
extlib/lato/OFL_1.1.txt
Normal 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.
|
@ -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'):
|
||||
|
@ -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()])
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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')]
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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']
|
||||
|
@ -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')
|
||||
|
@ -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',
|
||||
|
@ -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)
|
||||
|
||||
|
Binary file not shown.
@ -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. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
|
||||
"after all.)"
|
||||
msgstr ""
|
||||
msgstr "مشروع حر، فنحن أحد مشاريع <a href=\"http://gnu.org\">غنو</a>."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:32
|
||||
msgid ""
|
||||
"Aiming to make the world a better place through decentralization and "
|
||||
"(eventually, coming soon!) federation!"
|
||||
msgstr ""
|
||||
msgstr "مشروع يحاول جعل عالمنا أفضل عن طريق اللامركزية (قريبًا!)."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:33
|
||||
msgid ""
|
||||
"Built for extensibility. (Multiple media types coming soon to the software,"
|
||||
" including video support!)"
|
||||
msgstr ""
|
||||
"جاهز للتمدد. (سيُضاف دعم أنساق كثيرة من الوسائط قريبًا، كما سندعم الفيديو!)."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:34
|
||||
msgid ""
|
||||
@ -225,21 +235,76 @@ msgid ""
|
||||
" software!</a>)"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:38
|
||||
msgid "Excited to join us?"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:39
|
||||
#, python-format
|
||||
msgid ""
|
||||
"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
|
||||
" or\n"
|
||||
" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:53
|
||||
msgid "Most recent media"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
|
||||
msgid "Enter your new password"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
|
||||
msgid "Enter your username or email"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
|
||||
msgid "Your password has been changed. Try to log in now."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
|
||||
msgid ""
|
||||
"Check your inbox. We sent an email with a URL for changing your password."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Hi %(username)s,\n"
|
||||
"\n"
|
||||
"to change your GNU MediaGoblin password, open the following URL in \n"
|
||||
"your web browser:\n"
|
||||
"\n"
|
||||
"%(verification_url)s\n"
|
||||
"\n"
|
||||
"If you think this is an error, just ignore this email and continue being\n"
|
||||
"a happy goblin!"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:29
|
||||
msgid "Logging in failed!"
|
||||
msgstr "فشل الولوج!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:42
|
||||
msgid "Don't have an account yet?"
|
||||
msgstr "ألا تملك حسابا؟"
|
||||
msgstr "ألا تملك حسابًا بعد؟"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:45
|
||||
msgid "Create one here!"
|
||||
msgstr "أنشئ حسابا هنا!"
|
||||
msgstr "أنشئ حسابًا هنا!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:48
|
||||
msgid "Forgot your password?"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:51
|
||||
msgid "Change it!"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:27
|
||||
msgid "Create an account!"
|
||||
msgstr "أنشئ حسابا!"
|
||||
msgstr "أنشئ حسابًا!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:30
|
||||
msgid "Create"
|
||||
@ -255,36 +320,36 @@ msgid ""
|
||||
"\n"
|
||||
"%(verification_url)s"
|
||||
msgstr ""
|
||||
"أهلا %(username)s،\n"
|
||||
"أهلًا يا %(username)s،\n"
|
||||
"\n"
|
||||
"لتفعيل حسابك في غنو ميدياغوبلن، افتح الرابط التالي\n"
|
||||
"في متصفحك:\n"
|
||||
"افتح الرابط التالي\n"
|
||||
"في متصفحك لتفعيل حسابك في غنو ميدياغوبلن:\n"
|
||||
"\n"
|
||||
"%(verification_url)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:29
|
||||
#, python-format
|
||||
msgid "Editing %(media_title)s"
|
||||
msgstr "تعديل %(media_title)s"
|
||||
msgstr "تحرير %(media_title)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
|
||||
msgid "Cancel"
|
||||
msgstr "ألغِ"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
|
||||
msgid "Save changes"
|
||||
msgstr "احفظ التغييرات"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
|
||||
#, python-format
|
||||
msgid "Editing %(username)s's profile"
|
||||
msgstr "تعديل ملف %(username)s"
|
||||
msgstr "تحرير ملف %(username)s الشخصي"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/listings/tag.html:31
|
||||
msgid "Media tagged with:"
|
||||
msgstr "الوسائط الموسومة بـ:"
|
||||
msgstr "الوسائط الموسومة ب"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/submit/start.html:26
|
||||
msgid "Submit yer media"
|
||||
@ -302,17 +367,15 @@ msgstr "وسائط <a href=\"%(user_url)s\">%(username)s</a>"
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
|
||||
msgid "Sorry, no such user found."
|
||||
msgstr "عذرا، لا يوجد مستخدم مماثل"
|
||||
msgstr "عذرًا، تعذر العثور على مستخدم بهذا الاسم."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
|
||||
#, python-format
|
||||
msgid "Really delete %(title)s?"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
|
||||
msgid ""
|
||||
"If you choose yes, the media entry will be deleted "
|
||||
"<strong>permanently.</strong>"
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
|
||||
msgid "Delete Permanently"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
|
||||
@ -343,7 +406,7 @@ msgstr "يجب التحقق من البريد الإلكتروني"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
|
||||
msgid "Almost done! Your account still needs to be activated."
|
||||
msgstr "انتهينا تقريبا! لا زال حسابك يحتاج إلى التفعيل."
|
||||
msgstr "أوشكنا على الانتهاء! ما زال حسابك بحاجة إلى التفعيل."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
|
||||
msgid ""
|
||||
@ -376,7 +439,7 @@ msgstr ""
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
|
||||
#, python-format
|
||||
msgid "%(username)s's profile"
|
||||
msgstr "ملف %(username)s's"
|
||||
msgstr "ملف %(username)s الشخصي"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
|
||||
msgid "Here's a spot to tell others about yourself."
|
||||
@ -385,7 +448,7 @@ msgstr "هذه زاوية لتخبر الآخرين فيها عن نفسك."
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
|
||||
msgid "Edit profile"
|
||||
msgstr "عدل الملف"
|
||||
msgstr "حرِّر الملف الشخصي"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
|
||||
msgid "This user hasn't filled in their profile (yet)."
|
||||
@ -394,7 +457,7 @@ msgstr ""
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
|
||||
#, python-format
|
||||
msgid "View all of %(username)s's media"
|
||||
msgstr "اعرض كل وسائط %(username)s"
|
||||
msgstr "أظهِر كل وسائط %(username)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
|
||||
msgid ""
|
||||
@ -408,7 +471,7 @@ msgstr "أضف وسائط"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
|
||||
msgid "There doesn't seem to be any media here yet..."
|
||||
msgstr "لا يبدو أنه يوجد أي وسائط هنا حتى الآن..."
|
||||
msgstr "لا يبدو أنه توجد أي وسائط هنا حتى الآن..."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
|
||||
msgid "feed icon"
|
||||
@ -418,11 +481,23 @@ msgstr ""
|
||||
msgid "Atom feed"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/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 ""
|
||||
|
||||
|
Binary file not shown.
@ -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."
|
||||
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
Binary file not shown.
@ -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. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
|
||||
"after all.)"
|
||||
msgstr ""
|
||||
"Libera verko. (Ni ja estas projekto de <a "
|
||||
"href=\"http://gnu.org\">GNU</a>.)"
|
||||
"Libera verko. (Ni ja estas projekto de <a href=\"http://gnu.org\">GNU</a>.)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:32
|
||||
msgid ""
|
||||
"Aiming to make the world a better place through decentralization and "
|
||||
"(eventually, coming soon!) federation!"
|
||||
msgstr ""
|
||||
"Celanta plibonigi la mondon per sencentreco kaj (iam, baldaŭ!) federateco!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:33
|
||||
msgid ""
|
||||
"Built for extensibility. (Multiple media types coming soon to the software,"
|
||||
" including video support!)"
|
||||
msgstr ""
|
||||
"Kreita por etendado. (Baldaŭ en la programo aperos subteno de pluraj "
|
||||
"informspecoj, inkluzive de filmoj!)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:34
|
||||
msgid ""
|
||||
@ -229,6 +244,63 @@ msgid ""
|
||||
"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
|
||||
" software!</a>)"
|
||||
msgstr ""
|
||||
"Vivanta per homoj kiel vi. (<a "
|
||||
"href=\"http://mediagoblin.org/pages/join.html\">Vi povas helpi al ni "
|
||||
"plibonigi la programon!</a>)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:38
|
||||
msgid "Excited to join us?"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:39
|
||||
#, python-format
|
||||
msgid ""
|
||||
"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
|
||||
" or\n"
|
||||
" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:53
|
||||
msgid "Most recent media"
|
||||
msgstr "Plej nove aldonitaj dosieroj"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
|
||||
msgid "Enter your new password"
|
||||
msgstr "Enigu vian novan pasvorton"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
|
||||
msgid "Enter your username or email"
|
||||
msgstr "Enigu vian salutnomon aŭ retpoŝtadreson"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
|
||||
msgid "Your password has been changed. Try to log in now."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
|
||||
msgid ""
|
||||
"Check your inbox. We sent an email with a URL for changing your password."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Hi %(username)s,\n"
|
||||
"\n"
|
||||
"to change your GNU MediaGoblin password, open the following URL in \n"
|
||||
"your web browser:\n"
|
||||
"\n"
|
||||
"%(verification_url)s\n"
|
||||
"\n"
|
||||
"If you think this is an error, just ignore this email and continue being\n"
|
||||
"a happy goblin!"
|
||||
msgstr ""
|
||||
"Saluton, %(username)s,\n"
|
||||
"\n"
|
||||
"por ŝanĝi vian pasvorton ĉe GNUa MediaGoblin, sekvu la jenan retadreson per via TTT-legilo:\n"
|
||||
"\n"
|
||||
"%(verification_url)s\n"
|
||||
"\n"
|
||||
"Se vi pensas, ke ĉi tiu retletero estas sendita erare, simple ignoru ĝin kaj plu restu feliĉa koboldo!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:29
|
||||
msgid "Logging in failed!"
|
||||
@ -242,6 +314,14 @@ msgstr "Ĉu ankoraŭ sen konto?"
|
||||
msgid "Create one here!"
|
||||
msgstr "Kreu ĝin ĉi tie!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:48
|
||||
msgid "Forgot your password?"
|
||||
msgstr "Ĉu vi forgesis vian pasvorton?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:51
|
||||
msgid "Change it!"
|
||||
msgstr "Ŝanĝu ĝin!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:27
|
||||
msgid "Create an account!"
|
||||
msgstr "Kreu konton!"
|
||||
@ -272,12 +352,12 @@ msgid "Editing %(media_title)s"
|
||||
msgstr "Priredaktado de %(media_title)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
|
||||
msgid "Cancel"
|
||||
msgstr "Nuligi"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
|
||||
msgid "Save changes"
|
||||
msgstr "Konservi ŝanĝojn"
|
||||
|
||||
@ -311,34 +391,34 @@ msgstr "Uzanto ne trovita."
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
|
||||
#, python-format
|
||||
msgid "Really delete %(title)s?"
|
||||
msgstr ""
|
||||
msgstr "Ĉu efektive forigi %(title)s?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
|
||||
msgid ""
|
||||
"If you choose yes, the media entry will be deleted "
|
||||
"<strong>permanently.</strong>"
|
||||
msgstr ""
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
|
||||
msgid "Delete Permanently"
|
||||
msgstr "Forigi senrevene"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
|
||||
msgid "Media processing panel"
|
||||
msgstr ""
|
||||
msgstr "Kontrolejo pri dosierpreparado."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
|
||||
msgid ""
|
||||
"You can track the state of media being processed for your gallery here."
|
||||
msgstr ""
|
||||
"Ĉi tie vi povas informiĝi pri la stato de preparado de dosieroj por via "
|
||||
"galerio."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
|
||||
msgid "Media in-processing"
|
||||
msgstr ""
|
||||
msgstr "Dosieroj preparataj"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
|
||||
msgid "No media in-processing"
|
||||
msgstr ""
|
||||
msgstr "Neniu dosieroj preparatas"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
|
||||
msgid "These uploads failed to process:"
|
||||
msgstr ""
|
||||
msgstr "Preparado de ĉi tiuj alŝutaĵoj malsukcesis:"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
|
||||
@ -347,7 +427,7 @@ msgstr "Necesas konfirmo de retpoŝtadreso"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
|
||||
msgid "Almost done! Your account still needs to be activated."
|
||||
msgstr ""
|
||||
msgstr "Preskaŭ finite! Restas nur validigi vian konton."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
|
||||
msgid ""
|
||||
@ -368,6 +448,8 @@ msgid ""
|
||||
"Someone has registered an account with this username, but it still has to be"
|
||||
" activated."
|
||||
msgstr ""
|
||||
"Iu registris konton kun tiu ĉi uzantonomo, sed ĝi devas ankoraŭ esti "
|
||||
"aktivigita."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
|
||||
#, python-format
|
||||
@ -394,7 +476,7 @@ msgstr "Redakti profilon"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
|
||||
msgid "This user hasn't filled in their profile (yet)."
|
||||
msgstr ""
|
||||
msgstr "Ĉi tiu uzanto ne jam aldonis informojn pri si."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
|
||||
#, python-format
|
||||
@ -406,6 +488,7 @@ msgid ""
|
||||
"This is where your media will appear, but you don't seem to have added "
|
||||
"anything yet."
|
||||
msgstr ""
|
||||
"Ĝuste ĉi tie aperos viaj dosieroj, sed vi ŝajne ankoraŭ nenion alŝutis."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
|
||||
msgid "Add media"
|
||||
@ -421,14 +504,26 @@ msgstr "flusimbolo"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
|
||||
msgid "Atom feed"
|
||||
msgstr ""
|
||||
msgstr "Atom-a informfluo"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
|
||||
msgid "Newer"
|
||||
msgstr "Plinovaj"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
|
||||
msgid "Older"
|
||||
msgstr "Malplinovaj"
|
||||
|
||||
#: mediagoblin/user_pages/forms.py:24
|
||||
msgid "Comment"
|
||||
msgstr "Komento"
|
||||
|
||||
#: mediagoblin/user_pages/views.py:176
|
||||
#: mediagoblin/user_pages/forms.py:30
|
||||
msgid "I am sure I want to delete this"
|
||||
msgstr "Mi estas certa, ke mi volas forigi ĉi tion"
|
||||
|
||||
#: mediagoblin/user_pages/views.py:175
|
||||
msgid "You are about to delete another user's media. Proceed with caution."
|
||||
msgstr ""
|
||||
msgstr "Vi estas forigonta dosieron de alia uzanto. Estu singardema."
|
||||
|
||||
|
||||
|
Binary file not shown.
@ -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."
|
||||
|
||||
|
||||
|
Binary file not shown.
@ -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. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
|
||||
"after all.)"
|
||||
msgstr ""
|
||||
"Logiciel libre. (Nous sommes une <a href=\"http://gnu.org\">GNU</a> projet, "
|
||||
"après tout.)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:32
|
||||
msgid ""
|
||||
"Aiming to make the world a better place through decentralization and "
|
||||
"(eventually, coming soon!) federation!"
|
||||
msgstr ""
|
||||
"Visant à rendre le monde meilleur grâce à la décentralisation et "
|
||||
"(éventuellement, venir bientôt!) fédération!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:33
|
||||
msgid ""
|
||||
"Built for extensibility. (Multiple media types coming soon to the software,"
|
||||
" including video support!)"
|
||||
msgstr ""
|
||||
"Construit pour l'extensibilité. (Plusieurs types de médias à venir au "
|
||||
"logiciel, y compris le support vidéo!)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:34
|
||||
msgid ""
|
||||
@ -230,26 +252,84 @@ msgid ""
|
||||
"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
|
||||
" software!</a>)"
|
||||
msgstr ""
|
||||
"Propulsé par des gens comme vous. (<a "
|
||||
"href=\"http://mediagoblin.org/pages/join.html\">Vous pouvez nous aider à "
|
||||
"améliorer ce logiciel!</a>)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:38
|
||||
msgid "Excited to join us?"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:39
|
||||
#, python-format
|
||||
msgid ""
|
||||
"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
|
||||
" or\n"
|
||||
" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:53
|
||||
msgid "Most recent media"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
|
||||
msgid "Enter your new password"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
|
||||
msgid "Enter your username or email"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
|
||||
msgid "Your password has been changed. Try to log in now."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
|
||||
msgid ""
|
||||
"Check your inbox. We sent an email with a URL for changing your password."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Hi %(username)s,\n"
|
||||
"\n"
|
||||
"to change your GNU MediaGoblin password, open the following URL in \n"
|
||||
"your web browser:\n"
|
||||
"\n"
|
||||
"%(verification_url)s\n"
|
||||
"\n"
|
||||
"If you think this is an error, just ignore this email and continue being\n"
|
||||
"a happy goblin!"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:29
|
||||
msgid "Logging in failed!"
|
||||
msgstr ""
|
||||
msgstr "Connexion a échoué!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:42
|
||||
msgid "Don't have an account yet?"
|
||||
msgstr "Pas encore de compte ?"
|
||||
msgstr "Pas encore de compte?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:45
|
||||
msgid "Create one here!"
|
||||
msgstr "Créez-en un ici !"
|
||||
msgstr "Créez-en un ici!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:48
|
||||
msgid "Forgot your password?"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:51
|
||||
msgid "Change it!"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:27
|
||||
msgid "Create an account!"
|
||||
msgstr "Créer un compte !"
|
||||
msgstr "Créer un compte!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:30
|
||||
msgid "Create"
|
||||
msgstr ""
|
||||
msgstr "Créer"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19
|
||||
#, python-format
|
||||
@ -273,12 +353,12 @@ msgid "Editing %(media_title)s"
|
||||
msgstr "Modification de %(media_title)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
|
||||
msgid "Save changes"
|
||||
msgstr "Enregistrer les modifications"
|
||||
|
||||
@ -312,43 +392,43 @@ msgstr "Impossible de trouver cet utilisateur, désolé."
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
|
||||
#, python-format
|
||||
msgid "Really delete %(title)s?"
|
||||
msgstr ""
|
||||
msgstr "Voulez-vous vraiment supprimer %(title)s ?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
|
||||
msgid ""
|
||||
"If you choose yes, the media entry will be deleted "
|
||||
"<strong>permanently.</strong>"
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
|
||||
msgid "Delete Permanently"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
|
||||
msgid "Media processing panel"
|
||||
msgstr ""
|
||||
msgstr "Panneau pour le traitement des médias"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
|
||||
msgid ""
|
||||
"You can track the state of media being processed for your gallery here."
|
||||
msgstr ""
|
||||
"Vous pouvez suivre l'état des médias en cours de traitement pour votre "
|
||||
"galerie ici."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
|
||||
msgid "Media in-processing"
|
||||
msgstr ""
|
||||
msgstr "Médias en transformation"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
|
||||
msgid "No media in-processing"
|
||||
msgstr ""
|
||||
msgstr "Aucun média en transformation"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
|
||||
msgid "These uploads failed to process:"
|
||||
msgstr ""
|
||||
msgstr "Ces ajouts n'etaient pas processé:"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
|
||||
msgid "Email verification needed"
|
||||
msgstr ""
|
||||
msgstr "Vérification d'email nécessaire"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
|
||||
msgid "Almost done! Your account still needs to be activated."
|
||||
msgstr ""
|
||||
msgstr "Presque fini! Votre compte a encore besoin d'être activé."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
|
||||
msgid ""
|
||||
@ -370,6 +450,8 @@ msgid ""
|
||||
"Someone has registered an account with this username, but it still has to be"
|
||||
" activated."
|
||||
msgstr ""
|
||||
"Quelqu'un a enregistré un compte avec ce nom, mais il doit encore être "
|
||||
"activé."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
|
||||
#, python-format
|
||||
@ -388,7 +470,7 @@ msgstr "profil de %(username)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
|
||||
msgid "Here's a spot to tell others about yourself."
|
||||
msgstr ""
|
||||
msgstr "Voici un endroit pour parler aux autres de vous-même."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
|
||||
@ -397,7 +479,7 @@ msgstr "Modifier le profil"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
|
||||
msgid "This user hasn't filled in their profile (yet)."
|
||||
msgstr ""
|
||||
msgstr "Cet utilisateur n'a pas rempli leur profil (encore)."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
|
||||
#, python-format
|
||||
@ -409,29 +491,45 @@ msgid ""
|
||||
"This is where your media will appear, but you don't seem to have added "
|
||||
"anything yet."
|
||||
msgstr ""
|
||||
"C'est là où vos médias apparaît, mais vous ne semblez pas avoir quoi que ce "
|
||||
"soit encore ajouté."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
|
||||
msgid "Add media"
|
||||
msgstr ""
|
||||
msgstr "Ajouter des médias"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
|
||||
msgid "There doesn't seem to be any media here yet..."
|
||||
msgstr ""
|
||||
msgstr "Il ne semble pas être un média encore là ..."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
|
||||
msgid "feed icon"
|
||||
msgstr ""
|
||||
msgstr "icon de flux"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
|
||||
msgid "Atom feed"
|
||||
msgstr "flux Atom"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
|
||||
msgid "Newer"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
|
||||
msgid "Older"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/user_pages/forms.py:24
|
||||
msgid "Comment"
|
||||
msgstr "Commentaire"
|
||||
|
||||
#: mediagoblin/user_pages/views.py:176
|
||||
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."
|
||||
|
||||
|
||||
|
BIN
mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
Normal file
BIN
mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo
Normal file
Binary file not shown.
520
mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
Normal file
520
mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po
Normal 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. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
|
||||
"after all.)"
|
||||
msgstr ""
|
||||
"Libero, come in libertà. (Siamo un progetto <a "
|
||||
"href=\"http://gnu.org\">GNU</a>, dopotutto.)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:32
|
||||
msgid ""
|
||||
"Aiming to make the world a better place through decentralization and "
|
||||
"(eventually, coming soon!) federation!"
|
||||
msgstr ""
|
||||
"Con l'obbiettivo di rendere il mondo un posto migliore attraverso la "
|
||||
"decentrelizzazione e (finalmente, presto!) federazione!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:33
|
||||
msgid ""
|
||||
"Built for extensibility. (Multiple media types coming soon to the software,"
|
||||
" including video support!)"
|
||||
msgstr ""
|
||||
"Fatto per estensibilità. (Numerosi tipi multimediali saranno presto aggiunti"
|
||||
" al programma, incluso il supporto video!)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:34
|
||||
msgid ""
|
||||
"Powered by people like you. (<a "
|
||||
"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this"
|
||||
" software!</a>)"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:38
|
||||
msgid "Excited to join us?"
|
||||
msgstr "Eccitato di unirti a noi?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:39
|
||||
#, python-format
|
||||
msgid ""
|
||||
"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
|
||||
" or\n"
|
||||
" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:53
|
||||
msgid "Most recent media"
|
||||
msgstr "Documenti multimediali più recenti"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
|
||||
msgid "Enter your new password"
|
||||
msgstr "Inserisci la tua nuova password"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
|
||||
msgid "Enter your username or email"
|
||||
msgstr "Inserisci il tuo nome utente o email"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
|
||||
msgid "Your password has been changed. Try to log in now."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
|
||||
msgid ""
|
||||
"Check your inbox. We sent an email with a URL for changing your password."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Hi %(username)s,\n"
|
||||
"\n"
|
||||
"to change your GNU MediaGoblin password, open the following URL in \n"
|
||||
"your web browser:\n"
|
||||
"\n"
|
||||
"%(verification_url)s\n"
|
||||
"\n"
|
||||
"If you think this is an error, just ignore this email and continue being\n"
|
||||
"a happy goblin!"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:29
|
||||
msgid "Logging in failed!"
|
||||
msgstr "Accesso fallito!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:42
|
||||
msgid "Don't have an account yet?"
|
||||
msgstr "Non hai ancora un account?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:45
|
||||
msgid "Create one here!"
|
||||
msgstr "Creane uno qui!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:48
|
||||
msgid "Forgot your password?"
|
||||
msgstr "Hai dimenticato la password?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:51
|
||||
msgid "Change it!"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:27
|
||||
msgid "Create an account!"
|
||||
msgstr "Crea un account!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:30
|
||||
msgid "Create"
|
||||
msgstr "Crea"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Hi %(username)s,\n"
|
||||
"\n"
|
||||
"to activate your GNU MediaGoblin account, open the following URL in\n"
|
||||
"your web browser:\n"
|
||||
"\n"
|
||||
"%(verification_url)s"
|
||||
msgstr ""
|
||||
"Ciao %(username)s,\n"
|
||||
"\n"
|
||||
"per attivare il tuo account GNU MediaGoblin, apri il seguente URL nel tuo navigatore web.\n"
|
||||
"\n"
|
||||
"%(verification_url)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:29
|
||||
#, python-format
|
||||
msgid "Editing %(media_title)s"
|
||||
msgstr "Stai modificando %(media_title)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
|
||||
msgid "Cancel"
|
||||
msgstr "Annulla"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
|
||||
msgid "Save changes"
|
||||
msgstr "Salva i cambiamenti"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29
|
||||
#, python-format
|
||||
msgid "Editing %(username)s's profile"
|
||||
msgstr "Stai modificando il profilo di %(username)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/listings/tag.html:31
|
||||
msgid "Media tagged with:"
|
||||
msgstr "Media taggata con:"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/submit/start.html:26
|
||||
msgid "Submit yer media"
|
||||
msgstr "Inoltra documento multimediale"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/submit/start.html:29
|
||||
msgid "Submit"
|
||||
msgstr "Conferma"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
|
||||
#, python-format
|
||||
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
|
||||
msgstr "Documenti multimediali di <a href=\"%(user_url)s\">%(username)s</a>"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
|
||||
msgid "Sorry, no such user found."
|
||||
msgstr "Mi dispiace, utente non trovato"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
|
||||
#, python-format
|
||||
msgid "Really delete %(title)s?"
|
||||
msgstr "Vuoi davvero cancellare %(title)s?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
|
||||
msgid "Delete Permanently"
|
||||
msgstr "Cancella permanentemente"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
|
||||
msgid "Media processing panel"
|
||||
msgstr "Pannello di elaborazione media"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25
|
||||
msgid ""
|
||||
"You can track the state of media being processed for your gallery here."
|
||||
msgstr "Puoi seguire lo stato dell'elaborazione per la tua galleria qui."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28
|
||||
msgid "Media in-processing"
|
||||
msgstr "Media in elaborazione"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46
|
||||
msgid "No media in-processing"
|
||||
msgstr "Nessun documento multimediale in elaborazione"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50
|
||||
msgid "These uploads failed to process:"
|
||||
msgstr "L'elaborazione di questi upload è fallita:"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
|
||||
msgid "Email verification needed"
|
||||
msgstr "è necessario verificare email"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
|
||||
msgid "Almost done! Your account still needs to be activated."
|
||||
msgstr "Quasi finito! Il tuo account deve ancora essere attivato."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
|
||||
msgid ""
|
||||
"An email should arrive in a few moments with instructions on how to do so."
|
||||
msgstr ""
|
||||
"In breve dovresti ricevere un email contenente istruzioni su come fare."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
|
||||
msgid "In case it doesn't:"
|
||||
msgstr "Nel caso non fosse:"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
|
||||
msgid "Resend verification email"
|
||||
msgstr "Rispedisci email di verifica"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
|
||||
msgid ""
|
||||
"Someone has registered an account with this username, but it still has to be"
|
||||
" activated."
|
||||
msgstr ""
|
||||
"Qualcuno ha registrato un account con questo nome utente, ma deve ancora "
|
||||
"essere attivato."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"If you are that person but you've lost your verification email, you can <a "
|
||||
"href=\"%(login_url)s\">log in</a> and resend it."
|
||||
msgstr ""
|
||||
"Se sei quella persona ma hai perso l'email di verifica, puoi <a "
|
||||
"href=\"%(login_url)s\">accedere</a> e rispedirlo."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
|
||||
#, python-format
|
||||
msgid "%(username)s's profile"
|
||||
msgstr "profilo di %(username)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:85
|
||||
msgid "Here's a spot to tell others about yourself."
|
||||
msgstr "Ecco un posto dove raccontare agli altri di te."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:90
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:108
|
||||
msgid "Edit profile"
|
||||
msgstr "Modifica profilo"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:96
|
||||
msgid "This user hasn't filled in their profile (yet)."
|
||||
msgstr "Questo utente non ha (ancora) compilato il proprio profilo."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
|
||||
#, python-format
|
||||
msgid "View all of %(username)s's media"
|
||||
msgstr "Visualizza tutti i file multimediali di %(username)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
|
||||
msgid ""
|
||||
"This is where your media will appear, but you don't seem to have added "
|
||||
"anything yet."
|
||||
msgstr ""
|
||||
"Questo è dove i tuoi documenti multimediali appariranno, ma sembra che tu "
|
||||
"non abbia ancora aggiunto niente."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
|
||||
msgid "Add media"
|
||||
msgstr "Aggiungi documenti multimediali"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
|
||||
msgid "There doesn't seem to be any media here yet..."
|
||||
msgstr "Non sembra ci sia ancora nessun documento multimediali qui.."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
|
||||
msgid "feed icon"
|
||||
msgstr "feed icon"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
|
||||
msgid "Atom feed"
|
||||
msgstr "Atom feed"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
|
||||
msgid "Newer"
|
||||
msgstr "Più nuovo"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
|
||||
msgid "Older"
|
||||
msgstr "Più vecchio"
|
||||
|
||||
#: mediagoblin/user_pages/forms.py:24
|
||||
msgid "Comment"
|
||||
msgstr "Commento"
|
||||
|
||||
#: mediagoblin/user_pages/forms.py:30
|
||||
msgid "I am sure I want to delete this"
|
||||
msgstr "Sono sicuro di volerlo cancellare"
|
||||
|
||||
#: mediagoblin/user_pages/views.py:175
|
||||
msgid "You are about to delete another user's media. Proceed with caution."
|
||||
msgstr ""
|
||||
"Stai cancellando un documento multimediale di un altro utente. Procedi con "
|
||||
"attenzione."
|
||||
|
||||
|
Binary file not shown.
@ -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 ""
|
||||
|
||||
|
Binary file not shown.
@ -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 ""
|
||||
|
||||
|
Binary file not shown.
@ -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 ""
|
||||
|
||||
|
Binary file not shown.
@ -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 ""
|
||||
|
||||
|
Binary file not shown.
@ -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 "Editați profilul unui utilizator. Se recomandă prudență."
|
||||
msgstr "Editezi profilul unui utilizator. Se recomandă prudență."
|
||||
|
||||
#: mediagoblin/process_media/errors.py:44
|
||||
msgid "Invalid file given for media type."
|
||||
@ -128,9 +131,13 @@ msgstr "Formatul fișierului nu corespunde cu tipul de media selectat."
|
||||
msgid "File"
|
||||
msgstr "Fișier"
|
||||
|
||||
#: mediagoblin/submit/forms.py:30
|
||||
msgid "Description of this work"
|
||||
msgstr "Descrierea acestui fișier"
|
||||
|
||||
#: mediagoblin/submit/views.py:47
|
||||
msgid "You must provide a file."
|
||||
msgstr "Trebuie să selectați un fișier."
|
||||
msgstr "Trebuie să selectezi un fișier."
|
||||
|
||||
#: mediagoblin/submit/views.py:50
|
||||
msgid "The file doesn't seem to be an image!"
|
||||
@ -153,8 +160,8 @@ msgid ""
|
||||
"If you're sure the address is correct, maybe the page you're looking for has"
|
||||
" been moved or deleted."
|
||||
msgstr ""
|
||||
"Dacă sunteți sigur că adresa este coresctă, poate că pagina pe care o "
|
||||
"căutați a fost mutată sau ștearsă."
|
||||
"Dacă ești sigur că adresa este corectă, poate că pagina pe care o cauți a "
|
||||
"fost mutată sau ștearsă."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/404.html:32
|
||||
msgid "Image of 404 goblin stressing out"
|
||||
@ -170,11 +177,11 @@ msgstr "logo MediaGoblin"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/base.html:52
|
||||
msgid "Submit media"
|
||||
msgstr "Transmiteți un fișier media"
|
||||
msgstr "Transmite un fișier media"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/base.html:63
|
||||
msgid "verify your email!"
|
||||
msgstr "verificați e-mail-ul!"
|
||||
msgstr "verifică e-mail-ul!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/base.html:73
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:26
|
||||
@ -187,6 +194,12 @@ msgid ""
|
||||
"Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a "
|
||||
"href=\"http://gnu.org/\">GNU</a> project"
|
||||
msgstr ""
|
||||
"Construit cu <a href=\"http://mediagoblin.org\">MediaGoblin</a>, un proiect "
|
||||
"<a href=\"http://gnu.org/\">GNU</a>"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:24
|
||||
msgid "Explore"
|
||||
msgstr "Explorează"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:27
|
||||
msgid "Hi there, media lover! MediaGoblin is..."
|
||||
@ -225,7 +238,7 @@ msgid ""
|
||||
" including video support!)"
|
||||
msgstr ""
|
||||
"Proiectat să fie extensibil. (Software-ul va avea în curând suport pentru "
|
||||
"multiple formate de media, inclusiv pentru video!)"
|
||||
"mai multe formate de media, inclusiv pentru video!)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:34
|
||||
msgid ""
|
||||
@ -237,21 +250,83 @@ msgstr ""
|
||||
"href=\"http://mediagoblin.org/pages/join.html\">Ne poți ajuta să îmbunătățim"
|
||||
" acest software!</a>)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:38
|
||||
msgid "Excited to join us?"
|
||||
msgstr "Vrei să ni te alături?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:39
|
||||
#, python-format
|
||||
msgid ""
|
||||
"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
|
||||
" or\n"
|
||||
" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:53
|
||||
msgid "Most recent media"
|
||||
msgstr "Cele mai recente fișiere"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
|
||||
msgid "Enter your new password"
|
||||
msgstr "Introdu noua parolă"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
|
||||
msgid "Enter your username or email"
|
||||
msgstr "Introdu numele de utilizator sau adresa de e-mail"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
|
||||
msgid "Your password has been changed. Try to log in now."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
|
||||
msgid ""
|
||||
"Check your inbox. We sent an email with a URL for changing your password."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Hi %(username)s,\n"
|
||||
"\n"
|
||||
"to change your GNU MediaGoblin password, open the following URL in \n"
|
||||
"your web browser:\n"
|
||||
"\n"
|
||||
"%(verification_url)s\n"
|
||||
"\n"
|
||||
"If you think this is an error, just ignore this email and continue being\n"
|
||||
"a happy goblin!"
|
||||
msgstr ""
|
||||
"Bună, %(username)s\n"
|
||||
"\n"
|
||||
"Pentru a modifica parola ta la GNU MediaGoblin, accesează adresa următoare:\n"
|
||||
"\n"
|
||||
"%(verification_url)s\n"
|
||||
"\n"
|
||||
"Dacă ai primit acest mesaj din greșeală, ignoră-l și fii mai departe un elf fericit!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:29
|
||||
msgid "Logging in failed!"
|
||||
msgstr "Autentificare eșuată!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:42
|
||||
msgid "Don't have an account yet?"
|
||||
msgstr "Nu aveți un cont?"
|
||||
msgstr "Nu ai un cont?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:45
|
||||
msgid "Create one here!"
|
||||
msgstr "Creați-l aici!"
|
||||
msgstr "Creează-l aici!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:48
|
||||
msgid "Forgot your password?"
|
||||
msgstr "Ai uitat parola?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:51
|
||||
msgid "Change it!"
|
||||
msgstr "Schimb-o!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:27
|
||||
msgid "Create an account!"
|
||||
msgstr "Creați un cont!"
|
||||
msgstr "Creează un cont!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:30
|
||||
msgid "Create"
|
||||
@ -269,7 +344,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Bună, %(username)s,\n"
|
||||
"\n"
|
||||
"pentru activarea contului tău GNU MediaGoblin, accesează adresa următoare:\n"
|
||||
"pentru activarea contului tău la GNU MediaGoblin, accesează adresa următoare:\n"
|
||||
"\n"
|
||||
"%(verification_url)s"
|
||||
|
||||
@ -279,12 +354,12 @@ msgid "Editing %(media_title)s"
|
||||
msgstr "Editare %(media_title)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
|
||||
msgid "Cancel"
|
||||
msgstr "Anulare"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
|
||||
msgid "Save changes"
|
||||
msgstr "Salvează modificările"
|
||||
|
||||
@ -318,13 +393,11 @@ msgstr "Ne pare rău, nu am găsit utilizatorul căutat."
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
|
||||
#, python-format
|
||||
msgid "Really delete %(title)s?"
|
||||
msgstr ""
|
||||
msgstr "Sigur dorești să ștergi %(title)s?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
|
||||
msgid ""
|
||||
"If you choose yes, the media entry will be deleted "
|
||||
"<strong>permanently.</strong>"
|
||||
msgstr ""
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
|
||||
msgid "Delete Permanently"
|
||||
msgstr "Șterge definitiv"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
|
||||
msgid "Media processing panel"
|
||||
@ -350,7 +423,7 @@ msgstr "Aceste fișiere nu au putut fi procesate:"
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
|
||||
msgid "Email verification needed"
|
||||
msgstr "Este necesară verificarea adresei de e-mail"
|
||||
msgstr "Este necesară confirmarea adresei de e-mail"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
|
||||
msgid "Almost done! Your account still needs to be activated."
|
||||
@ -359,11 +432,11 @@ msgstr "Aproape gata! Mai trebuie doar să activezi contul."
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
|
||||
msgid ""
|
||||
"An email should arrive in a few moments with instructions on how to do so."
|
||||
msgstr "Veți primi în scurt timp un mesaj prin e-mail cu instrucțiuni."
|
||||
msgstr "Vei primi în scurt timp un mesaj prin e-mail cu instrucțiuni."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:51
|
||||
msgid "In case it doesn't:"
|
||||
msgstr "Dacă nu primiți mesajul:"
|
||||
msgstr "Dacă nu primești mesajul:"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
|
||||
msgid "Resend verification email"
|
||||
@ -383,9 +456,8 @@ msgid ""
|
||||
"If you are that person but you've lost your verification email, you can <a "
|
||||
"href=\"%(login_url)s\">log in</a> and resend it."
|
||||
msgstr ""
|
||||
"Dacă dvs. sunteți persoana respectivă și nu mai aveți e-mail-ul de "
|
||||
"verificare, puteți să vă <a href=\"%(login_url)s\">autentificați</a> pentru "
|
||||
"a-l retrimite."
|
||||
"Dacă tu ești persoana respectivă și nu mai ai e-mail-ul de verificare, poți "
|
||||
"să te <a href=\"%(login_url)s\">autentifici</a> pentru a-l retrimite."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
|
||||
#, python-format
|
||||
@ -408,7 +480,7 @@ msgstr "Acest utilizator nu și-a completat (încă) profilul."
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:122
|
||||
#, python-format
|
||||
msgid "View all of %(username)s's media"
|
||||
msgstr "Toate fișierele media ale lui %(username)s"
|
||||
msgstr "Vezi toate fișierele media ale lui %(username)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:135
|
||||
msgid ""
|
||||
@ -434,12 +506,26 @@ msgstr "icon feed"
|
||||
msgid "Atom feed"
|
||||
msgstr "feed Atom"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
|
||||
msgid "Newer"
|
||||
msgstr "Mai noi"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
|
||||
msgid "Older"
|
||||
msgstr "Mai vechi"
|
||||
|
||||
#: mediagoblin/user_pages/forms.py:24
|
||||
msgid "Comment"
|
||||
msgstr "Scrie un comentariu"
|
||||
|
||||
#: mediagoblin/user_pages/views.py:176
|
||||
#: mediagoblin/user_pages/forms.py:30
|
||||
msgid "I am sure I want to delete this"
|
||||
msgstr "Sunt sigur că doresc să șterg"
|
||||
|
||||
#: mediagoblin/user_pages/views.py:175
|
||||
msgid "You are about to delete another user's media. Proceed with caution."
|
||||
msgstr ""
|
||||
"Urmează să ștergi fișierele media ale unui alt utilizator. Se recomandă "
|
||||
"prudență."
|
||||
|
||||
|
||||
|
Binary file not shown.
@ -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. (We’re a <a href=\"http://gnu.org\">GNU</a> project, "
|
||||
"after all.)"
|
||||
msgstr ""
|
||||
msgstr "Свободное ПО. (Мы же проект <a href=\"http://gnu.org\">GNU</a>.)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:32
|
||||
msgid ""
|
||||
@ -221,6 +230,8 @@ msgid ""
|
||||
"Built for extensibility. (Multiple media types coming soon to the software,"
|
||||
" including video support!)"
|
||||
msgstr ""
|
||||
"Рассчитан на расширяемость. (В программе скоро должна появиться поддержка "
|
||||
"других видов мультимедиа, таких как видео!)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:34
|
||||
msgid ""
|
||||
@ -232,6 +243,53 @@ msgstr ""
|
||||
"href=\"http://mediagoblin.org/pages/join.html\">Ты можешь помочь сделать это"
|
||||
" ПО лучше!</a>)"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:38
|
||||
msgid "Excited to join us?"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:39
|
||||
#, python-format
|
||||
msgid ""
|
||||
"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n"
|
||||
" or\n"
|
||||
" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/root.html:53
|
||||
msgid "Most recent media"
|
||||
msgstr "Самые новые файлы"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27
|
||||
msgid "Enter your new password"
|
||||
msgstr "Введите свой новый пароль"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27
|
||||
msgid "Enter your username or email"
|
||||
msgstr "Введите Ваше имя пользователя или адрес электронной почты"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22
|
||||
msgid "Your password has been changed. Try to log in now."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22
|
||||
msgid ""
|
||||
"Check your inbox. We sent an email with a URL for changing your password."
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Hi %(username)s,\n"
|
||||
"\n"
|
||||
"to change your GNU MediaGoblin password, open the following URL in \n"
|
||||
"your web browser:\n"
|
||||
"\n"
|
||||
"%(verification_url)s\n"
|
||||
"\n"
|
||||
"If you think this is an error, just ignore this email and continue being\n"
|
||||
"a happy goblin!"
|
||||
msgstr ""
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:29
|
||||
msgid "Logging in failed!"
|
||||
msgstr "Авторизация неуспешна!"
|
||||
@ -244,6 +302,14 @@ msgstr "Ещё нету аккаунта?"
|
||||
msgid "Create one here!"
|
||||
msgstr "Создайте здесь!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:48
|
||||
msgid "Forgot your password?"
|
||||
msgstr "Забыли свой пароль?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/login.html:51
|
||||
msgid "Change it!"
|
||||
msgstr "Смените его!"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/auth/register.html:27
|
||||
msgid "Create an account!"
|
||||
msgstr "Создать аккаунт!"
|
||||
@ -274,12 +340,12 @@ msgid "Editing %(media_title)s"
|
||||
msgstr "Редактирование %(media_title)s"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:36
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49
|
||||
msgid "Cancel"
|
||||
msgstr "Отменить"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit.html:37
|
||||
#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:44
|
||||
msgid "Save changes"
|
||||
msgstr "Сохранить изменения"
|
||||
|
||||
@ -303,7 +369,7 @@ msgstr "Подтвердить"
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32
|
||||
#, python-format
|
||||
msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media"
|
||||
msgstr ""
|
||||
msgstr "Файлы пользователя <a href=\"%(user_url)s\">%(username)s</a>"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:32
|
||||
@ -313,13 +379,11 @@ msgstr "Извините, но такой пользователь не найд
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30
|
||||
#, python-format
|
||||
msgid "Really delete %(title)s?"
|
||||
msgstr ""
|
||||
msgstr "Действительно удалить %(title)s?"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:36
|
||||
msgid ""
|
||||
"If you choose yes, the media entry will be deleted "
|
||||
"<strong>permanently.</strong>"
|
||||
msgstr ""
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50
|
||||
msgid "Delete Permanently"
|
||||
msgstr "Удалить безвозвратно"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22
|
||||
msgid "Media processing panel"
|
||||
@ -346,11 +410,11 @@ msgstr "Обработка этих файлов вызвала ошибку:"
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:39
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:59
|
||||
msgid "Email verification needed"
|
||||
msgstr "Нужно подтверджение почтового адреса"
|
||||
msgstr "Нужно подтверждение почтового адреса"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:42
|
||||
msgid "Almost done! Your account still needs to be activated."
|
||||
msgstr "Почти закончили! Теперь надо активизировать ваш аккаунт."
|
||||
msgstr "Почти закончили! Теперь надо активировать ваш аккаунт."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:47
|
||||
msgid ""
|
||||
@ -365,13 +429,13 @@ msgstr "А если нет, то:"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:54
|
||||
msgid "Resend verification email"
|
||||
msgstr "Повторно отправить подверждение на адрес электнонной почты"
|
||||
msgstr "Повторно отправить подверждение на адрес электронной почты"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:62
|
||||
msgid ""
|
||||
"Someone has registered an account with this username, but it still has to be"
|
||||
" activated."
|
||||
msgstr "Кто-то создал аккаунт с этим именем, но его еще надо активизировать."
|
||||
msgstr "Кто‐то создал аккаунт с этим именем, но его еще надо активировать."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:68
|
||||
#, python-format
|
||||
@ -379,8 +443,8 @@ msgid ""
|
||||
"If you are that person but you've lost your verification email, you can <a "
|
||||
"href=\"%(login_url)s\">log in</a> and resend it."
|
||||
msgstr ""
|
||||
"Если это были вы, и если вы потеряли сообщение с подтвердлением аккаунта, то"
|
||||
" вы можете <a href=\"%(login_url)s\">войти</a> и отпраыить его повторно."
|
||||
"Если это были вы, и если вы потеряли сообщение для подтверждения аккаунта, "
|
||||
"то вы можете <a href=\"%(login_url)s\">войти</a> и отправить его повторно."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:78
|
||||
#, python-format
|
||||
@ -409,7 +473,7 @@ msgstr "Смотреть все файлы %(username)s"
|
||||
msgid ""
|
||||
"This is where your media will appear, but you don't seem to have added "
|
||||
"anything yet."
|
||||
msgstr "Ваши файлы появятся здесь, кодга вы их добавите."
|
||||
msgstr "Ваши файлы появятся здесь, когда вы их добавите."
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:141
|
||||
msgid "Add media"
|
||||
@ -417,22 +481,34 @@ msgstr "Добавить файлы"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/user_pages/user.html:147
|
||||
msgid "There doesn't seem to be any media here yet..."
|
||||
msgstr "Пока что тут файлов нет..."
|
||||
msgstr "Пока что тут файлов нет…"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21
|
||||
msgid "feed icon"
|
||||
msgstr ""
|
||||
msgstr "значок ленты"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23
|
||||
msgid "Atom feed"
|
||||
msgstr "лента в формате Atom"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:40
|
||||
msgid "Newer"
|
||||
msgstr "Более новые"
|
||||
|
||||
#: mediagoblin/templates/mediagoblin/utils/pagination.html:46
|
||||
msgid "Older"
|
||||
msgstr "Более старые"
|
||||
|
||||
#: mediagoblin/user_pages/forms.py:24
|
||||
msgid "Comment"
|
||||
msgstr "Комментарий"
|
||||
|
||||
#: mediagoblin/user_pages/views.py:176
|
||||
#: mediagoblin/user_pages/forms.py:30
|
||||
msgid "I am sure I want to delete this"
|
||||
msgstr "Я уверен, что хочу удалить это"
|
||||
|
||||
#: mediagoblin/user_pages/views.py:175
|
||||
msgid "You are about to delete another user's media. Proceed with caution."
|
||||
msgstr ""
|
||||
msgstr "Вы на пороге удаления файла другого пользователя. Будьте осторожны."
|
||||
|
||||
|
||||
|
Binary file not shown.
@ -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 ""
|
||||
|
||||
|
Binary file not shown.
@ -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 ""
|
||||
|
||||
|
Binary file not shown.
@ -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."
|
||||
|
||||
|
||||
|
Binary file not shown.
@ -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 "你在刪除其他人的媒體檔案。請小心處理喔。"
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
1
mediagoblin/static/fonts/Lato-Bold.ttf
Symbolic link
1
mediagoblin/static/fonts/Lato-Bold.ttf
Symbolic link
@ -0,0 +1 @@
|
||||
../../../extlib/lato/Lato-Bold.ttf
|
1
mediagoblin/static/fonts/Lato-BoldItalic.ttf
Symbolic link
1
mediagoblin/static/fonts/Lato-BoldItalic.ttf
Symbolic link
@ -0,0 +1 @@
|
||||
../../../extlib/lato/Lato-BoldItalic.ttf
|
1
mediagoblin/static/fonts/Lato-Italic.ttf
Symbolic link
1
mediagoblin/static/fonts/Lato-Italic.ttf
Symbolic link
@ -0,0 +1 @@
|
||||
../../../extlib/lato/Lato-Italic.ttf
|
1
mediagoblin/static/fonts/Lato-Regular.ttf
Symbolic link
1
mediagoblin/static/fonts/Lato-Regular.ttf
Symbolic link
@ -0,0 +1 @@
|
||||
../../../extlib/lato/Lato-Regular.ttf
|
@ -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)
|
240
mediagoblin/storage/__init__.py
Normal file
240
mediagoblin/storage/__init__.py
Normal 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)
|
156
mediagoblin/storage/cloudfiles.py
Normal file
156
mediagoblin/storage/cloudfiles.py
Normal 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()
|
78
mediagoblin/storage/filestorage.py
Normal file
78
mediagoblin/storage/filestorage.py
Normal 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)
|
156
mediagoblin/storage/mountstorage.py
Normal file
156
mediagoblin/storage/mountstorage.py
Normal 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)
|
@ -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])
|
||||
|
37
mediagoblin/templates/mediagoblin/auth/change_fp.html
Normal file
37
mediagoblin/templates/mediagoblin/auth/change_fp.html
Normal 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 %}
|
||||
|
37
mediagoblin/templates/mediagoblin/auth/forgot_password.html
Normal file
37
mediagoblin/templates/mediagoblin/auth/forgot_password.html
Normal 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 %}
|
||||
|
@ -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 %}
|
||||
|
28
mediagoblin/templates/mediagoblin/auth/fp_email_sent.html
Normal file
28
mediagoblin/templates/mediagoblin/auth/fp_email_sent.html
Normal 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 %}
|
||||
|
@ -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 %}
|
||||
|
@ -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>
|
||||
|
@ -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 %}
|
||||
|
@ -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>
|
||||
|
@ -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:
|
||||
|
@ -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>
|
||||
|
@ -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):
|
||||
|
52
mediagoblin/tests/test_cache.py
Normal file
52
mediagoblin/tests/test_cache.py
Normal 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'
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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'))
|
||||
|
@ -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'])):
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user