diff options
Diffstat (limited to 'mediagoblin')
115 files changed, 4782 insertions, 1832 deletions
diff --git a/mediagoblin/_version.py b/mediagoblin/_version.py index df212faf..d6c6e20d 100644 --- a/mediagoblin/_version.py +++ b/mediagoblin/_version.py @@ -14,4 +14,4 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -__version__ = "0.0.5" +__version__ = "0.1.0" diff --git a/mediagoblin/app.py b/mediagoblin/app.py index 9bbccf24..ce4b0bec 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -20,7 +20,10 @@ import urllib import routes from webob import Request, exc -from mediagoblin import routing, util, middleware +from mediagoblin import routing, middleware +from mediagoblin.tools import common, translate, template +from mediagoblin.tools.response import render_404 +from mediagoblin.tools import request as mg_request 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, @@ -98,7 +101,7 @@ class MediaGoblinApp(object): setup_workbench() # instantiate application middleware - self.middleware = [util.import_component(m)(self) + self.middleware = [common.import_component(m)(self) for m in middleware.ENABLED_MIDDLEWARE] def __call__(self, environ, start_response): @@ -114,6 +117,17 @@ class MediaGoblinApp(object): path_info = request.path_info route_match = self.routing.match(path_info) + # By using fcgi, mediagoblin can run under a base path + # like /mediagoblin/. request.path_info contains the + # path inside mediagoblin. If the something needs the + # full path of the current page, that should include + # the basepath. + # Note: urlgen and routes are fine! + request.full_path = environ["SCRIPT_NAME"] + request.path_info + # python-routes uses SCRIPT_NAME. So let's use that too. + # The other option would be: + # request.full_path = environ["SCRIPT_URL"] + ## Attach utilities to the request object request.matchdict = route_match request.urlgen = routes.URLGenerator(self.routing, environ) @@ -122,14 +136,14 @@ class MediaGoblinApp(object): # Attach self as request.app # Also attach a few utilities from request.app for convenience? request.app = self - request.locale = util.get_locale_from_request(request) + request.locale = translate.get_locale_from_request(request) - request.template_env = util.get_jinja_env( + request.template_env = template.get_jinja_env( self.template_loader, request.locale) request.db = self.db request.staticdirect = self.staticdirector - util.setup_user_in_request(request) + mg_request.setup_user_in_request(request) # No matching page? if route_match is None: @@ -147,9 +161,9 @@ class MediaGoblinApp(object): # Okay, no matches. 404 time! request.matchdict = {} # in case our template expects it - return util.render_404(request)(environ, start_response) + return render_404(request)(environ, start_response) - controller = util.import_component(route_match['controller']) + controller = common.import_component(route_match['controller']) request.start_response = start_response # get the response from the controller @@ -163,6 +177,16 @@ class MediaGoblinApp(object): def paste_app_factory(global_config, **app_config): - mgoblin_app = MediaGoblinApp(app_config['config']) + configs = app_config['config'].split() + mediagoblin_config = None + for config in configs: + if os.path.exists(config) and os.access(config, os.R_OK): + mediagoblin_config = config + break + + if not mediagoblin_config: + raise IOError("Usable mediagoblin config not found.") + + mgoblin_app = MediaGoblinApp(mediagoblin_config) return mgoblin_app diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py index aadb5888..dcb6766c 100644 --- a/mediagoblin/auth/forms.py +++ b/mediagoblin/auth/forms.py @@ -17,7 +17,7 @@ import wtforms import re -from mediagoblin.util import fake_ugettext_passthrough as _ +from mediagoblin.tools.translate import fake_ugettext_passthrough as _ class RegistrationForm(wtforms.Form): diff --git a/mediagoblin/auth/lib.py b/mediagoblin/auth/lib.py index 0ecccbb5..653424cc 100644 --- a/mediagoblin/auth/lib.py +++ b/mediagoblin/auth/lib.py @@ -19,7 +19,8 @@ import random import bcrypt -from mediagoblin.util import send_email, render_template +from mediagoblin.tools.mail import send_email +from mediagoblin.tools.template import render_template from mediagoblin import mg_globals diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index adf2c315..8888d23c 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -21,8 +21,8 @@ from webob import exc 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.tools.response import render_to_response, redirect, render_404 +from mediagoblin.tools.translate import pass_to_ugettext as _ from mediagoblin.db.util import ObjectId, InvalidId from mediagoblin.auth import lib as auth_lib from mediagoblin.auth import forms as auth_forms @@ -30,6 +30,19 @@ from mediagoblin.auth.lib import send_verification_email, \ send_fp_verification_email +def email_debug_message(request): + """ + If the server is running in email debug mode (which is + the current default), give a debug message to the user + so that they have an idea where to find their email. + """ + if mg_globals.app_config['email_debug_mode']: + # DEBUG message, no need to translate + messages.add_message(request, messages.DEBUG, + u"This instance is running in email debug mode. " + u"The email will be on the console of the server process.") + + def register(request): """ Your classic registration view! @@ -78,6 +91,7 @@ def register(request): request.session.save() # send verification email + email_debug_message(request) send_verification_email(user, request) # redirect the user to their homepage... there will be a @@ -184,6 +198,7 @@ def resend_activation(request): request.user[u'verification_key'] = unicode(uuid.uuid4()) request.user.save() + email_debug_message(request) send_verification_email(request.user, request) messages.add_message( @@ -204,6 +219,11 @@ def forgot_password(request): fp_form = auth_forms.ForgotPassForm(request.POST) if request.method == 'POST' and fp_form.validate(): + + # Here, so it doesn't depend on the actual mail being sent + # and thus doesn't reveal, wether mail was sent. + email_debug_message(request) + # '$or' not available till mongodb 1.5.3 user = request.db.User.find_one( {'username': request.POST['username']}) diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index 0801b39e..900957ce 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -41,6 +41,8 @@ celery_setup_elsewhere = boolean(default=False) # source files for a media file but can also be a HUGE security risk. allow_attachments = boolean(default=False) +# Cookie stuff +csrf_cookie_name = string(default='mediagoblin_csrftoken') [storage:publicstore] storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage") diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 28bb62fc..edaf5630 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -15,7 +15,18 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. from mediagoblin.db.util import RegisterMigration -from mediagoblin.util import cleaned_markdown_conversion +from mediagoblin.tools.text import cleaned_markdown_conversion + + +def add_table_field(db, table_name, field_name, default_value): + """ + Add a new field to the table/collection named table_name. + The field will have the name field_name and the value default_value + """ + db[table_name].update( + {field_name: {'$exists': False}}, + {'$set': {field_name: default_value}}, + multi=True) # Please see mediagoblin/tests/test_migrations.py for some examples of @@ -70,11 +81,7 @@ def mediaentry_add_queued_task_id(database): """ Add the 'queued_task_id' field for entries that don't have it. """ - collection = database['media_entries'] - collection.update( - {'queued_task_id': {'$exists': False}}, - {'$set': {'queued_task_id': None}}, - multi=True) + add_table_field(database, 'media_entries', 'queued_task_id', None) @RegisterMigration(5) @@ -82,16 +89,8 @@ def mediaentry_add_fail_error_and_metadata(database): """ Add 'fail_error' and 'fail_metadata' fields to media entries """ - collection = database['media_entries'] - collection.update( - {'fail_error': {'$exists': False}}, - {'$set': {'fail_error': None}}, - multi=True) - - collection.update( - {'fail_metadata': {'$exists': False}}, - {'$set': {'fail_metadata': {}}}, - multi=True) + add_table_field(database, 'media_entries', 'fail_error', None) + add_table_field(database, 'media_entries', 'fail_metadata', {}) @RegisterMigration(6) @@ -99,11 +98,5 @@ 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) + add_table_field(database, 'users', 'fp_verification_key', None) + add_table_field(database, 'users', 'fp_token_expire', None) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 42db3f83..c010cb89 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -19,14 +19,12 @@ import uuid from mongokit import Document -from mediagoblin import util from mediagoblin.auth import lib as auth_lib from mediagoblin import mg_globals from mediagoblin.db import migrations from mediagoblin.db.util import ASCENDING, DESCENDING, ObjectId -from mediagoblin.util import Pagination -from mediagoblin.util import DISPLAY_IMAGE_FETCHING_ORDER - +from mediagoblin.tools.pagination import Pagination +from mediagoblin.tools import url, common ################### # Custom validators @@ -222,7 +220,7 @@ class MediaEntry(Document): 'media_entry': self['_id']}).sort('created', DESCENDING) def get_display_media(self, media_map, - fetch_order=DISPLAY_IMAGE_FETCHING_ORDER): + fetch_order=common.DISPLAY_IMAGE_FETCHING_ORDER): """ Find the best media for display. @@ -236,7 +234,7 @@ class MediaEntry(Document): """ media_sizes = media_map.keys() - for media_size in DISPLAY_IMAGE_FETCHING_ORDER: + for media_size in common.DISPLAY_IMAGE_FETCHING_ORDER: if media_size in media_sizes: return media_map[media_size] @@ -244,7 +242,7 @@ class MediaEntry(Document): pass def generate_slug(self): - self['slug'] = util.slugify(self['title']) + self['slug'] = url.slugify(self['title']) duplicate = mg_globals.database.media_entries.find_one( {'slug': self['slug']}) @@ -306,7 +304,7 @@ class MediaEntry(Document): Get the exception that's appropriate for this error """ if self['fail_error']: - return util.import_component(self['fail_error']) + return common.import_component(self['fail_error']) class MediaComment(Document): diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index 204ac47a..b247e229 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -17,7 +17,7 @@ from webob import exc -from mediagoblin.util import redirect, render_404 +from mediagoblin.tools.response import redirect, render_404 from mediagoblin.db.util import ObjectId, InvalidId @@ -45,7 +45,7 @@ def require_active_login(controller): return exc.HTTPFound( location="%s?next=%s" % ( request.urlgen("mediagoblin.auth.login"), - request.path_info)) + request.full_path)) return controller(request, *args, **kwargs) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index f81d58b2..7e71722c 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -14,12 +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/>. - import wtforms -from mediagoblin.util import tag_length_validator, TOO_LONG_TAG_WARNING -from mediagoblin.util import fake_ugettext_passthrough as _ - +from mediagoblin.tools.text import tag_length_validator, TOO_LONG_TAG_WARNING +from mediagoblin.tools.translate import fake_ugettext_passthrough as _ class EditForm(wtforms.Form): title = wtforms.TextField( diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index d15461c0..f3ebebe8 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -25,14 +25,15 @@ from werkzeug.utils import secure_filename from mediagoblin import messages from mediagoblin import mg_globals -from mediagoblin.util import ( - render_to_response, redirect, clean_html, convert_to_tag_list_of_dicts, - media_tags_as_string, cleaned_markdown_conversion) -from mediagoblin.util import pass_to_ugettext as _ + from mediagoblin.edit import forms from mediagoblin.edit.lib import may_edit_media from mediagoblin.decorators import require_active_login, get_user_media_entry - +from mediagoblin.tools.response import render_to_response, redirect +from mediagoblin.tools.translate import pass_to_ugettext as _ +from mediagoblin.tools.text import ( + clean_html, convert_to_tag_list_of_dicts, + media_tags_as_string, cleaned_markdown_conversion) @get_user_media_entry @require_active_login @@ -169,7 +170,7 @@ def edit_profile(request): messages.add_message(request, messages.SUCCESS, - 'Profile edited!') + _("Profile edited!")) return redirect(request, 'mediagoblin.user_pages.user_home', user=edit_username) diff --git a/mediagoblin/gmg_commands/__init__.py b/mediagoblin/gmg_commands/__init__.py index 3250c246..04187ff2 100644 --- a/mediagoblin/gmg_commands/__init__.py +++ b/mediagoblin/gmg_commands/__init__.py @@ -15,8 +15,9 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import argparse +import os -from mediagoblin import util as mg_util +from mediagoblin.tools.common import import_component SUBCOMMAND_MAP = { @@ -58,6 +59,12 @@ SUBCOMMAND_MAP = { def main_cli(): parser = argparse.ArgumentParser( description='GNU MediaGoblin utilities.') + parser.add_argument( + '-cf', '--conf_file', default=None, + help=( + "Config file used to set up environment. " + "Default to mediagoblin_local.ini if readable, " + "otherwise mediagoblin.ini")) subparsers = parser.add_subparsers(help='sub-command help') for command_name, command_struct in SUBCOMMAND_MAP.iteritems(): @@ -67,14 +74,21 @@ def main_cli(): else: subparser = subparsers.add_parser(command_name) - setup_func = mg_util.import_component(command_struct['setup']) - exec_func = mg_util.import_component(command_struct['func']) + setup_func = import_component(command_struct['setup']) + exec_func = import_component(command_struct['func']) setup_func(subparser) subparser.set_defaults(func=exec_func) args = parser.parse_args() + if args.conf_file is None: + if os.path.exists('mediagoblin_local.ini') \ + and os.access('mediagoblin_local.ini', os.R_OK): + args.conf_file = 'mediagoblin_local.ini' + else: + args.conf_file = 'mediagoblin.ini' + args.func(args) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index 962e545c..a46219a0 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -40,9 +40,6 @@ def import_export_parse_setup(subparser): subparser.add_argument( 'tar_file') subparser.add_argument( - '-cf', '--conf_file', default='mediagoblin.ini', - help='Config file used to set up environment') - subparser.add_argument( '--mongodump_path', default='mongodump', help='mongodump binary') subparser.add_argument( diff --git a/mediagoblin/gmg_commands/migrate.py b/mediagoblin/gmg_commands/migrate.py index e6dd6f78..beea109d 100644 --- a/mediagoblin/gmg_commands/migrate.py +++ b/mediagoblin/gmg_commands/migrate.py @@ -25,9 +25,7 @@ from mediagoblin.db import migrations def migrate_parser_setup(subparser): - subparser.add_argument( - '-cf', '--conf_file', default='mediagoblin.ini', - help="Config file used to set up environment") + pass def _print_started_migration(migration_number, migration_func): diff --git a/mediagoblin/gmg_commands/shell.py b/mediagoblin/gmg_commands/shell.py index 2a380c7b..910560a0 100644 --- a/mediagoblin/gmg_commands/shell.py +++ b/mediagoblin/gmg_commands/shell.py @@ -22,9 +22,7 @@ from mediagoblin.gmg_commands import util as commands_util def shell_parser_setup(subparser): - subparser.add_argument( - '-cf', '--conf_file', default='mediagoblin.ini', - help="Config file used to set up environment") + pass SHELL_BANNER = """\ diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py index 3fda0e32..4c4b0c1b 100644 --- a/mediagoblin/gmg_commands/users.py +++ b/mediagoblin/gmg_commands/users.py @@ -29,9 +29,6 @@ def adduser_parser_setup(subparser): subparser.add_argument( 'email', help="Email to recieve notifications") - subparser.add_argument( - '-cf', '--conf_file', default='mediagoblin.ini', - help="Config file used to set up environment") def adduser(args): @@ -64,9 +61,6 @@ def makeadmin_parser_setup(subparser): subparser.add_argument( 'username', help="Username to give admin level") - subparser.add_argument( - '-cf', '--conf_file', default='mediagoblin.ini', - help="Config file used to set up environment") def makeadmin(args): @@ -90,9 +84,6 @@ def changepw_parser_setup(subparser): subparser.add_argument( 'password', help="Your NEW supersecret word to login") - subparser.add_argument( - '-cf', '--conf_file', default='mediagoblin.ini', - help="Config file used to set up environment") def changepw(args): diff --git a/mediagoblin/gmg_commands/wipealldata.py b/mediagoblin/gmg_commands/wipealldata.py index dc5d6cf7..cddbab38 100644 --- a/mediagoblin/gmg_commands/wipealldata.py +++ b/mediagoblin/gmg_commands/wipealldata.py @@ -30,6 +30,10 @@ def wipe(args): print "" print "Running this will destroy your mediagoblin database," print "remove all your media files in user_dev/, etc." + print "" + print "ALSO: This command is currently a hack and will only remove" + print " things properly on the default setup! If you've customized" + print " your mediagoblin configs, it won't work (for now)." drop_it = raw_input( 'Are you **SURE** you want to destroy your environment? ' @@ -48,4 +52,4 @@ def wipe(args): print "nixing %s...." % directory shutil.rmtree(directory) - print "removed all your stuff! okay, now re-run ./bin/buildout" + print "removed all your stuff!" diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo Binary files differindex 1d75d517..4e4e8863 100644 --- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po index b5057b9d..548e971f 100644 --- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" @@ -45,19 +45,19 @@ msgstr "اكتبها مرة أخرى هنا للتأكد من عدم وجود Ø£ msgid "Email address" msgstr "عنوان البريد الإلكتروني" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "عÙوًا، التسجيل غير Ù…ØªØ§Ø Ù‡Ù†Ø§." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "عذرًا، لقد اختار مستخدم آخر هذا الاسم." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "عÙوًا، هذا العنوان البريدي مستخدم." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -65,60 +65,64 @@ msgstr "" "تم التØÙ‚Ù‚ من بريدك الإلكتروني. يمكنك الآن الولوج، ÙˆØªØØ±ÙŠØ± ملÙÙƒ الشخصي، ونشر " "الصور!" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "Ù…ÙØªØ§Ø التØÙ‚Ù‚ أو معر٠المستخدم خاطئ" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "أعدنا إرسال رسالة التØÙ‚Ù‚." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "العنوان" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "الوسوم" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" -msgstr "" +msgstr "المسار" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" -msgstr "" +msgstr "لا يمكن ترك المسار ÙØ§Ø±ØºÙ‹Ø§" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" +"الجزء الذي يمثل عنوان المل٠ÙÙŠ المسار. لا ØØ§Ø¬Ø© إلى تغيير Ù…ØØªÙˆÙ‰ هذه الخانة " +"عادةً." -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "السيرة" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "الموقع الإلكتروني" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." -msgstr "" +msgstr "يوجد مل٠آخر بهذا المسار لدى هذى المستخدم." -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." -msgstr "" +msgstr "أنت ØªØØ±Ù‘ر وسائط مستخدم آخر. كن ØØ°Ø±Ù‹Ø§ أثناء العملية." -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." -msgstr "" +msgstr "أنت ØªØØ±Ù‘ر مل٠مستخدم آخر. كن ØØ°Ø±Ù‹Ø§ أثناء العملية." #: mediagoblin/process_media/errors.py:44 msgid "Invalid file given for media type." @@ -130,23 +134,23 @@ msgstr "الملÙ" #: mediagoblin/submit/forms.py:30 msgid "Description of this work" -msgstr "" +msgstr "وص٠هذا العمل." -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "يجب أن تضع ملÙًا." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "لا يبدو أن هذا المل٠صورة!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "يا سلام! Ù†ÙØ´Ø±ÙŽØª!" #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" -msgstr "" +msgstr "ويØÙŠ!" #: mediagoblin/templates/mediagoblin/404.html:24 msgid "There doesn't seem to be a page at this address. Sorry!" @@ -161,7 +165,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/404.html:32 msgid "Image of 404 goblin stressing out" -msgstr "" +msgstr "صورة قزم مرتبك" #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" @@ -180,8 +184,8 @@ msgid "verify your email!" msgstr "أكّد بريدك" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Ù„ÙØ¬" @@ -246,27 +250,30 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">أنشئ ØØ³Ø§Ø¨Ù‹Ø§ مجانيًا</a>\n" +" أو\n" +" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">ركّب ميدياغوبلن على خادومك الخاص</a>" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" -msgstr "" +msgstr "Ø£ØØ¯Ø« الوسائط" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" -msgstr "" +msgstr "أدخل كلمة سرك الجديدة" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" -msgstr "" +msgstr "أدخل اسم المستخدم أو بريدك الإلكتروني" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +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 "" +msgstr "تÙقد بريدك الإلكتروني. لقد أرسلنا رسالة بها وصلة لتغيير كلمة سرك." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -281,32 +288,39 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" +"Ù…Ø±ØØ¨Ù‹Ø§ يا %(username)sØŒ\n" +"\n" +"إن أردت تغيير كلمة سرك ÙÙŠ غنو ميدياغوبلن ÙØ§ÙØªØ Ø§Ù„ÙˆØµÙ„Ø© التالية ÙÙŠ Ù…ØªØµÙØÙƒ:\n" +"\n" +"%(verification_url)s\n" +"\n" +"إن كنت ترى أن هذه الرسالة وصلتك خطأً ÙØªØ¬Ø§Ù‡Ù„ها واستمتع بØÙŠØ§ØªÙƒ!" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "ÙØ´Ù„ الولوج!" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "ألا تملك ØØ³Ø§Ø¨Ù‹Ø§ بعد؟" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "أنشئ ØØ³Ø§Ø¨Ù‹Ø§ هنا!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" -msgstr "" +msgstr "أنسيت كلمة سرك؟" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" -msgstr "" +msgstr "غيّرها!" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "أنشئ ØØ³Ø§Ø¨Ù‹Ø§!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "أنشئ" @@ -355,7 +369,7 @@ msgstr "الوسائط الموسومة بâ€" msgid "Submit yer media" msgstr "انشر وسائطك" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "أرسل" @@ -372,11 +386,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:50 msgid "Delete Permanently" -msgstr "" +msgstr "Ø§ØØ°Ù نهائيًا" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 msgid "Media processing panel" @@ -385,19 +399,19 @@ msgstr "Ù„ÙˆØØ© معالجة الوسائط" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25 msgid "" "You can track the state of media being processed for your gallery here." -msgstr "" +msgstr "يمكنك متابعة عملية معالجة وسائط معرضك من هنا." #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 msgid "Media in-processing" -msgstr "" +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:" -msgstr "" +msgstr "ÙØ´Ù„ت معالجة هذه Ø§Ù„Ù…Ù„ÙØ§Øª:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:39 #: mediagoblin/templates/mediagoblin/user_pages/user.html:59 @@ -452,7 +466,7 @@ msgstr "ØØ±Ù‘ÙØ± المل٠الشخصي" #: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "This user hasn't filled in their profile (yet)." -msgstr "" +msgstr "لم يعبئ هذا العضو بيانات ملÙÙ‡ بعد." #: mediagoblin/templates/mediagoblin/user_pages/user.html:122 #, python-format @@ -483,11 +497,11 @@ msgstr "" #: mediagoblin/templates/mediagoblin/utils/pagination.html:40 msgid "Newer" -msgstr "" +msgstr "Ø§Ù„Ø£ØØ¯Ø«" #: mediagoblin/templates/mediagoblin/utils/pagination.html:46 msgid "Older" -msgstr "" +msgstr "الأقدم" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -495,10 +509,18 @@ msgstr "علّÙÙ‚" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" +msgstr "أنا متأكد من رغبتي Ø¨ØØ°Ù هذا العمل" + +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:175 -msgid "You are about to delete another user's media. Proceed with caution." +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" msgstr "" +#: mediagoblin/user_pages/views.py:181 +msgid "You are about to delete another user's media. Proceed with caution." +msgstr "أنت على وشك ØØ°Ù وسائط مستخدم آخر. كن ØØ°Ø±Ù‹Ø§ أثناء العملية." + diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo Binary files differnew file mode 100644 index 00000000..9b9e7e3b --- /dev/null +++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..e2cd8342 --- /dev/null +++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,520 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +# Translators: +# <devaleitzer@aim.com>, 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"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: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +msgid "Username" +msgstr "Nom d'usuari" + +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +msgid "Password" +msgstr "Contrasenya" + +#: mediagoblin/auth/forms.py:35 +msgid "Passwords must match." +msgstr "Les contrasenyes han de coincidir" + +#: mediagoblin/auth/forms.py:37 +msgid "Confirm password" +msgstr "Confirmeu la contrasenya" + +#: mediagoblin/auth/forms.py:39 +msgid "Type it again here to make sure there are no spelling mistakes." +msgstr "" + +#: mediagoblin/auth/forms.py:42 +msgid "Email address" +msgstr "Adreça electrònica" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, registration is disabled on this instance." +msgstr "Ho sentim, el registre està desactivat en aquest cas." + +#: mediagoblin/auth/views.py:73 +msgid "Sorry, a user with that name already exists." +msgstr "Lamentablement aquest usuari ja existeix." + +#: mediagoblin/auth/views.py:77 +msgid "Sorry, that email address has already been taken." +msgstr "Disculpeu, aquesta adreça electrònica ja s'està utilitzant." + +#: mediagoblin/auth/views.py:179 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" +"Ja s'ha verificat la vostra adreça electrònica. Ara podeu entrar, editar el " +"vostre perfil i penjar imatge!" + +#: mediagoblin/auth/views.py:185 +msgid "The verification key or user id is incorrect" +msgstr "" +"La clau de verificació o la identificació de l'usuari no són correctes." + +#: mediagoblin/auth/views.py:207 +msgid "Resent your verification email." +msgstr "Torna'm a enviar el correu de verificació" + +#: mediagoblin/auth/views.py:248 +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:24 mediagoblin/submit/forms.py:27 +msgid "Title" +msgstr "TÃtol" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +msgid "Tags" +msgstr "Etiquetes" + +#: mediagoblin/edit/forms.py:31 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:32 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 +msgid "" +"The title part of this media's URL. You usually don't need to change this." +msgstr "" + +#: mediagoblin/edit/forms.py:40 +msgid "Bio" +msgstr "Biografia" + +#: mediagoblin/edit/forms.py:43 +msgid "Website" +msgstr "Lloc web" + +#: mediagoblin/edit/views.py:64 +msgid "An entry with that slug already exists for this user." +msgstr "" + +#: mediagoblin/edit/views.py:85 +msgid "You are editing another user's media. Proceed with caution." +msgstr "Esteu editant fitxers d'un altre usuari. Aneu amb compte." + +#: mediagoblin/edit/views.py:155 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "Esteu editant el perfil d'un usuari. Aneu amb compte" + +#: mediagoblin/process_media/errors.py:44 +msgid "Invalid file given for media type." +msgstr "Aquest tipus de fitxer no és và lid." + +#: mediagoblin/submit/forms.py:25 +msgid "File" +msgstr "Fitxer" + +#: mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/submit/views.py:46 +msgid "You must provide a file." +msgstr "Heu d'escollir un fitxer." + +#: mediagoblin/submit/views.py:49 +msgid "The file doesn't seem to be an image!" +msgstr "El fitxer no és una imatge" + +#: mediagoblin/submit/views.py:121 +msgid "Woohoo! Submitted!" +msgstr "Visca! S'ha enviat!" + +#: mediagoblin/templates/mediagoblin/404.html:21 +msgid "Oops!" +msgstr "Ups!" + +#: mediagoblin/templates/mediagoblin/404.html:24 +msgid "There doesn't seem to be a page at this address. Sorry!" +msgstr "Sembla que no hi ha cap pà gina en aquesta adreça. Ho sentim." + +#: 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 esteu convençut que l'adreça és correcta, pot ser que la pà gina que " +"cerqueu s'hagi canviat d'ubicació o s'hagi eliminat." + +#: mediagoblin/templates/mediagoblin/404.html:32 +msgid "Image of 404 goblin stressing out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:47 +msgid "MediaGoblin logo" +msgstr "Logo de mediagoblin" + +#: mediagoblin/templates/mediagoblin/base.html:52 +msgid "Submit media" +msgstr "Envia fitxers" + +#: mediagoblin/templates/mediagoblin/base.html:63 +msgid "verify your email!" +msgstr "verifiqueu el correu electrònic" + +#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 +msgid "Log in" +msgstr "Entra" + +#: 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 "" + +#: mediagoblin/templates/mediagoblin/root.html:24 +msgid "Explore" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:27 +msgid "Hi there, media lover! MediaGoblin is..." +msgstr "Ei, fanà tic multimèdia! MediaGoblin és..." + +#: mediagoblin/templates/mediagoblin/root.html:29 +msgid "The perfect place for your media!" +msgstr "El lloc fitxer pels teus fitxers!" + +#: mediagoblin/templates/mediagoblin/root.html:30 +msgid "" +"A place for people to collaborate and show off original and derived " +"creations!" +msgstr "" +"Un lloc en el qual les persones poden col·laborar i mostrar les seves " +"creacions originals o obres derivades." + +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "" +"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, " +"after all.)" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:32 +msgid "" +"Aiming to make the world a better place through decentralization and " +"(eventually, coming soon!) federation!" +msgstr "" +"Amb l'objectiu de fer del món un lloc millor a través de la " +"descentralització i (eventualment, aviat disponible!) La federació!" + +#: mediagoblin/templates/mediagoblin/root.html:33 +msgid "" +"Built for extensibility. (Multiple media types coming soon to the software," +" including video support!)" +msgstr "" +"Construït per l'ampliació. (Múltiples tipus de fitxers en breu amb el " +"programari, incloent el suport de vÃdeo!)" + +#: mediagoblin/templates/mediagoblin/root.html:34 +msgid "" +"Powered by people like you. (<a " +"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this" +" software!</a>)" +msgstr "" +"Desenvolupat per persones com vostè. ( <a " +"href=\"http://mediagoblin.org/pages/join.html\"> Podeu ajudar a millorar " +"aquest programari!</a> )" + +#: mediagoblin/templates/mediagoblin/root.html:38 +msgid "Excited to join us?" +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:29 +msgid "Enter your new password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 +msgid "Enter your username or email" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 +msgid "Your password has been changed. Try to log in now." +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:30 +msgid "Logging in failed!" +msgstr "Inici de sessió ha fallat!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:43 +msgid "Don't have an account yet?" +msgstr "Encara no teniu un compte?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:46 +msgid "Create one here!" +msgstr "Creeu-ne un aquÃ!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:49 +msgid "Forgot your password?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:52 +msgid "Change it!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "Creeu un compte!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:31 +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 "" +"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" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "Edició %(media_title)s " + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49 +msgid "Cancel" +msgstr "Cancel·la" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +msgid "Save changes" +msgstr "Desa els canvis" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:31 +msgid "Media tagged with:" +msgstr "Etiquetat amb:" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "Envieu els vostres fitxers" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Envia" + +#: 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>'s media" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 +msgid "Sorry, no such user found." +msgstr "Lamentablement no s'ha trobat l'usuari que cercà veu." + +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 +#, python-format +msgid "Really delete %(title)s?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 +msgid "Delete Permanently" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 +msgid "Media processing panel" +msgstr "Quadre de processament de fitxers" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25 +msgid "" +"You can track the state of media being processed for your gallery here." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 +msgid "Media in-processing" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46 +msgid "No media in-processing" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 +msgid "These uploads failed to process:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +msgid "Email verification needed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +msgid "Almost done! Your account still needs to be activated." +msgstr "" + +#: 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 "Us hauria d'arribar un correu amb les instruccions per a fer-ho." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +msgid "In case it doesn't:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +msgid "Resend verification email" +msgstr "Torna'm a enviar el correu de verificació" + +#: 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 "" + +#: 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 "" +"Si siu aqeust usuari però heu perdut el correu de verificació, podeu <a " +"href=\"%(login_url)s\">entrar</a> i tornar-lo a enviar." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +msgid "Here's a spot to tell others about yourself." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +msgid "Edit profile" +msgstr "Edita el perfil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +msgid "This user hasn't filled in their profile (yet)." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#, python-format +msgid "View all of %(username)s's media" +msgstr "View all of %(username)s's media" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +msgid "" +"This is where your media will appear, but you don't seem to have added " +"anything yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +msgid "Add media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +msgid "There doesn't seem to be any media here yet..." +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 +msgid "feed icon" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23 +msgid "Atom feed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 +msgid "Newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 +msgid "Older" +msgstr "" + +#: mediagoblin/user_pages/forms.py:24 +msgid "Comment" +msgstr "Comentari" + +#: mediagoblin/user_pages/forms.py:30 +msgid "I am sure I want to delete this" +msgstr "" + +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 +msgid "You are about to delete another user's media. Proceed with caution." +msgstr "" + + diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo Binary files differindex 06a01632..056e3eca 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index 81462e27..5c4ef0d0 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po @@ -7,6 +7,7 @@ # <cwebber@dustycloud.org>, 2011. # Elrond <elrond+mediagoblin.org@samba-tng.org>, 2011. # Jan-Christoph Borchardt <JanCBorchardt@fsfe.org>, 2011. +# <kyoo@kyoo.ch>, 2011. # <mediagoblin.org@samba-tng.org>, 2011. # Rafael Maguiña <rafael.maguina@gmail.com>, 2011. # Vinzenz Vietzke <vinz@fedoraproject.org>, 2011. @@ -14,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" -"Last-Translator: cwebber <cwebber@dustycloud.org>\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 15:18+0000\n" +"Last-Translator: piratenpanda <benjamin@lebsanft.org>\n" "Language-Team: German (http://www.transifex.net/projects/p/mediagoblin/team/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -49,19 +50,19 @@ msgstr "Hier nochmal eintragen, um Tippfehler zu verhindern." msgid "Email address" msgstr "Email-Adresse" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "Registrierung ist auf dieser Instanz leider deaktiviert." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "Leider gibt es bereits einen Benutzer mit diesem Namen." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Tut und Leid, aber diese Email-Adresse wird bereits verwendet." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -69,60 +70,62 @@ msgstr "" "Deine Email-Adresse wurde bestätigt. Du kannst dich nun anmelden, Dein " "Profil bearbeiten und Bilder hochladen!" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "Der Bestätigungssschlüssel oder die Nutzernummer ist falsch." -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "Bestätigungs-Email wurde erneut versandt." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +"Konnte Email zur Wiederherstellung des Passworts nicht senden, weil dein " +"Benutzername inaktiv oder deine Email-Adresse noch nicht verifiziert ist." -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titel" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Markierungen" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "Kurztitel" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "Bitte gib einen Kurztitel ein" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 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 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Biographie" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Webseite" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." msgstr "Diesen Kurztitel hast du bereits vergeben." -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 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:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "Du bearbeitest das Profil eines Anderen. Bitte sei vorsichtig." @@ -138,15 +141,15 @@ msgstr "Datei" msgid "Description of this work" msgstr "Beschreibung des Werkes" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Du musst eine Datei angeben." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "Diese Datei scheint kein Bild zu sein!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Yeeeaaah! Geschafft!" @@ -187,8 +190,8 @@ msgid "verify your email!" msgstr "Bitte bestätige deine Email-Adresse!" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Anmelden" @@ -202,7 +205,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:24 msgid "Explore" -msgstr "" +msgstr "Entdecke" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, media lover! MediaGoblin is..." @@ -256,7 +259,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:38 msgid "Excited to join us?" -msgstr "" +msgstr "Neugierig dich uns anzuschließen?" #: mediagoblin/templates/mediagoblin/root.html:39 #, python-format @@ -265,27 +268,32 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Gratis ein Konto einrichten</a>\n" +" or\n" +" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">MediaGoblin auf deinem eigenen Server einrichten</a>" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" -msgstr "" +msgstr "Neuste Medien" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" -msgstr "" +msgstr "Neues Passwort eingeben" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" -msgstr "" +msgstr "Benutzername oder Email-Adresse eingeben" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +msgstr "Dein Passwort wurde geändert. Versuche dich jetzt einzuloggen." #: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22 msgid "" "Check your inbox. We sent an email with a URL for changing your password." msgstr "" +"Prüfe deinen Posteingang. Wir haben dir eine Email mit einem Link geschickt," +" mit dem du dein Passwort ändern kannst." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -300,32 +308,39 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" +"Hi %(username)s,\n" +"\n" +"um dein GNU MediaGoblin Passwort zu ändern, öffne folgende URL in deinem Webbrowser:\n" +"\n" +"%(verification_url)s\n" +"\n" +"Wenn du denkst, dass das ein Fehler ist, ignoriere einfach diese Email und bleib ein glücklicher Goblin!" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "Anmeldevorgang fehlgeschlagen!" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Hast du noch kein Konto?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" -msgstr "Registriere dich!" +msgstr "Registriere dich hier!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" -msgstr "" +msgstr "Passwort vergessen?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" -msgstr "" +msgstr "Wechsle es!" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Neues Konto registrieren!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Registrieren" @@ -363,7 +378,7 @@ msgstr "Änderungen speichern" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" -msgstr "%(username)ss Profil barbeiten" +msgstr "%(username)ss Profil bearbeiten" #: mediagoblin/templates/mediagoblin/listings/tag.html:31 msgid "Media tagged with:" @@ -373,7 +388,7 @@ msgstr "Medien markiert mit:" msgid "Submit yer media" msgstr "Medien hochladen" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Bestätigen" @@ -417,7 +432,7 @@ msgstr "Keine Medien in Bearbeitung" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 msgid "These uploads failed to process:" -msgstr "Die folgenden Uploads sind fehlgeschlagen" +msgstr "Die folgenden Uploads sind fehlgeschlagen:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:39 #: mediagoblin/templates/mediagoblin/user_pages/user.html:59 @@ -522,7 +537,15 @@ msgstr "Kommentar" msgid "I am sure I want to delete this" msgstr "Ja, wirklich löschen" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "Leere Kommentare sind nicht erlaubt." + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "Kommentar hinzugefügt!" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "Du versuchst Medien eines anderen Nutzers zu löschen. Sei vorsichtig." diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po index 16a235a2..5e1401f6 100644 --- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" +"POT-Creation-Date: 2011-11-01 23:14-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" @@ -41,75 +41,75 @@ msgstr "" msgid "Email address" msgstr "" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "" -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "" -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "" -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your " "profile, and submit images!" msgstr "" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "" @@ -125,15 +125,15 @@ msgstr "" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "" @@ -172,8 +172,8 @@ msgid "verify your email!" msgstr "" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "" @@ -245,11 +245,11 @@ msgstr "" msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "" @@ -275,23 +275,23 @@ msgid "" "a happy goblin!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "" @@ -299,7 +299,7 @@ msgstr "" msgid "Create an account!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "" @@ -342,7 +342,7 @@ msgstr "" msgid "Submit yer media" msgstr "" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "" @@ -480,7 +480,15 @@ msgstr "" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo Binary files differindex 506e882b..c537c65e 100644 --- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po index 270b043f..f6bb1cce 100644 --- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" @@ -45,19 +45,19 @@ msgstr "Retajpu Äin por certigi, ke ne okazis mistajpoj." msgid "Email address" msgstr "RetpoÅtadreso" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "BedaÅrinde, registrado estas malaktivigita en tiu ĉi instalaĵo." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "BedaÅrinde, uzanto kun tiu nomo jam ekzistas." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Tiu retpoÅtadreso jam estas uzata." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -65,60 +65,62 @@ msgstr "" "Via retpoÅtadreso estas konfirmita. Vi povas nun ensaluti, redakti vian " "profilon, kaj alÅuti bildojn!" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "La kontrol-kodo aÅ la uzantonomo ne estas korekta" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "Resendi vian kontrol-mesaÄon." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +"Ni ne povas sendi pasvortsavan retleteron, ĉar aÅ via konto estas neaktiva, " +"aÅ Äia retpoÅtadreso ne estis konfirmita." -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titolo" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Etikedoj" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "La distingiga adresparto" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "La distingiga adresparto ne povas esti malplena" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 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 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Retejo" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 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:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." msgstr "Vi priredaktas dosieron de alia uzanto. Agu singardeme." -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "Vi redaktas profilon de alia uzanto. Agu singardeme." @@ -134,15 +136,15 @@ msgstr "Dosiero" msgid "Description of this work" msgstr "Priskribo de ĉi tiu verko" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Vi devas provizi dosieron." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "La dosiero Åajnas ne esti bildo!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Hura! AlÅutitas!" @@ -183,8 +185,8 @@ msgid "verify your email!" msgstr "konfirmu vian retpoÅtadreson! " #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Ensaluti" @@ -250,7 +252,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:38 msgid "Excited to join us?" -msgstr "" +msgstr "Ĉu vi deziregas aliÄi nin?" #: mediagoblin/templates/mediagoblin/root.html:39 #, python-format @@ -259,27 +261,32 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Kreu senpagan" +" konton</a>⎠aÅ⎠<a class=\"header_submit\" " +"href=\"http://wiki.mediagoblin.org/HackingHowto\">Kreu senpagan konton</a>" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" msgstr "Plej nove aldonitaj dosieroj" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "Enigu vian novan pasvorton" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "Enigu vian salutnomon aÅ retpoÅtadreson" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +msgstr "Via pasvorto estis ÅanÄita. Nun provu ensaluti." #: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22 msgid "" "Check your inbox. We sent an email with a URL for changing your password." msgstr "" +"Kontrolu vian retleterujon. Ni sendis retleteron kun retadreso por ÅanÄo de " +"via pasvorto." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -302,23 +309,23 @@ msgstr "" "\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 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "Ensaluto malsukcesis!" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Ĉu ankoraÅ sen konto?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "Kreu Äin ĉi tie!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "Ĉu vi forgesis vian pasvorton?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "ÅœanÄu Äin!" @@ -326,7 +333,7 @@ msgstr "ÅœanÄu Äin!" msgid "Create an account!" msgstr "Kreu konton!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Krei" @@ -374,7 +381,7 @@ msgstr "Dosieroj markitaj per:" msgid "Submit yer media" msgstr "AlÅutu vian aÅd-vid-dosieron" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "AlÅuti" @@ -522,7 +529,15 @@ msgstr "Komento" 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 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "Vi estas forigonta dosieron de alia uzanto. Estu singardema." diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo Binary files differindex 2e64b814..2d2b9243 100644 --- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po index 083a87a5..a3c9939b 100644 --- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po @@ -3,17 +3,19 @@ # This file is distributed under the same license as the PROJECT project. # # Translators: +# <deletesoftware@yandex.ru>, 2011. # <ekenbrand@hotmail.com>, 2011. # <jacobo@gnu.org>, 2011. # Javier Di Mauro <javierdimauro@gmail.com>, 2011. # <juangsub@gmail.com>, 2011. +# <juanma@kde.org.ar>, 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-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mediagoblin/team/es/)\n" "MIME-Version: 1.0\n" @@ -25,7 +27,7 @@ msgstr "" #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" -msgstr "Nombre de Usuario" +msgstr "Nombre de usuario" #: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 msgid "Password" @@ -48,19 +50,19 @@ msgstr "" msgid "Email address" msgstr "Dirección de correo electrónico" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." -msgstr "Lo sentimos, la registración está deshabilitado en este momento." +msgstr "Lo sentimos, el registro está deshabilitado en este momento." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "Lo sentimos, ya existe un usuario con ese nombre." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Lo sentimos, esa dirección de correo electrónico ya ha sido tomada." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -68,16 +70,16 @@ msgstr "" "Tu dirección de correo electrónico ha sido verificada. ¡Ahora puedes " "ingresar, editar tu perfil, y enviar imágenes!" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 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:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "Se reenvió tu correo electrónico de verificación." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -86,46 +88,46 @@ msgstr "" "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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "TÃtulo" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Etiquetas" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "Ficha" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "La ficha no puede estar vacÃa" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 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 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Sitio web" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 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:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." msgstr "Estás editando el contenido de otro usuario. Proceder con precaución." -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "Estás editando un perfil de usuario. Proceder con precaución." @@ -141,15 +143,15 @@ msgstr "Archivo" msgid "Description of this work" msgstr "Descripción de esta obra" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Debes proporcionar un archivo." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "¡El archivo no parece ser una imagen!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "¡Woohoo! ¡Enviado!" @@ -187,11 +189,11 @@ msgstr "Enviar contenido" #: mediagoblin/templates/mediagoblin/base.html:63 msgid "verify your email!" -msgstr "Verifica tu correo electrónico!" +msgstr "¡Verifica tu correo electrónico!" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Conectarse" @@ -209,18 +211,18 @@ msgstr "Explorar" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Hola, amante de los contenidos! 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 contenidos!" +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 originales y derivadas!" #: mediagoblin/templates/mediagoblin/root.html:31 msgid "" @@ -243,8 +245,8 @@ msgid "" "Built for extensibility. (Multiple media types coming soon to the software," " including video support!)" msgstr "" -"Pensado para la ser extensible. (Prontamente soporte para multiples " -"formatos, incluyendo video!)" +"Pensado para ser extensible. (Prontamente soporte para multiples formatos, " +"incluyendo video!)" #: mediagoblin/templates/mediagoblin/root.html:34 msgid "" @@ -258,7 +260,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:38 msgid "Excited to join us?" -msgstr "Te emociona trabajar con nosotros?" +msgstr "Te gustarÃa unirte a nosotros?" #: mediagoblin/templates/mediagoblin/root.html:39 #, python-format @@ -267,27 +269,33 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Crea una " +"cuenta gratuita</a> o <a class=\"header_submit\" " +"href=\"http://wiki.mediagoblin.org/HackingHowto\">Establece MediaGoblin en " +"tu propio servidor</a>" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" msgstr "El contenido más reciente" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "Ingrese su nueva contraseña" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "Introduzca su nombre de usuario o correo electrónico" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +msgstr "Se cambió tu contraseña. Intenta iniciar sesión ahora." #: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22 msgid "" "Check your inbox. We sent an email with a URL for changing your password." msgstr "" +"Revisa tu bandeja de entrada. Te enviamos un correo electrónico con una URL " +"para cambiar tu contraseña." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -302,28 +310,28 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" -"Hola %(username)s , para cambiar su contraseña de GNU MediaGoblin, abra lal " +"Hola %(username)s , para cambiar su contraseña de GNU MediaGoblin, abra la " "siguiente URL en su navegador: %(verification_url)s Si usted piensa que " "esto es un error, simplemente ignore este mensaje y siga siendo un duende " "feliz!" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" -msgstr "Falló el inicio de sesión!" +msgstr "¡Falló el inicio de sesión!" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "¿No tienes una cuenta?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "¡Crea una aquÃ!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "¿Olvidaste tu contraseña?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "Cambiarlo!" @@ -331,7 +339,7 @@ msgstr "Cambiarlo!" msgid "Create an account!" msgstr "¡Crea una cuenta!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Crear" @@ -379,7 +387,7 @@ msgstr "Contenido etiquetado con:" msgid "Submit yer media" msgstr "EnvÃa tu contenido" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Enviar" @@ -415,7 +423,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 msgid "Media in-processing" -msgstr "Contenido siendo procesado" +msgstr "Procesando contenido" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46 msgid "No media in-processing" @@ -428,7 +436,7 @@ msgstr "Estos archivos no pudieron ser procesados:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:39 #: mediagoblin/templates/mediagoblin/user_pages/user.html:59 msgid "Email verification needed" -msgstr "Correo electrónico de verificación necesario" +msgstr "Es necesario un correo electrónico de verificación" #: mediagoblin/templates/mediagoblin/user_pages/user.html:42 msgid "Almost done! Your account still needs to be activated." @@ -455,7 +463,7 @@ msgid "" " activated." msgstr "" "Alguien ya registró una cuenta con ese nombre de usuario, pero todavÃa no " -"fué activada." +"fue activada." #: mediagoblin/templates/mediagoblin/user_pages/user.html:68 #, python-format @@ -473,7 +481,7 @@ msgstr "Perfil de %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/user.html:85 msgid "Here's a spot to tell others about yourself." -msgstr "Aquà hay un lugar para que le cuentes a los demás sobre tÃ" +msgstr "Aquà hay un lugar para que le cuentes a los demás sobre tÃ." #: mediagoblin/templates/mediagoblin/user_pages/user.html:90 #: mediagoblin/templates/mediagoblin/user_pages/user.html:108 @@ -528,7 +536,15 @@ msgstr "Comentario" msgid "I am sure I want to delete this" msgstr "Estoy seguro de que quiero borrar esto" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" "Estás a punto de eliminar un contenido de otro usuario. Proceder con " diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo Binary files differindex 5b3adb77..90e83303 100644 --- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po index a9b9f160..0a6a5a40 100644 --- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PROJECT project. # # Translators: +# <chesuidayeur@yahoo.fr>, 2011. # <joehillen@gmail.com>, 2011. # <marktraceur@gmail.com>, 2011. # <maxineb@members.fsf.org>, 2011. @@ -12,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" -"Last-Translator: cwebber <cwebber@dustycloud.org>\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-04 10:05+0000\n" +"Last-Translator: chesuidayeur <chesuidayeur@yahoo.fr>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,26 +43,26 @@ msgstr "Confirmer le mot de passe" #: mediagoblin/auth/forms.py:39 msgid "Type it again here to make sure there are no spelling mistakes." msgstr "" -"Tapez-le à nouveau ici pour vous assurer qu'il n'ya pas de fautes " +"Tapez-le à nouveau ici pour vous assurer qu'il n'y a pas de fautes " "d'orthographe." #: mediagoblin/auth/forms.py:42 msgid "Email address" msgstr "Adresse e-mail" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 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:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "Un utilisateur existe déjà avec ce nom, désolé." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Désolé, cette adresse courriel a déjà été prise." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -69,60 +70,64 @@ 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:171 +#: mediagoblin/auth/views.py:185 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:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "E-mail de vérification renvoyé." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +"Impossible d'envoyer un email de récupération de mot de passe : votre compte" +" est inactif ou bien l'email de votre compte n'a pas été vérifiée." -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titre" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Tags" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "Légende" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "La légende ne peut pas être laissée vide." -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" +"Le nom de ce media dans l'URL. Vous n'avez normalement pas besoin de le " +"changer" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Site web" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 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:84 +#: mediagoblin/edit/views.py:85 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:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "" "Vous vous apprêtez à modifier le profil d'un utilisateur. Veuillez prendre " @@ -130,7 +135,7 @@ msgstr "" #: mediagoblin/process_media/errors.py:44 msgid "Invalid file given for media type." -msgstr "Invalide fichier donné pour le type de média." +msgstr "Le fichier envoyé ne correspond pas au type de média." #: mediagoblin/submit/forms.py:25 msgid "File" @@ -138,17 +143,17 @@ msgstr "Fichier" #: mediagoblin/submit/forms.py:30 msgid "Description of this work" -msgstr "" +msgstr "Descriptif pour ce travail" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Il vous faut fournir un fichier." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "Ce fichier ne semble pas être une image !" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Youhou, c'est envoyé !" @@ -158,7 +163,7 @@ msgstr "Zut!" #: mediagoblin/templates/mediagoblin/404.html:24 msgid "There doesn't seem to be a page at this address. Sorry!" -msgstr "Il ne semble pas être une page à cette adresse. Désolé!" +msgstr "Il ne semble pas y avoir de page à cette adresse. Désolé !" #: mediagoblin/templates/mediagoblin/404.html:26 msgid "" @@ -166,11 +171,11 @@ msgid "" " been moved or deleted." msgstr "" "Si vous êtes sûr que l'adresse est correcte, peut-être la page que vous " -"recherchez a été déplacé ou supprimé." +"recherchez a été déplacée ou supprimée." #: mediagoblin/templates/mediagoblin/404.html:32 msgid "Image of 404 goblin stressing out" -msgstr "Image de 404 gobelin stresser" +msgstr "Image de 404 gobelin angoissé" #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" @@ -189,8 +194,8 @@ msgid "verify your email!" msgstr "vérifiez votre adresse e-mail !" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "S'identifier" @@ -199,12 +204,12 @@ msgid "" "Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a " "href=\"http://gnu.org/\">GNU</a> project" msgstr "" -"Propulsé par <a href=\"http://mediagoblin.org\">MediaGoblin</a> , un <a " -"href=\"http://gnu.org/\">GNU</a> de projet" +"Propulsé par <a href=\"http://mediagoblin.org\">MediaGoblin</a> , un projet " +"<a href=\"http://gnu.org/\">GNU</a>" #: mediagoblin/templates/mediagoblin/root.html:24 msgid "Explore" -msgstr "" +msgstr "Explorer" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, media lover! MediaGoblin is..." @@ -219,15 +224,15 @@ 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!" +"Un espace de création collaboratif : montrez vos Å“uvres, originales ou " +"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, " +"Logiciel libre. (Nous sommes un projet <a href=\"http://gnu.org\">GNU</a> " "après tout.)" #: mediagoblin/templates/mediagoblin/root.html:32 @@ -235,8 +240,8 @@ 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!" +"Une tentative de rendre le monde meilleur grâce à la décentralisation et (à " +"terme, et pour bientôt !) la fédération !" #: mediagoblin/templates/mediagoblin/root.html:33 msgid "" @@ -258,7 +263,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:38 msgid "Excited to join us?" -msgstr "" +msgstr "Envi de vous joindre à nous ?" #: mediagoblin/templates/mediagoblin/root.html:39 #, python-format @@ -267,27 +272,33 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Créez gratuitement en compte</a>\n" +" ou\n" +" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Installez MediaGoblin sur votre propre serveur</a>" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" -msgstr "" +msgstr "Tout derniers media" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" -msgstr "" +msgstr "Entrez un nouveau mot de passe" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" -msgstr "" +msgstr "Entrez votre nom d'utilisateur ou votre email" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." msgstr "" +"Votre mot de passe a été changé. Essayez maintenant de vous identifier." #: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22 msgid "" "Check your inbox. We sent an email with a URL for changing your password." msgstr "" +"Verifiez votre boîte de réception. Nous vous avons envoyé un email avec une " +"URL vous permettant de changer votre mot de passe." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -302,32 +313,41 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" +"Bonjour %(username)s,\n" +"\n" +"Pour changer votre mot de passe GNU MediaGoblin, ouvrez l'URL suivante dans \n" +"votre navigateur internet :\n" +"\n" +"%(verification_url)s\n" +"\n" +"Si vous pensez qu'il s'agit d'une erreur, ignorez simplement cet email et restez\n" +"un goblin heureux !" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" -msgstr "Connexion a échoué!" +msgstr "La connexion a échoué!" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Pas encore de compte?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "Créez-en un ici!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" -msgstr "" +msgstr "Vous avez oublié votre mot de passe ?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" -msgstr "" +msgstr "Changez-le !" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Créer un compte!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Créer" @@ -375,7 +395,7 @@ msgstr "Média comportant les tags suivants :" msgid "Submit yer media" msgstr "Soumettez ce média" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Soumettre" @@ -396,7 +416,7 @@ msgstr "Voulez-vous vraiment supprimer %(title)s ?" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 msgid "Delete Permanently" -msgstr "" +msgstr "Supprimer définitivement" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 msgid "Media processing panel" @@ -419,7 +439,7 @@ msgstr "Aucun média en transformation" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 msgid "These uploads failed to process:" -msgstr "Ces ajouts n'etaient pas processé:" +msgstr "Le traitement de ces ajouts a échoué :" #: mediagoblin/templates/mediagoblin/user_pages/user.html:39 #: mediagoblin/templates/mediagoblin/user_pages/user.html:59 @@ -428,7 +448,7 @@ 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 "Presque fini! Votre compte a encore besoin d'être activé." +msgstr "Presque fini ! Votre compte a encore besoin d'être activé." #: mediagoblin/templates/mediagoblin/user_pages/user.html:47 msgid "" @@ -479,7 +499,7 @@ msgstr "Modifier le profil" #: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "This user hasn't filled in their profile (yet)." -msgstr "Cet utilisateur n'a pas rempli leur profil (encore)." +msgstr "Cet utilisateur n'a pas (encore) rempli son profil." #: mediagoblin/templates/mediagoblin/user_pages/user.html:122 #, python-format @@ -491,8 +511,8 @@ msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "" -"C'est là où vos médias apparaît, mais vous ne semblez pas avoir quoi que ce " -"soit encore ajouté." +"C'est là où vos médias apparaîssent, mais vous ne semblez pas avoir encore " +"ajouté quoi que ce soit." #: mediagoblin/templates/mediagoblin/user_pages/user.html:141 msgid "Add media" @@ -500,11 +520,11 @@ 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 "Il ne semble pas être un média encore là ..." +msgstr "Il ne semble pas y avoir de média là , pour l'instant ..." #: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 msgid "feed icon" -msgstr "icon de flux" +msgstr "icone de flux" #: mediagoblin/templates/mediagoblin/utils/feed_link.html:23 msgid "Atom feed" @@ -512,11 +532,11 @@ msgstr "flux Atom" #: mediagoblin/templates/mediagoblin/utils/pagination.html:40 msgid "Newer" -msgstr "" +msgstr "Nouveaux" #: mediagoblin/templates/mediagoblin/utils/pagination.html:46 msgid "Older" -msgstr "" +msgstr "Anciens" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -524,9 +544,17 @@ msgstr "Commentaire" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" -msgstr "" +msgstr "Je suis sûr de vouloir supprimer cela" + +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "Les commentaires vides ne sont pas autorisés." + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "Votre commentaire a été posté !" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" "Vous êtes sur le point de supprimer des médias d'un autre utilisateur. " diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo Binary files differnew file mode 100644 index 00000000..feb156ff --- /dev/null +++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..d9fdf8d6 --- /dev/null +++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,498 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +# Translators: +# Emilio Sepúlveda <djfunkinmixer@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-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+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: ia\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +msgid "Username" +msgstr "Nomine de usator" + +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +msgid "Password" +msgstr "Contrasigno" + +#: mediagoblin/auth/forms.py:35 +msgid "Passwords must match." +msgstr "" + +#: mediagoblin/auth/forms.py:37 +msgid "Confirm password" +msgstr "" + +#: mediagoblin/auth/forms.py:39 +msgid "Type it again here to make sure there are no spelling mistakes." +msgstr "" + +#: mediagoblin/auth/forms.py:42 +msgid "Email address" +msgstr "Adresse de e-posta" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, registration is disabled on this instance." +msgstr "" + +#: mediagoblin/auth/views.py:73 +msgid "Sorry, a user with that name already exists." +msgstr "" + +#: mediagoblin/auth/views.py:77 +msgid "Sorry, that email address has already been taken." +msgstr "" + +#: mediagoblin/auth/views.py:179 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" + +#: mediagoblin/auth/views.py:185 +msgid "The verification key or user id is incorrect" +msgstr "" + +#: mediagoblin/auth/views.py:207 +msgid "Resent your verification email." +msgstr "" + +#: mediagoblin/auth/views.py:248 +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:24 mediagoblin/submit/forms.py:27 +msgid "Title" +msgstr "Titulo" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +msgid "Tags" +msgstr "" + +#: mediagoblin/edit/forms.py:31 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:32 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 +msgid "" +"The title part of this media's URL. You usually don't need to change this." +msgstr "" + +#: mediagoblin/edit/forms.py:40 +msgid "Bio" +msgstr "" + +#: mediagoblin/edit/forms.py:43 +msgid "Website" +msgstr "Sito web" + +#: mediagoblin/edit/views.py:64 +msgid "An entry with that slug already exists for this user." +msgstr "" + +#: mediagoblin/edit/views.py:85 +msgid "You are editing another user's media. Proceed with caution." +msgstr "" + +#: mediagoblin/edit/views.py:155 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "" + +#: mediagoblin/process_media/errors.py:44 +msgid "Invalid file given for media type." +msgstr "" + +#: mediagoblin/submit/forms.py:25 +msgid "File" +msgstr "" + +#: mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/submit/views.py:46 +msgid "You must provide a file." +msgstr "" + +#: mediagoblin/submit/views.py:49 +msgid "The file doesn't seem to be an image!" +msgstr "" + +#: mediagoblin/submit/views.py:121 +msgid "Woohoo! Submitted!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/404.html:21 +msgid "Oops!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/404.html:24 +msgid "There doesn't seem to be a page at this address. Sorry!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/404.html:26 +msgid "" +"If you're sure the address is correct, maybe the page you're looking for has" +" been moved or deleted." +msgstr "" + +#: mediagoblin/templates/mediagoblin/404.html:32 +msgid "Image of 404 goblin stressing out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:47 +msgid "MediaGoblin logo" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:52 +msgid "Submit media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:63 +msgid "verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 +msgid "Log in" +msgstr "Initiar session" + +#: 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 "" + +#: mediagoblin/templates/mediagoblin/root.html:24 +msgid "Explore" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:27 +msgid "Hi there, media lover! MediaGoblin is..." +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:29 +msgid "The perfect place for your media!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:30 +msgid "" +"A place for people to collaborate and show off original and derived " +"creations!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "" +"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, " +"after all.)" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:32 +msgid "" +"Aiming to make the world a better place through decentralization and " +"(eventually, coming soon!) federation!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:33 +msgid "" +"Built for extensibility. (Multiple media types coming soon to the software," +" including video support!)" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:34 +msgid "" +"Powered by people like you. (<a " +"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this" +" software!</a>)" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:38 +msgid "Excited to join us?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:39 +#, python-format +msgid "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n" +" or\n" +" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:53 +msgid "Most recent media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 +msgid "Enter your new password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 +msgid "Enter your username or email" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 +msgid "Your password has been changed. Try to log in now." +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:30 +msgid "Logging in failed!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:43 +msgid "Don't have an account yet?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:46 +msgid "Create one here!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:49 +msgid "Forgot your password?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:52 +msgid "Change it!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "Crear un conto!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:31 +msgid "Create" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 +#, python-format +msgid "" +"Hi %(username)s,\n" +"\n" +"to activate your GNU MediaGoblin account, open the following URL in\n" +"your web browser:\n" +"\n" +"%(verification_url)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49 +msgid "Cancel" +msgstr "Cancellar" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +msgid "Save changes" +msgstr "" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:31 +msgid "Media tagged with:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#, python-format +msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 +#, python-format +msgid "Really delete %(title)s?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 +msgid "Delete Permanently" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 +msgid "Media processing panel" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25 +msgid "" +"You can track the state of media being processed for your gallery here." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 +msgid "Media in-processing" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46 +msgid "No media in-processing" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 +msgid "These uploads failed to process:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +msgid "Email verification needed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +msgid "Almost done! Your account still needs to be activated." +msgstr "" + +#: 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 "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +msgid "In case it doesn't:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +msgid "Resend verification email" +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 "" + +#: 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 "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 +#, python-format +msgid "%(username)s's profile" +msgstr "Profilo de %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +msgid "Here's a spot to tell others about yourself." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +msgid "Edit profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +msgid "This user hasn't filled in their profile (yet)." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#, python-format +msgid "View all of %(username)s's media" +msgstr "" + +#: 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 "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +msgid "Add media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +msgid "There doesn't seem to be any media here yet..." +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 +msgid "feed icon" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23 +msgid "Atom feed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 +msgid "Newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 +msgid "Older" +msgstr "" + +#: 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 "" + +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 +msgid "You are about to delete another user's media. Proceed with caution." +msgstr "" + + diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo Binary files differindex 9a010192..cc0ccbfa 100644 --- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po index 67db7ca2..183d09ed 100644 --- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" @@ -43,19 +43,19 @@ msgstr "Scrivilo ancora qui per assicurarti che non ci siano errori" msgid "Email address" msgstr "Indirizzo email" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "Spiacente, registrazione è disabilitata su questa istanza" -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "Spiacente, esiste già un utente con quel nome" -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Spiacente, quell'indirizzo email è già stato preso." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -63,60 +63,60 @@ msgstr "" "Il tuo indirizzo email è stato verificato. Puoi ora fare login, modificare " "il tuo profilo, e inserire immagini!" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "La chiave di verifica o l'id utente è sbagliato" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "Rispedisci email di verifica" -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titolo" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Tags" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Sito web" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 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 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "Stai modificando il profilo di un utente. Procedi con attenzione." @@ -132,15 +132,15 @@ msgstr "Documento" msgid "Description of this work" msgstr "Descrizione di questo lavoro" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Devi specificare un documento." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "Il documento non sembra essere un'immagine!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Evviva! " @@ -181,8 +181,8 @@ 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 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Accedi" @@ -261,11 +261,11 @@ msgstr "" msgid "Most recent media" msgstr "Documenti multimediali più recenti" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "Inserisci la tua nuova password" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "Inserisci il tuo nome utente o email" @@ -292,23 +292,23 @@ msgid "" "a happy goblin!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "Accesso fallito!" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Non hai ancora un account?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "Creane uno qui!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "Hai dimenticato la password?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "" @@ -316,7 +316,7 @@ msgstr "" msgid "Create an account!" msgstr "Crea un account!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Crea" @@ -364,7 +364,7 @@ msgstr "Media taggata con:" msgid "Submit yer media" msgstr "Inoltra documento multimediale" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Conferma" @@ -511,7 +511,15 @@ msgstr "Commento" msgid "I am sure I want to delete this" msgstr "Sono sicuro di volerlo cancellare" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" "Stai cancellando un documento multimediale di un altro utente. Procedi con " diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo Binary files differindex 4bdc4d5a..5267eddc 100644 --- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po index ebc8ad52..59262d82 100644 --- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" @@ -43,76 +43,76 @@ msgstr "" msgid "Email address" msgstr "メールアドレス" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ç™»éŒ²ã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ã€‚" -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "申ã—訳ã‚りã¾ã›ã‚“ãŒã€ãã®åå‰ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã™ã§ã«å˜åœ¨ã—ã¦ã„ã¾ã™ã€‚" -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "" -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "メアドãŒç¢ºèªã•れã¦ã„ã¾ã™ã€‚ã“れã§ã€ãƒã‚°ã‚¤ãƒ³ã—ã¦ãƒ—ãƒãƒ•ァイルを編集ã—ã€ç”»åƒã‚’æå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "検証ã‚ーã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼IDãŒé–“é•ã£ã¦ã„ã¾ã™" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "検証メールをå†é€ã—ã¾ã—ãŸã€‚" -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "タイトル" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "ã‚¿ã‚°" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "スラグ" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "スラグã¯å¿…è¦ã§ã™ã€‚" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "自己紹介" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "URL" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." msgstr "ãã®ã‚¹ãƒ©ã‚°ã‚’æŒã¤ã‚¨ãƒ³ãƒˆãƒªã¯ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯æ—¢ã«å˜åœ¨ã—ã¾ã™ã€‚" -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." msgstr "ã‚ãªãŸã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集ã—ã¦ã„ã¾ã™ã€‚ã”æ³¨æ„ãã ã•ã„。" -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "ã‚ãªãŸã¯ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ—ãƒãƒ•ァイルを編集ã—ã¦ã„ã¾ã™ã€‚ã”æ³¨æ„ãã ã•ã„。" @@ -128,15 +128,15 @@ msgstr "ファイル" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "ファイルをæä¾›ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "ファイルãŒç”»åƒã§ã¯ãªã„よã†ã§ã™ï¼" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "投稿終了ï¼" @@ -175,8 +175,8 @@ msgid "verify your email!" msgstr "メアドを確èªã—ã¦ãã ã•ã„ï¼" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "ãƒã‚°ã‚¤ãƒ³" @@ -245,11 +245,11 @@ msgstr "" msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "" @@ -276,23 +276,23 @@ msgid "" "a happy goblin!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "ã¾ã アカウントをæŒã£ã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "ã“ã“ã§ä½œæˆï¼" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "" @@ -300,7 +300,7 @@ msgstr "" msgid "Create an account!" msgstr "アカウントを作æˆï¼" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "" @@ -348,7 +348,7 @@ msgstr "タグ付ã‘ã•れãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„:" msgid "Submit yer media" msgstr "コンテンツを投稿" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "é€ä¿¡" @@ -488,7 +488,15 @@ msgstr "" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo Binary files differindex 57447395..e6d1976b 100644 --- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po index c982eb95..618daf6f 100644 --- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" @@ -43,19 +43,19 @@ msgstr "" msgid "Email address" msgstr "E-mail adres" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "Sorry, registratie is uitgeschakeld op deze instantie." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "Sorry, er bestaat al een gebruiker met die naam." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Sorry, dat e-mailadres is al ingenomen." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -63,60 +63,60 @@ msgstr "" "Uw e-mailadres is geverifieerd. U kunt nu inloggen, uw profiel bewerken, en " "afbeeldingen toevoegen!" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "De verificatie sleutel of gebruikers-ID is onjuist" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "Verificatie e-mail opnieuw opgestuurd." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titel" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Etiket" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Website" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 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:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "" "U bent een gebruikersprofiel aan het aanpassen. Ga voorzichtig te werk." @@ -133,15 +133,15 @@ msgstr "Bestand" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "U moet een bestand aangeven." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "Het lijkt erop dat dit bestand geen afbeelding is!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Mooizo! Toegevoegd!" @@ -180,8 +180,8 @@ msgid "verify your email!" msgstr "Controleer uw e-mail!" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Inloggen" @@ -250,11 +250,11 @@ msgstr "" msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "" @@ -281,23 +281,23 @@ msgid "" "a happy goblin!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Heeft u nog geen account?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "Maak er hier een!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "" @@ -305,7 +305,7 @@ msgstr "" msgid "Create an account!" msgstr "Maak een account aan!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "" @@ -350,7 +350,7 @@ msgstr "Media met het etiket:" msgid "Submit yer media" msgstr "Voeg media toe" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Voeg toe" @@ -494,7 +494,15 @@ msgstr "Commentaar" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo Binary files differindex 7bf5a87a..ba427c29 100644 --- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po index 4e1c382b..c74e1dd0 100644 --- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" @@ -37,86 +37,87 @@ msgstr "Gjenta passord" #: mediagoblin/auth/forms.py:39 msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "" +msgstr "Skriv passordet omatt for Ã¥ unngÃ¥ stavefeil." #: mediagoblin/auth/forms.py:42 msgid "Email address" -msgstr "E-postadresse" +msgstr "Epost" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "Registrering er slege av. Orsak." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "Ein konto med dette brukarnamnet finst allereide." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Den epostadressa er allereide teken." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" -"E-postadressa di, og dimed kontoen din er stadfesta. Du kan no logga inn, " -"endra profilen din og lasta opp filer." +"Kontoen din er stadfesta. Du kan no logga inn, endra profilen din og lasta " +"opp filer." -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "Stadfestingsnykelen eller brukar-ID-en din er feil." -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "Send ein ny stadfestingsepost." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +"Kunne ikkje senda epost. Brukarnamnet ditt er inaktivt eller uverifisert." -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Tittel" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Merkelappar" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" -msgstr "Adressetittel" +msgstr "Nettnamn" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" -msgstr "Adressetittelen kan ikkje vera tom" +msgstr "Nettnamnet kan ikkje vera tomt" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." -msgstr "" +msgstr "Nettnamnet (adressetittel) for mediefila di. Trengst ikkje endrast." -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Presentasjon" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Heimeside" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." msgstr "Eit innlegg med denne adressetittelen finst allereie." -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." -msgstr "Ver forsiktig, du redigerer ein annan konto sitt innlegg." +msgstr "TrÃ¥ varsamt, du endrar nokon andre sine mediefiler." -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." -msgstr "Ver forsiktig, du redigerer ein annan konto sin profil." +msgstr "TrÃ¥ varsamt, du endrar nokon andre sin profil." #: mediagoblin/process_media/errors.py:44 msgid "Invalid file given for media type." @@ -128,17 +129,17 @@ msgstr "Fil" #: mediagoblin/submit/forms.py:30 msgid "Description of this work" -msgstr "" +msgstr "Skildring av mediefila" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Du mÃ¥ velja ei fil." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "Fila verkar ikkje Ã¥ vera ei gyldig biletefil." -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Johoo! Opplasta!" @@ -148,18 +149,19 @@ msgstr "Oops." #: mediagoblin/templates/mediagoblin/404.html:24 msgid "There doesn't seem to be a page at this address. Sorry!" -msgstr "Det ser ikkje ut til Ã¥ vera noko her..." +msgstr "Det ser ikkje ut til Ã¥ vera noko her... Orsak." #: 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 "" -"Er du sikker pÃ¥ at adressa er korrekt, sÃ¥ er ho truleg flytta eller sletta." +"Er du sikker pÃ¥ at adressa er korrekt, so er sida truleg flytta eller " +"sletta." #: mediagoblin/templates/mediagoblin/404.html:32 msgid "Image of 404 goblin stressing out" -msgstr "Bilete av stressa 404-troll." +msgstr "Bilete av stressa 404-tusse." #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" @@ -178,8 +180,8 @@ msgid "verify your email!" msgstr "Stadfest epostadressa di" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Logg inn" @@ -188,10 +190,12 @@ msgid "" "Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a " "href=\"http://gnu.org/\">GNU</a> project" msgstr "" +"Drive av <a href=\"http://mediagoblin.org\">MediaGoblin</a>, eit <a " +"href=\"http://gnu.org/\">GNU</a>-prosjekt" #: mediagoblin/templates/mediagoblin/root.html:24 msgid "Explore" -msgstr "" +msgstr "Utforsk" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, media lover! MediaGoblin is..." @@ -220,8 +224,9 @@ msgid "" "Aiming to make the world a better place through decentralization and " "(eventually, coming soon!) federation!" msgstr "" -"Arbeidar for Ã¥ gjera verda ein betre stad gjennom desentralisering (til " -"slutt, kjem snart!) federering." +"Arbeidar for Ã¥ gjera verda ein betre stad gjennom desentralisering og (til " +"slutt, kjem snart!) federering, enkelt forklart deling og sending av " +"mediefiler og kommentarar over fleire nettstader." #: mediagoblin/templates/mediagoblin/root.html:33 msgid "" @@ -241,7 +246,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:38 msgid "Excited to join us?" -msgstr "" +msgstr "Lyst til Ã¥ bli med oss?" #: mediagoblin/templates/mediagoblin/root.html:39 #, python-format @@ -250,27 +255,33 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Opprett ein " +"gratis konto</a> eller <a class=\"header_submit\" " +"href=\"http://wiki.mediagoblin.org/HackingHowto\">installer MediaGoblin pÃ¥ " +"eigen tenar</a>" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" -msgstr "" +msgstr "Nyaste mediefiler" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" -msgstr "" +msgstr "Fyll inn passord" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" -msgstr "" +msgstr "Fyll inn brukarnamn eller epost" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +msgstr "Passordet endra. Prøv Ã¥ logga inn no." #: 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 "" +"Sjekk innboksen din. Me har sendt deg ein epost med ei netadresse for " +"passordendring." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -285,32 +296,39 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" +"Hei %(username)s,\n" +"\n" +"for Ã¥ endra MediaGoblin-passordet ditt, opna fylgjande URL i ein netlesar:\n" +"\n" +" <%(verification_url)s>\n" +"\n" +"Dersom du mistenkjer dette er eit misstak, ignorer eposten og hald fram med Ã¥ vera ein glad goblin!" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "Innlogging feila" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Har du ingen konto?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "Lag ein!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" -msgstr "" +msgstr "Gløymd passordet?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" -msgstr "" +msgstr "Endra" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Lag ein konto." -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Opprett" @@ -326,19 +344,19 @@ msgid "" msgstr "" "Hei %(username)s,\n" "\n" -"opna den følgjande adressa i netlesaren din for Ã¥ aktivera kontoen din:\n" +"opna fylgjande netadresse i netlesaren din for Ã¥ aktivera kontoen din:\n" "\n" "%(verification_url)s" #: mediagoblin/templates/mediagoblin/edit/edit.html:29 #, python-format msgid "Editing %(media_title)s" -msgstr "Redigerer %(media_title)s" +msgstr "Endrar %(media_title)s" #: mediagoblin/templates/mediagoblin/edit/edit.html:36 #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49 msgid "Cancel" -msgstr "Avbryt" +msgstr "Bryt av" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 @@ -348,7 +366,7 @@ msgstr "Lagra" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" -msgstr "Redigerar profilen til %(username)s" +msgstr "Endrar profilen til %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:31 msgid "Media tagged with:" @@ -358,14 +376,14 @@ msgstr "Merkelappar:" msgid "Submit yer media" msgstr "Last opp" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Send" #: 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> sin mediafiler" +msgstr "<a href=\"%(user_url)s\">%(username)s</a> sine mediefiler" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 #: mediagoblin/templates/mediagoblin/user_pages/user.html:32 @@ -375,11 +393,11 @@ msgstr "Fann ingen slik brukar" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" -msgstr "" +msgstr "Vil du verkeleg sletta %(title)s?" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 msgid "Delete Permanently" -msgstr "" +msgstr "Slett permament" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 msgid "Media processing panel" @@ -400,7 +418,7 @@ msgstr "Ingen media under handsaming" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 msgid "These uploads failed to process:" -msgstr "Klarte ikkje handsame desse opplasta filene:" +msgstr "Klarte ikkje handsama desse opplasta filene:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:39 #: mediagoblin/templates/mediagoblin/user_pages/user.html:59 @@ -460,21 +478,21 @@ msgstr "Brukaren har ikkje fylt ut profilen sin (enno)." #: mediagoblin/templates/mediagoblin/user_pages/user.html:122 #, python-format msgid "View all of %(username)s's media" -msgstr "SjÃ¥ all media frÃ¥ %(username)s" +msgstr "SjÃ¥ alle %(username)s sine mediefiler" #: 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 "Her kjem mediet ditt. Ser ikkje ut til at du har lagt til noko." +msgstr "Her kjem mediefilene dine. Ser ikkje ut til at du har lagt til noko." #: mediagoblin/templates/mediagoblin/user_pages/user.html:141 msgid "Add media" -msgstr "Legg til media" +msgstr "Legg til mediefiler" #: mediagoblin/templates/mediagoblin/user_pages/user.html:147 msgid "There doesn't seem to be any media here yet..." -msgstr "Ser ikkje ut til at det finst noko media her nett no." +msgstr "Ser ikkje ut til at det finst nokon mediefiler her nett no." #: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 msgid "feed icon" @@ -486,11 +504,11 @@ msgstr "Atom-kjelde" #: mediagoblin/templates/mediagoblin/utils/pagination.html:40 msgid "Newer" -msgstr "" +msgstr "Nyare" #: mediagoblin/templates/mediagoblin/utils/pagination.html:46 msgid "Older" -msgstr "" +msgstr "Eldre" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -498,10 +516,19 @@ msgstr "Innspel" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" +msgstr "Eg er sikker eg vil sletta dette" + +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" +"Du er i ferd med Ã¥ sletta ein annan brukar sine mediefiler. TrÃ¥ varsamt." diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo Binary files differindex 189733f6..31cb860c 100644 --- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po index 6d0195fe..047e598b 100644 --- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po @@ -4,12 +4,13 @@ # # Translators: # <snd.noise@gmail.com>, 2011. +# ufa <ufa@technotroll.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-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/mediagoblin/team/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -38,24 +39,25 @@ msgstr "Confirmar senha" #: mediagoblin/auth/forms.py:39 msgid "Type it again here to make sure there are no spelling mistakes." msgstr "" +"Digite novamente aqui para ter certeza que não houve erros de digitação" #: mediagoblin/auth/forms.py:42 msgid "Email address" msgstr "Endereço de email" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "Desculpa, o registro está desativado neste momento." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "Desculpe, um usuário com este nome já existe." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." -msgstr "" +msgstr "Desculpe, esse endereço de email já está em uso." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -63,64 +65,67 @@ 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:171 +#: mediagoblin/auth/views.py:185 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:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "O email de verificação foi reenviado." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +"Não foi possÃvel enviar o email de recuperação de senha, pois seu nome de " +"usuário está inativo ou o email da sua conta não foi confirmado." -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "TÃtulo" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" -msgstr "Tags" +msgstr "Etiquetas" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" -msgstr "" +msgstr "Arquivo" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" -msgstr "" +msgstr "O arquivo não pode estar vazio" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" +"A parte tÃtulo da URL dessa mÃdia. Geralmente não é necessário alterar isso." -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" -msgstr "Biográfia" +msgstr "Biografia" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Website" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." -msgstr "" +msgstr "Uma entrada com esse arquivo já existe para esse usuário" -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." -msgstr "" +msgstr "Você está editando a mÃdia de outro usuário. Tenha cuidado." -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." -msgstr "" +msgstr "Você está editando um perfil de usuário. Tenha cuidado." #: mediagoblin/process_media/errors.py:44 msgid "Invalid file given for media type." -msgstr "" +msgstr "Arquivo inválido para esse tipo de mÃdia" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -128,37 +133,39 @@ msgstr "Arquivo" #: mediagoblin/submit/forms.py:30 msgid "Description of this work" -msgstr "" +msgstr "Descrição desse trabalho" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Você deve fornecer um arquivo." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "O arquivo não parece ser uma imagem!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Eba! Enviado!" #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" -msgstr "" +msgstr "Oops" #: mediagoblin/templates/mediagoblin/404.html:24 msgid "There doesn't seem to be a page at this address. Sorry!" -msgstr "" +msgstr "Aparentemente não existe uma página com esse endereço. Desculpe!" #: 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 você está certo de que o endereço está correto, talvez a página que " +"esteja procurando tenha sido apagada ou mudou de endereço" #: mediagoblin/templates/mediagoblin/404.html:32 msgid "Image of 404 goblin stressing out" -msgstr "" +msgstr "Imagem do goblin 404 aparecendo" #: mediagoblin/templates/mediagoblin/base.html:22 msgid "GNU MediaGoblin" @@ -166,7 +173,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" @@ -177,8 +184,8 @@ msgid "verify your email!" msgstr "Verifique seu email!" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Entrar" @@ -187,42 +194,52 @@ msgid "" "Powered by <a href=\"http://mediagoblin.org\">MediaGoblin</a>, a <a " "href=\"http://gnu.org/\">GNU</a> project" msgstr "" +"Desenvolvido por <a href=\"http://mediagoblin.org\">MediaGoblin</a>, um " +"projeto <a href=\"http://gnu.org/\">GNU</a>" #: mediagoblin/templates/mediagoblin/root.html:24 msgid "Explore" -msgstr "" +msgstr "Explorar" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, media lover! MediaGoblin is..." -msgstr "" +msgstr "Olá amante de mÃdias. MediaGoblin é..." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "The perfect place for your media!" -msgstr "" +msgstr "O lugar perfeito para sua mÃdia!" #: mediagoblin/templates/mediagoblin/root.html:30 msgid "" "A place for people to collaborate and show off original and derived " "creations!" msgstr "" +"Um lugar para as pessoas colaborarem e mostrarem suas criações originais e " +"derivadas!" #: mediagoblin/templates/mediagoblin/root.html:31 msgid "" "Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, " "after all.)" msgstr "" +"Livre como a liberdade. (Afinal, somos um projeto <a " +"href=\"http://gnu.org\">GNU</a>)" #: mediagoblin/templates/mediagoblin/root.html:32 msgid "" "Aiming to make the world a better place through decentralization and " "(eventually, coming soon!) federation!" msgstr "" +"Com o objetivo de fazer um mundo melhor através da descentralização e " +"(eventualmente, em breve) federação!" #: mediagoblin/templates/mediagoblin/root.html:33 msgid "" "Built for extensibility. (Multiple media types coming soon to the software," " including video support!)" msgstr "" +"ConstruÃdo para extensibilidade. (Múltiplos tipos de mÃdia em breve, " +"incluindo suporte a vÃdeo) " #: mediagoblin/templates/mediagoblin/root.html:34 msgid "" @@ -230,10 +247,13 @@ msgid "" "href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this" " software!</a>)" msgstr "" +"Desenvolvido por pessoas como você. (<a " +"href=\"http://mediagoblin.org/pages/join.html\">Você pode ajudar a melhorar " +"esse software</a>)" #: mediagoblin/templates/mediagoblin/root.html:38 msgid "Excited to join us?" -msgstr "" +msgstr "Animado para juntar-se a nós?" #: mediagoblin/templates/mediagoblin/root.html:39 #, python-format @@ -242,27 +262,32 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\"> Crie uma conta grátis </a>\n" +" ou <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Configure seu próprio servidor MediaGoblin</a>\n" +" " #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" -msgstr "" +msgstr "MÃdia mais recente" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" -msgstr "" +msgstr "Digite sua nova senha" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" -msgstr "" +msgstr "Digite seu nome de usuário ou email" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +msgstr "Sua senha foi alterada. Tente entrar agora." #: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22 msgid "" "Check your inbox. We sent an email with a URL for changing your password." msgstr "" +"Verifique sua caixa de entrada. Mandamos um email com a URL para troca da " +"senha" #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -277,34 +302,42 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" +"Olá %(username)s,\n" +"\n" +"para alterar sua senha do GNU MediaGoblin, abra a seguinte URL\n" +"no seu navegador web:\n" +"\n" +"%(verification_url)s\n" +"\n" +"Se você acha que isso é um erro, desconsidere esse email e continue sendo um goblin feliz" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" -msgstr "" +msgstr "Autenticação falhou" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Ainda não tem conta?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "Crie uma aqui!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" -msgstr "" +msgstr "Esqueceu sua senha?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" -msgstr "" +msgstr "Altere-a" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Criar uma conta!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" -msgstr "" +msgstr "Criar" #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format @@ -344,69 +377,70 @@ msgstr "Editando perfil de %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:31 msgid "Media tagged with:" -msgstr "" +msgstr "MÃdia marcada como:" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" msgstr "Envie sua mÃdia" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Enviar" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 #, python-format msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media" -msgstr "" +msgstr "MÃdia de <a href=\"%(user_url)s\"> %(username)s </a> " #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 #: mediagoblin/templates/mediagoblin/user_pages/user.html:32 msgid "Sorry, no such user found." -msgstr "Desculpe, tal usuário não encontrado." +msgstr "Desculpe, esse usuário não foi encontrado." #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" -msgstr "" +msgstr "Realmente apagar %(title)s ?" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 msgid "Delete Permanently" -msgstr "" +msgstr "Apagar permanentemente" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 msgid "Media processing panel" -msgstr "" +msgstr "Painel de processamento de mÃdia" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25 msgid "" "You can track the state of media being processed for your gallery here." msgstr "" +"Você pode verificar como a mÃdia esta sendo processada para sua galeria aqui" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 msgid "Media in-processing" -msgstr "" +msgstr "MÃdia em processo" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46 msgid "No media in-processing" -msgstr "" +msgstr "Nenhuma mÃdia em processo" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 msgid "These uploads failed to process:" -msgstr "" +msgstr "Esses envios não foram processados:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:39 #: mediagoblin/templates/mediagoblin/user_pages/user.html:59 msgid "Email verification needed" -msgstr "" +msgstr "Verificação de email necessária" #: mediagoblin/templates/mediagoblin/user_pages/user.html:42 msgid "Almost done! Your account still needs to be activated." -msgstr "" +msgstr "Quase pronto! Sua conta ainda precisa ser ativada" #: 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 "Receberá um email com instruções de como fazer." +msgstr "Um email deve chegar em instantes com instruções de como fazê-lo." #: mediagoblin/templates/mediagoblin/user_pages/user.html:51 msgid "In case it doesn't:" @@ -421,6 +455,8 @@ msgid "" "Someone has registered an account with this username, but it still has to be" " activated." msgstr "" +"Alguém registrou uma conta com esse nome de usuário, mas ainda precisa ser " +"ativada." #: mediagoblin/templates/mediagoblin/user_pages/user.html:68 #, python-format @@ -438,7 +474,7 @@ msgstr "Perfil de %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/user.html:85 msgid "Here's a spot to tell others about yourself." -msgstr "" +msgstr "Aqui é o lugar onde você fala de si para os outros." #: mediagoblin/templates/mediagoblin/user_pages/user.html:90 #: mediagoblin/templates/mediagoblin/user_pages/user.html:108 @@ -447,53 +483,63 @@ msgstr "Editar perfil" #: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "This user hasn't filled in their profile (yet)." -msgstr "" +msgstr "Esse usuário não preencheu seu perfil (ainda)." #: mediagoblin/templates/mediagoblin/user_pages/user.html:122 #, python-format msgid "View all of %(username)s's media" -msgstr "" +msgstr "Ver todas as mÃdias 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 "" +"Aqui é onde sua mÃdia vai aparecer, mas parece que você não adicionou nada " +"ainda." #: mediagoblin/templates/mediagoblin/user_pages/user.html:141 msgid "Add media" -msgstr "" +msgstr "Adicionar mÃdia" #: mediagoblin/templates/mediagoblin/user_pages/user.html:147 msgid "There doesn't seem to be any media here yet..." -msgstr "" +msgstr "Aparentemente não há nenhuma mÃdia aqui ainda..." #: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 msgid "feed icon" -msgstr "" +msgstr "Ãcone feed" #: mediagoblin/templates/mediagoblin/utils/feed_link.html:23 msgid "Atom feed" -msgstr "" +msgstr "Atom feed" #: mediagoblin/templates/mediagoblin/utils/pagination.html:40 msgid "Newer" -msgstr "" +msgstr "Mais novo" #: mediagoblin/templates/mediagoblin/utils/pagination.html:46 msgid "Older" -msgstr "" +msgstr "Mais velho" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" -msgstr "" +msgstr "Comentário" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" +msgstr "Eu tenho certeza de que quero pagar isso" + +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:175 -msgid "You are about to delete another user's media. Proceed with caution." +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" msgstr "" +#: mediagoblin/user_pages/views.py:181 +msgid "You are about to delete another user's media. Proceed with caution." +msgstr "Você vai apagar uma mÃdia de outro usuário. Tenha cuidado." + diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo Binary files differindex f43e25f6..2ab9cf8b 100644 --- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po index 2d2ce467..01fe5c48 100644 --- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" -"Last-Translator: cwebber <cwebber@dustycloud.org>\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 20:49+0000\n" +"Last-Translator: gap <gapop@hotmail.com>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,19 +43,19 @@ msgstr "Introdu parola din nou pentru verificare." msgid "Email address" msgstr "Adresa de e-mail" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "Ne pare rău, dar înscrierile sunt dezactivate pe acest server." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 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:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Ne pare rău, această adresă de e-mail este deja rezervată." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -63,15 +63,15 @@ msgstr "" "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:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "Cheie de verificare sau user ID incorect." -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "E-mail-ul de verificare a fost retrimis." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -79,47 +79,47 @@ 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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titlu" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Etichete" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "Identificator" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "Identificatorul nu poate să lipsească" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 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 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Biografie" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Sit Web" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 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:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." msgstr "Editezi fiÈ™ierul unui alt utilizator. Se recomandă prudență." -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "Editezi profilul unui utilizator. Se recomandă prudență." @@ -135,15 +135,15 @@ msgstr "FiÈ™ier" msgid "Description of this work" msgstr "Descrierea acestui fiÈ™ier" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Trebuie să selectezi un fiÈ™ier." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "FiÈ™ierul nu pare a fi o imagine!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Gata, trimis!" @@ -160,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ă eÈ™ti sigur că adresa este corectă, poate că pagina pe care o cauÈ›i a " -"fost mutată sau È™tearsă." +"Dacă eÈ™ti sigur că adresa e corectă, poate că pagina pe care o cauÈ›i a fost " +"mutată sau È™tearsă." #: mediagoblin/templates/mediagoblin/404.html:32 msgid "Image of 404 goblin stressing out" @@ -184,8 +184,8 @@ msgid "verify your email!" msgstr "verifică e-mail-ul!" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Autentificare" @@ -261,27 +261,32 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Creează gratuit un cont</a>\n" +" sau\n" +" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">instalează MediaGoblin pe serverul tău</a>" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" msgstr "Cele mai recente fiÈ™iere" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "Introdu noua parolă" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "Introdu numele de utilizator sau adresa de e-mail" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +msgstr "Parola a fost schimbată. ÃŽncearcă să te autentifici acum." #: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22 msgid "" "Check your inbox. We sent an email with a URL for changing your password." msgstr "" +"Verifică-È›i căsuÈ›a de e-mail. Èši-am trimis un mesaj cu link-ul pentru " +"schimbarea parolei." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -298,29 +303,29 @@ msgid "" msgstr "" "Bună, %(username)s\n" "\n" -"Pentru a modifica parola ta la GNU MediaGoblin, accesează adresa următoare:\n" +"Pentru a schimba 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 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "Autentificare eÈ™uată!" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Nu ai un cont?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "Creează-l aici!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "Ai uitat parola?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "Schimb-o!" @@ -328,7 +333,7 @@ msgstr "Schimb-o!" msgid "Create an account!" msgstr "Creează un cont!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Creează" @@ -376,7 +381,7 @@ msgstr "Etichete:" msgid "Submit yer media" msgstr "Trimite fiÈ™ierele tale media" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Trimite" @@ -432,11 +437,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 "Vei primi în scurt timp un mesaj prin e-mail cu instrucÈ›iuni." +msgstr "Vei primi în scurt timp un e-mail cu instrucÈ›iuni." #: mediagoblin/templates/mediagoblin/user_pages/user.html:51 msgid "In case it doesn't:" -msgstr "Dacă nu primeÈ™ti mesajul:" +msgstr "Dacă nu-l primeÈ™ti:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:54 msgid "Resend verification email" @@ -522,7 +527,15 @@ msgstr "Scrie un comentariu" msgid "I am sure I want to delete this" msgstr "Sunt sigur că doresc să È™terg" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "Comentariul trebuie să aibă un conÈ›inut." + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "Comentariul a fost transmis." + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" "Urmează să È™tergi fiÈ™ierele media ale unui alt utilizator. Se recomandă " diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo Binary files differindex c1eab2ba..4b5481e0 100644 --- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po index ffdeab2e..f4bfbd67 100644 --- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" -"Last-Translator: cwebber <cwebber@dustycloud.org>\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-04 11:13+0000\n" +"Last-Translator: aleksejrs <deletesoftware@yandex.ru>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -43,19 +43,19 @@ msgstr "Ðаберите его ещё раз здеÑÑŒ, чтобы избежРmsgid "Email address" msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "Извините, на Ñтом разделе региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð°." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "Извините, пользователь Ñ Ñтим именем уже зарегиÑтрирован." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Извините, Ñтот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты уже занÑÑ‚." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -63,61 +63,64 @@ msgstr "" "ÐÐ´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ¹ Ñлектронной потвержден. Ð’Ñ‹ теперь можете войти и начать " "редактировать Ñвой профиль и загружать новые изображениÑ!" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "Ðеверный ключ проверки или идентификатор пользователÑ" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "ПереÑлать Ñообщение Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼ аккаунта." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Ðазвание" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Метки" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñть адреÑа" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‡Ð°Ñть адреÑа необходима" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" "ЧаÑть адреÑа Ñтого файла, Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð½Ð°Ñ Ð¾Ñ‚ его названиÑ. Её обычно не нужно " "изменÑть." -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "БиографиÑ" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Сайт" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." msgstr "" "У Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑƒÐ¶Ðµ еÑть файл Ñ Ñ‚Ð°ÐºÐ¾Ð¹ отличительной чаÑтью адреÑа." -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." msgstr "Ð’Ñ‹ редактируете файлы другого пользователÑ. Будьте оÑторожны." -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "Ð’Ñ‹ редактируете профиль пользователÑ. Будьте оÑторожны." @@ -133,15 +136,15 @@ msgstr "Файл" msgid "Description of this work" msgstr "ОпиÑание Ñтого произведениÑ" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Ð’Ñ‹ должны загрузить файл." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "Файл, похоже, не ÑвлÑетÑÑ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¾Ð¹!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Ура! Файл загружен!" @@ -180,8 +183,8 @@ msgid "verify your email!" msgstr "подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты!" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Войти" @@ -190,6 +193,8 @@ 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" @@ -259,11 +264,11 @@ msgstr "" msgid "Most recent media" msgstr "Самые новые файлы" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "Введите Ñвой новый пароль" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "Введите Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" @@ -290,23 +295,23 @@ msgid "" "a happy goblin!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½ÐµÑƒÑпешна!" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Ещё нету аккаунта?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "Создайте здеÑÑŒ!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "Забыли Ñвой пароль?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "Смените его!" @@ -314,7 +319,7 @@ msgstr "Смените его!" msgid "Create an account!" msgstr "Создать аккаунт!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Создать" @@ -362,7 +367,7 @@ msgstr "Файлы Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹:" msgid "Submit yer media" msgstr "Загрузить файл(Ñ‹)" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Подтвердить" @@ -429,7 +434,8 @@ msgstr "РеÑли нет, то:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:54 msgid "Resend verification email" -msgstr "Повторно отправить подверждение на Ð°Ð´Ñ€ÐµÑ Ñлектронной почты" +msgstr "" +"Повторно отправить Ñообщение Ð´Ð»Ñ Ð¿Ð¾Ð´Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты" #: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "" @@ -507,7 +513,15 @@ msgstr "Комментарий" msgid "I am sure I want to delete this" msgstr "Я уверен, что хочу удалить Ñто" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "Empty comments are not allowed." + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "Ð’Ñ‹ на пороге ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° другого пользователÑ. Будьте оÑторожны." diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo Binary files differnew file mode 100644 index 00000000..684c850a --- /dev/null +++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..d3196b9c --- /dev/null +++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,541 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +# Translators: +# <zatroch.martin@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-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+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: sk\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" + +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +msgid "Username" +msgstr "Prihlasovacie meno" + +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +msgid "Password" +msgstr "Heslo" + +#: mediagoblin/auth/forms.py:35 +msgid "Passwords must match." +msgstr "Heslá sa musia zhodovaÅ¥." + +#: mediagoblin/auth/forms.py:37 +msgid "Confirm password" +msgstr "PotvrdiÅ¥ heslo" + +#: mediagoblin/auth/forms.py:39 +msgid "Type it again here to make sure there are no spelling mistakes." +msgstr "PrepÃÅ¡ ho sem opätovne kvôli uisteniu, že nedoÅ¡lo k preklepu." + +#: mediagoblin/auth/forms.py:42 +msgid "Email address" +msgstr "E-mailová adresa" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, registration is disabled on this instance." +msgstr "PrepáÄ, registrácia na tejto inÅ¡tancii nie je povolená." + +#: mediagoblin/auth/views.py:73 +msgid "Sorry, a user with that name already exists." +msgstr "PrepáÄ, rovnaké prihlasovacie meno už niekto použÃva." + +#: mediagoblin/auth/views.py:77 +msgid "Sorry, that email address has already been taken." +msgstr "PrepáÄ, daná e-mailová adresa už bola pri registrácii využitá." + +#: mediagoblin/auth/views.py:179 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" +"Tvoja e-mailová adresa bola úspeÅ¡ne overená. MôžeÅ¡ sa hneÄ prihlásiÅ¥, " +"upraviÅ¥ svoj profil a vkladaÅ¥ výtvory! " + +#: mediagoblin/auth/views.py:185 +msgid "The verification key or user id is incorrect" +msgstr "Nesprávny overovacà kÄ¾ÃºÄ alebo použÃvateľské ID" + +#: mediagoblin/auth/views.py:207 +msgid "Resent your verification email." +msgstr "Opätovne zaslaÅ¥ overovaciu správu." + +#: mediagoblin/auth/views.py:248 +msgid "" +"Could not send password recovery email as your username is inactive or your " +"account's email address has not been verified." +msgstr "" +"Nebolo ti možné zaslaÅ¥ správu ohľadom obnovy hesla, nakoľko je tvoje " +"použÃvateľské meno buÄ neaktÃvne alebo e-mailová adresa úÄtu neoverená." + +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 +msgid "Title" +msgstr "Nadpis" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +msgid "Tags" +msgstr "Å tÃtky" + +#: mediagoblin/edit/forms.py:31 +msgid "Slug" +msgstr "Unikátna ÄasÅ¥ adresy" + +#: mediagoblin/edit/forms.py:32 +msgid "The slug can't be empty" +msgstr "Unikátna ÄasÅ¥ adresy musà byÅ¥ vyplnená" + +#: mediagoblin/edit/forms.py:33 +msgid "" +"The title part of this media's URL. You usually don't need to change this." +msgstr "Titulná ÄasÅ¥ URL odkazu média. ZvyÄajne to meniÅ¥ nemusÃÅ¡." + +#: mediagoblin/edit/forms.py:40 +msgid "Bio" +msgstr "Bio" + +#: mediagoblin/edit/forms.py:43 +msgid "Website" +msgstr "Webstránka" + +#: mediagoblin/edit/views.py:64 +msgid "An entry with that slug already exists for this user." +msgstr "Položku s rovnakou unikátnou ÄasÅ¥ou adresy už niekde máš." + +#: mediagoblin/edit/views.py:85 +msgid "You are editing another user's media. Proceed with caution." +msgstr "UpravujeÅ¡ médiá niekoho iného. Pristupuj opatrne." + +#: mediagoblin/edit/views.py:155 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "UpravujeÅ¡ použÃvateľský profil. Pristupuj opatrne." + +#: mediagoblin/process_media/errors.py:44 +msgid "Invalid file given for media type." +msgstr "Odovzdaný nesprávny súbor pre daný typ média." + +#: mediagoblin/submit/forms.py:25 +msgid "File" +msgstr "Súbor" + +#: mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Charakteristika diela" + +#: mediagoblin/submit/views.py:46 +msgid "You must provide a file." +msgstr "Poskytni súbor." + +#: mediagoblin/submit/views.py:49 +msgid "The file doesn't seem to be an image!" +msgstr "Súbor najskôr nie je obrázkom!" + +#: mediagoblin/submit/views.py:121 +msgid "Woohoo! Submitted!" +msgstr "Juchú! ÚspeÅ¡ne vložené!" + +#: mediagoblin/templates/mediagoblin/404.html:21 +msgid "Oops!" +msgstr "Ajaj!" + +#: mediagoblin/templates/mediagoblin/404.html:24 +msgid "There doesn't seem to be a page at this address. Sorry!" +msgstr "Na danej adrese sa stránka zrejme nenachádza. PrepáÄ!" + +#: 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 "" +"Ak vieÅ¡ s istotou, že adresa je správna, tak najskôr bola hľadaná stánka " +"presunutá alebo zmazaná." + +#: mediagoblin/templates/mediagoblin/404.html:32 +msgid "Image of 404 goblin stressing out" +msgstr "Obrázok stresujúceho goblina pri chybovom kóde Ä. 404" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "GNU MediaGoblin" + +#: mediagoblin/templates/mediagoblin/base.html:47 +msgid "MediaGoblin logo" +msgstr "MediaGoblin logo" + +#: mediagoblin/templates/mediagoblin/base.html:52 +msgid "Submit media" +msgstr "VložiÅ¥ výtvor" + +#: mediagoblin/templates/mediagoblin/base.html:63 +msgid "verify your email!" +msgstr "over si svoj e-mail!" + +#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 +msgid "Log in" +msgstr "Prihlásenie" + +#: 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 "" +"Poháňa nás <a href=\"http://mediagoblin.org\">MediaGoblin</a>, súÄasÅ¥ " +"projektu <a href=\"http://gnu.org/\">GNU</a>" + +#: mediagoblin/templates/mediagoblin/root.html:24 +msgid "Explore" +msgstr "PreskúmaÅ¥" + +#: mediagoblin/templates/mediagoblin/root.html:27 +msgid "Hi there, media lover! MediaGoblin is..." +msgstr "Vitaj medzi nami, kreatÃvne stvorenie! MediaGoblin je..." + +#: mediagoblin/templates/mediagoblin/root.html:29 +msgid "The perfect place for your media!" +msgstr "Parádne miesto pre tvoje výtvory!" + +#: mediagoblin/templates/mediagoblin/root.html:30 +msgid "" +"A place for people to collaborate and show off original and derived " +"creations!" +msgstr "" +"Miesto pre ľudÃ, vhodné na spoluprácu a vystavovanie tak originálnych, ako " +"aj odvodených kreáciÃ!" + +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "" +"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, " +"after all.)" +msgstr "" +"Voľné, vo význame slobody. (Koniec-koncov, sme predsa <a " +"href=\"http://gnu.org\">GNU</a> projekt.)" + +#: mediagoblin/templates/mediagoblin/root.html:32 +msgid "" +"Aiming to make the world a better place through decentralization and " +"(eventually, coming soon!) federation!" +msgstr "" +"Zo snahou spraviÅ¥ svet lepÅ¡Ãm miestom vÄaka decentralizácii a (eventuálne, " +"už Äoskoro!) federácii!" + +#: mediagoblin/templates/mediagoblin/root.html:33 +msgid "" +"Built for extensibility. (Multiple media types coming soon to the software," +" including video support!)" +msgstr "" +"S dôrazom na rozÅ¡ÃriteľnosÅ¥. (Podpora pre rozliÄné typy médià v tomto " +"softvéri už Äoskoro, nevynÃmajúc videá!)" + +#: mediagoblin/templates/mediagoblin/root.html:34 +msgid "" +"Powered by people like you. (<a " +"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this" +" software!</a>)" +msgstr "" +"Existujeme aj vÄaka ľudom ako si ty. (<a " +"href=\"http://mediagoblin.org/pages/join.html\">MôžeÅ¡ nám pomôcÅ¥ softvér " +"vylepÅ¡iÅ¥!</a>)" + +#: mediagoblin/templates/mediagoblin/root.html:38 +msgid "Excited to join us?" +msgstr "Tak Äo, chceÅ¡ sa pridaÅ¥?" + +#: 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 "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">VytvoriÅ¥ bezplatný úÄet</a>\n" +" alebo\n" +" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">SprevádzkovaÅ¥ MediaGoblin na vlastnom serveri</a>" + +#: mediagoblin/templates/mediagoblin/root.html:53 +msgid "Most recent media" +msgstr "NajÄerstvejÅ¡ie výtvory" + +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 +msgid "Enter your new password" +msgstr "Vlož svoje nové heslo" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 +msgid "Enter your username or email" +msgstr "Vlož svoje použÃvateľské meno alebo e-mailovú adresu" + +#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 +msgid "Your password has been changed. Try to log in now." +msgstr "Heslo ti bolo zmenené. Skús sa prihlásiÅ¥ teraz." + +#: mediagoblin/templates/mediagoblin/auth/fp_email_sent.html:22 +msgid "" +"Check your inbox. We sent an email with a URL for changing your password." +msgstr "" +"Skontroluj si e-mailovú schránku. Bol ti zaslaná správa s URL odkazom pre " +"zmenu tvojho hesla." + +#: mediagoblin/templates/mediagoblin/auth/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 "" +"Ahoj %(username)s,\n" +"\n" +"pre zmenu svojho hesla k GNU MediaGoblin úÄtu, otvor nasledujúci URL odkaz vo \n" +"svojom prehliadaÄi:\n" +"\n" +"%(verification_url)s\n" +"\n" +"Pokiaľ si myslÃÅ¡, že doÅ¡lo k omylu, tak jednoducho ignoruj túto správu a neprestávaj byÅ¥ šťastným goblinom!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:30 +msgid "Logging in failed!" +msgstr "Prihlásenie zlyhalo!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:43 +msgid "Don't have an account yet?" +msgstr "EÅ¡te nemáš úÄet?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:46 +msgid "Create one here!" +msgstr "VytvoriÅ¥ jeden tu!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:49 +msgid "Forgot your password?" +msgstr "Zabudnuté heslo?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:52 +msgid "Change it!" +msgstr "ZmeniÅ¥ ho!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "VytvoriÅ¥ úÄet!" + +#: mediagoblin/templates/mediagoblin/auth/register.html:31 +msgid "Create" +msgstr "VytvoriÅ¥" + +#: 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 "" +"Ahoj %(username)s,\n" +"\n" +"pre aktiváciu tvojho GNU MediaGoblin úÄtu, otvor nasledujúci URL odkaz vo\n" +"svojom prehliadaÄi:\n" +"\n" +"%(verification_url)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "Úprava %(media_title)s" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49 +msgid "Cancel" +msgstr "ZruÅ¡iÅ¥" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +msgid "Save changes" +msgstr "UložiÅ¥ zmeny" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "Úprava profilu, ktorý vlastnà %(username)s" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:31 +msgid "Media tagged with:" +msgstr "Výtvor znaÄený Å¡tÃtkami:" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "Vlož svoj výtvor" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "VložiÅ¥" + +#: 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\">Výtvory, ktoré vlastnà %(username)s</a>" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 +msgid "Sorry, no such user found." +msgstr "PrepáÄ, použÃvateľské meno nenájdené." + +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 +#, python-format +msgid "Really delete %(title)s?" +msgstr "SkutoÄne odstrániÅ¥ %(title)s?" + +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 +msgid "Delete Permanently" +msgstr "OdstrániÅ¥ navždy" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 +msgid "Media processing panel" +msgstr "Sekcia spracovania médiÃ" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25 +msgid "" +"You can track the state of media being processed for your gallery here." +msgstr "Tu môžeÅ¡ sledovaÅ¥ priebeh spracovania médià pre svoju galériu." + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 +msgid "Media in-processing" +msgstr "Médiá v procese spracovania" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46 +msgid "No media in-processing" +msgstr "Žiadne médiá v procese spracovania" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 +msgid "These uploads failed to process:" +msgstr "Nasledovné vloženia nepreÅ¡li spracovanÃm:" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +msgid "Email verification needed" +msgstr "Potrebné overenie e-mailovej adresy" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +msgid "Almost done! Your account still needs to be activated." +msgstr "Takmer hotovo! EÅ¡te ti musà byÅ¥ aktivovaný úÄet." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +msgid "" +"An email should arrive in a few moments with instructions on how to do so." +msgstr "E-mailová správa s popisom ako to spraviÅ¥, by mala onedlho doraziÅ¥." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +msgid "In case it doesn't:" +msgstr "V prÃpade, že sa tak nestalo:" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +msgid "Resend verification email" +msgstr "Opätovne zaslaÅ¥ overovaciu správu" + +#: 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 "" +"ÚÄet s týmto prihlasovacÃm menom je už registrovaný, avÅ¡ak eÅ¡te stále " +"neaktÃvny." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#, python-format +msgid "" +"If you are that person but you've lost your verification email, you can <a " +"href=\"%(login_url)s\">log in</a> and resend it." +msgstr "" +"Pokiaľ si to ty, ale už nemáš overovaciu správu, tak sa môžeÅ¡ <a " +"href=\"%(login_url)s\">prihlásiÅ¥</a> a preposlaÅ¥ si ju." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 +#, python-format +msgid "%(username)s's profile" +msgstr "Profil, ktorý vlastnà %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +msgid "Here's a spot to tell others about yourself." +msgstr "Povedz tu o sebe ostatným." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +msgid "Edit profile" +msgstr "UpraviÅ¥ profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +msgid "This user hasn't filled in their profile (yet)." +msgstr "DotyÄná osoba eÅ¡te nevyplnila svoj profil (zatiaľ)." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#, python-format +msgid "View all of %(username)s's media" +msgstr "ZhliadnuÅ¥ vÅ¡etky výtvory, ktoré vlastnà %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +msgid "" +"This is where your media will appear, but you don't seem to have added " +"anything yet." +msgstr "" +"VÅ¡etky tvoje výtvory sa objavia práve tu, ale zatiaľ nemáš niÄ pridané." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +msgid "Add media" +msgstr "PridaÅ¥ výtvor" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +msgid "There doesn't seem to be any media here yet..." +msgstr "Najskôr tu eÅ¡te nebudú žiadne výtvory..." + +#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 +msgid "feed icon" +msgstr "ikona ÄÃtaÄky" + +#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23 +msgid "Atom feed" +msgstr "ÄŒÃtaÄka Atom" + +#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 +msgid "Newer" +msgstr "NovÅ¡ie" + +#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 +msgid "Older" +msgstr "StarÅ¡ie" + +#: mediagoblin/user_pages/forms.py:24 +msgid "Comment" +msgstr "Komentár" + +#: mediagoblin/user_pages/forms.py:30 +msgid "I am sure I want to delete this" +msgstr "JednoznaÄne to chcem odstrániÅ¥" + +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 +msgid "You are about to delete another user's media. Proceed with caution." +msgstr "Chystáš sa odstrániÅ¥ výtvory niekoho iného. Pristupuj opatrne." + + diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo Binary files differindex 4c433381..52e3d632 100644 --- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po index 39c6b9a5..cba4fdd0 100644 --- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" @@ -43,19 +43,19 @@ msgstr "" msgid "Email address" msgstr "E-poÅ¡tni naslov" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "Oprostite, prijava za ta izvod ni omogoÄena." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "Oprostite, uporabnik s tem imenom že obstaja." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Oprostite, ta e-poÅ¡tni naslov je že v uporabi." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -63,58 +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:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "Potrditveni kljuÄ ali uporabniÅ¡ka identifikacija je napaÄna" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "Ponovno poÅ¡iljanje potrditvene e-poÅ¡te." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Naslov" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Oznake" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "Oznaka" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "Oznaka ne sme biti prazna" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Biografija" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Spletna stran" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 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:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." msgstr "Urejate vsebino drugega uporabnika. Nadaljujte pazljivo." -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "Urejate uporabniÅ¡ki profil. Nadaljujte pazljivo." @@ -130,15 +130,15 @@ msgstr "Datoteka" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Podati morate datoteko." -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "Kot kaže datoteka ni slika." -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Juhej! Poslano." @@ -179,8 +179,8 @@ msgid "verify your email!" msgstr "Preverite svojo e-poÅ¡to." #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Prijava" @@ -258,11 +258,11 @@ msgstr "" msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "" @@ -289,23 +289,23 @@ msgid "" "a happy goblin!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "Prijava ni uspela." -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "Å e nimate raÄuna?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "Ustvarite si ga." -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "" @@ -313,7 +313,7 @@ msgstr "" msgid "Create an account!" msgstr "Ustvarite raÄun." -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Ustvari" @@ -362,7 +362,7 @@ msgstr "Vsebina oznaÄena z:" msgid "Submit yer media" msgstr "PoÅ¡ljite svojo vsebino" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "PoÅ¡lji" @@ -506,7 +506,15 @@ msgstr "Komentar" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo Binary files differindex 3c5d864b..d2649938 100644 --- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po index 8f2373c8..b4b2fb7b 100644 --- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\n" "MIME-Version: 1.0\n" @@ -42,76 +42,76 @@ msgstr "" msgid "Email address" msgstr "" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "" -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "" -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "" -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 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 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "" @@ -127,15 +127,15 @@ msgstr "" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "" @@ -174,8 +174,8 @@ msgid "verify your email!" msgstr "" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "" @@ -244,11 +244,11 @@ msgstr "" msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" msgstr "" @@ -275,23 +275,23 @@ msgid "" "a happy goblin!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" msgstr "" @@ -299,7 +299,7 @@ msgstr "" msgid "Create an account!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "" @@ -342,7 +342,7 @@ msgstr "" msgid "Submit yer media" msgstr "" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "" @@ -482,7 +482,15 @@ msgstr "" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo Binary files differindex 2cdf2fee..2ae7c510 100644 --- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po index 08a4bc15..3ee44b18 100644 --- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PROJECT project. # # Translators: +# <simon@ingenmansland.se>, 2011. # <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-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n" "MIME-Version: 1.0\n" @@ -43,19 +44,19 @@ msgstr "Skriv in det igen för att undvika stavfel." msgid "Email address" msgstr "E-postadress" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "Vi beklagar, registreringen är avtängd pÃ¥ den här instansen." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "En användare med det användarnamnet finns redan." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "Den e-postadressen är redan tagen." -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -63,58 +64,60 @@ msgstr "" "Din e-postadress är verifierad. Du kan nu logga in, redigera din profil och " "ladda upp filer!" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "Verifieringsnyckeln eller användar-IDt är fel." -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "Skickade ett nytt verifierings-email." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +"Kunde inte skicka e-postÃ¥terställning av lösenord eftersom ditt användarnamn" +" är inaktivt eller kontots e-postadress har inte verifierats." -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titel" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "Taggar" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "Sökvägsnamn" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "Sökvägsnamnet kan inte vara tomt" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 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 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "Presentation" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "Hemsida" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 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:84 +#: mediagoblin/edit/views.py:85 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:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "Var försiktig, du redigerar en annan användares profil." @@ -130,15 +133,15 @@ msgstr "Fil" msgid "Description of this work" msgstr "Beskrivning av verket" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "Du mÃ¥ste ange en fil" -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "Filen verkar inte vara en giltig bildfil!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "Tjohoo! Upladdat!" @@ -179,8 +182,8 @@ msgid "verify your email!" msgstr "Verifiera din e-postadress!" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "Logga in" @@ -194,7 +197,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:24 msgid "Explore" -msgstr "" +msgstr "Utforska" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, media lover! MediaGoblin is..." @@ -251,7 +254,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:38 msgid "Excited to join us?" -msgstr "" +msgstr "Nyfiken att gÃ¥ med oss?" #: mediagoblin/templates/mediagoblin/root.html:39 #, python-format @@ -260,27 +263,33 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Skapa ett konto gratis</a>\n" +"\n" +" or\n" +" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Installera MediaGoblin pÃ¥ din egen server</a>" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" -msgstr "" +msgstr "Senast medier" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" -msgstr "" +msgstr "Fyll i ditt lösenord" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" -msgstr "" +msgstr "Fyll i ditt användarnamn eller lösenord" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +msgstr "Ditt lösenord är nu ändrat. Testa att logga in nu." #: 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 "" +"Kolla din inkorg. Vi har skickat ett e-postmeddelande med en webbadress för " +"att ändra ditt lösenord." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -295,32 +304,40 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" +"Hej %(username)s,\n" +"\n" +"för att ändra ditt GNU MediaGoblin-lösenord, öppna följande länk i\n" +"din webbläsare:\n" +"\n" +"%(verification_url)s\n" +"\n" +"Om du misstänker att du fÃ¥tt detta epostmeddelanade av misstag, ignorera det och fortsätt vara ett glatt troll!" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "Inloggning misslyckades!" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" -msgstr "Har du inget konto?" +msgstr "Har du inget konto än?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" -msgstr "Skapa ett!" +msgstr "Skapa ett här!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" -msgstr "" +msgstr "Glömt ditt lösenord?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" -msgstr "" +msgstr "Ändra!" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Skapa ett konto!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "Skapa" @@ -336,7 +353,7 @@ msgid "" msgstr "" "Hej %(username)s,\n" "\n" -"oppna den följande URLen i din webbläsare för att aktivera ditt konto pÃ¥ GNU MediaGoblin:\n" +"öppna den följande webbadressen i din webbläsare för att aktivera ditt konto pÃ¥ GNU MediaGoblin:\n" "\n" "%(verification_url)s" @@ -353,7 +370,7 @@ msgstr "Avbryt" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" -msgstr "Spara" +msgstr "Spara ändringar" #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format @@ -362,13 +379,13 @@ msgstr "Redigerar %(username)ss profil" #: mediagoblin/templates/mediagoblin/listings/tag.html:31 msgid "Media tagged with:" -msgstr "Taggat med:" +msgstr "Media taggat med:" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" msgstr "Ladda upp" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "Skicka" @@ -380,7 +397,7 @@ msgstr "<a href=\"%(user_url)s\">%(username)s</a>s media" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 #: mediagoblin/templates/mediagoblin/user_pages/user.html:32 msgid "Sorry, no such user found." -msgstr "Finns ingen sÃ¥dan användare ännu." +msgstr "Ledsen, hittar ingen sÃ¥dan användare." #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -516,7 +533,15 @@ msgstr "Kommentar" 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 +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "Du tänker radera en annan användares media. Var försiktig." diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo Binary files differnew file mode 100644 index 00000000..b0d8d3fc --- /dev/null +++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po new file mode 100644 index 00000000..289bddb5 --- /dev/null +++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po @@ -0,0 +1,498 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# +# Translators: +# వీవెనౠ<veeven@gmail.com>, 2011. +msgid "" +msgstr "" +"Project-Id-Version: GNU MediaGoblin\n" +"Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-03 14:08+0000\n" +"Last-Translator: veeven <veeven@gmail.com>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.6\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +msgid "Username" +msgstr "వాడà±à°•à°°à°¿ పేరà±" + +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +msgid "Password" +msgstr "సంకేతపదం" + +#: mediagoblin/auth/forms.py:35 +msgid "Passwords must match." +msgstr "" + +#: mediagoblin/auth/forms.py:37 +msgid "Confirm password" +msgstr "" + +#: mediagoblin/auth/forms.py:39 +msgid "Type it again here to make sure there are no spelling mistakes." +msgstr "" + +#: mediagoblin/auth/forms.py:42 +msgid "Email address" +msgstr "ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾" + +#: mediagoblin/auth/views.py:55 +msgid "Sorry, registration is disabled on this instance." +msgstr "" + +#: mediagoblin/auth/views.py:73 +msgid "Sorry, a user with that name already exists." +msgstr "" + +#: mediagoblin/auth/views.py:77 +msgid "Sorry, that email address has already been taken." +msgstr "" + +#: mediagoblin/auth/views.py:179 +msgid "" +"Your email address has been verified. You may now login, edit your profile, " +"and submit images!" +msgstr "" + +#: mediagoblin/auth/views.py:185 +msgid "The verification key or user id is incorrect" +msgstr "" + +#: mediagoblin/auth/views.py:207 +msgid "Resent your verification email." +msgstr "" + +#: mediagoblin/auth/views.py:248 +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:24 mediagoblin/submit/forms.py:27 +msgid "Title" +msgstr "శీరà±à°·à°¿à°•" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +msgid "Tags" +msgstr "" + +#: mediagoblin/edit/forms.py:31 +msgid "Slug" +msgstr "" + +#: mediagoblin/edit/forms.py:32 +msgid "The slug can't be empty" +msgstr "" + +#: mediagoblin/edit/forms.py:33 +msgid "" +"The title part of this media's URL. You usually don't need to change this." +msgstr "" + +#: mediagoblin/edit/forms.py:40 +msgid "Bio" +msgstr "" + +#: mediagoblin/edit/forms.py:43 +msgid "Website" +msgstr "" + +#: mediagoblin/edit/views.py:64 +msgid "An entry with that slug already exists for this user." +msgstr "" + +#: mediagoblin/edit/views.py:85 +msgid "You are editing another user's media. Proceed with caution." +msgstr "" + +#: mediagoblin/edit/views.py:155 +msgid "You are editing a user's profile. Proceed with caution." +msgstr "" + +#: mediagoblin/process_media/errors.py:44 +msgid "Invalid file given for media type." +msgstr "" + +#: mediagoblin/submit/forms.py:25 +msgid "File" +msgstr "" + +#: mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/submit/views.py:46 +msgid "You must provide a file." +msgstr "" + +#: mediagoblin/submit/views.py:49 +msgid "The file doesn't seem to be an image!" +msgstr "" + +#: mediagoblin/submit/views.py:121 +msgid "Woohoo! Submitted!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/404.html:21 +msgid "Oops!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/404.html:24 +msgid "There doesn't seem to be a page at this address. Sorry!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/404.html:26 +msgid "" +"If you're sure the address is correct, maybe the page you're looking for has" +" been moved or deleted." +msgstr "" + +#: mediagoblin/templates/mediagoblin/404.html:32 +msgid "Image of 404 goblin stressing out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:22 +msgid "GNU MediaGoblin" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:47 +msgid "MediaGoblin logo" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:52 +msgid "Submit media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:63 +msgid "verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 +msgid "Log in" +msgstr "" + +#: 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 "" + +#: mediagoblin/templates/mediagoblin/root.html:24 +msgid "Explore" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:27 +msgid "Hi there, media lover! MediaGoblin is..." +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:29 +msgid "The perfect place for your media!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:30 +msgid "" +"A place for people to collaborate and show off original and derived " +"creations!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "" +"Free, as in freedom. (We’re a <a href=\"http://gnu.org\">GNU</a> project, " +"after all.)" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:32 +msgid "" +"Aiming to make the world a better place through decentralization and " +"(eventually, coming soon!) federation!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:33 +msgid "" +"Built for extensibility. (Multiple media types coming soon to the software," +" including video support!)" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:34 +msgid "" +"Powered by people like you. (<a " +"href=\"http://mediagoblin.org/pages/join.html\">You can help us improve this" +" software!</a>)" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:38 +msgid "Excited to join us?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:39 +#, python-format +msgid "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">Create a free account</a>\n" +" or\n" +" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:53 +msgid "Most recent media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 +msgid "Enter your new password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 +msgid "Enter your username or email" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 +msgid "Your password has been changed. Try to log in now." +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:30 +msgid "Logging in failed!" +msgstr "à°ªà±à°°à°µà±‡à°¶à°‚ విఫలమయà±à°¯à°¿à°‚ది!" + +#: mediagoblin/templates/mediagoblin/auth/login.html:43 +msgid "Don't have an account yet?" +msgstr "మీకౠఇంకా ఖాతా లేదా?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:46 +msgid "Create one here!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/login.html:49 +msgid "Forgot your password?" +msgstr "మీ సంకేతపదానà±à°¨à°¿ మరà±à°šà°¿à°ªà±‹à°¯à°¾à°°à°¾?" + +#: mediagoblin/templates/mediagoblin/auth/login.html:52 +msgid "Change it!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/register.html:27 +msgid "Create an account!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/register.html:31 +msgid "Create" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 +#, python-format +msgid "" +"Hi %(username)s,\n" +"\n" +"to activate your GNU MediaGoblin account, open the following URL in\n" +"your web browser:\n" +"\n" +"%(verification_url)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:29 +#, python-format +msgid "Editing %(media_title)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:36 +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49 +msgid "Cancel" +msgstr "à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿" + +#: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 +msgid "Save changes" +msgstr "మారà±à°ªà±à°²à°¨à± à°à°¦à±à°°à°ªà°°à°šà±" + +#: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 +#, python-format +msgid "Editing %(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/listings/tag.html:31 +msgid "Media tagged with:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:26 +msgid "Submit yer media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "దాఖలౠచెయà±à°¯à°¿" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#, python-format +msgid "<a href=\"%(user_url)s\">%(username)s</a>'s media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 +#, python-format +msgid "Really delete %(title)s?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 +msgid "Delete Permanently" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 +msgid "Media processing panel" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:25 +msgid "" +"You can track the state of media being processed for your gallery here." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 +msgid "Media in-processing" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46 +msgid "No media in-processing" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 +msgid "These uploads failed to process:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +msgid "Email verification needed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +msgid "Almost done! Your account still needs to be activated." +msgstr "" + +#: 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 "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +msgid "In case it doesn't:" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +msgid "Resend verification email" +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 "" + +#: 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 "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +msgid "Here's a spot to tell others about yourself." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +msgid "Edit profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +msgid "This user hasn't filled in their profile (yet)." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#, python-format +msgid "View all of %(username)s's media" +msgstr "" + +#: 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 "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +msgid "Add media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +msgid "There doesn't seem to be any media here yet..." +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 +msgid "feed icon" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/feed_link.html:23 +msgid "Atom feed" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 +msgid "Newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 +msgid "Older" +msgstr "" + +#: mediagoblin/user_pages/forms.py:24 +msgid "Comment" +msgstr "à°µà±à°¯à°¾à°–à±à°¯" + +#: mediagoblin/user_pages/forms.py:30 +msgid "I am sure I want to delete this" +msgstr "" + +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" +msgstr "" + +#: mediagoblin/user_pages/views.py:181 +msgid "You are about to delete another user's media. Proceed with caution." +msgstr "" + + diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo Binary files differindex adc3548e..e3751aeb 100644 --- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo +++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po index 1d86f1f9..c664adbe 100644 --- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" -"POT-Creation-Date: 2011-09-25 20:26-0500\n" -"PO-Revision-Date: 2011-09-26 01:25+0000\n" +"POT-Creation-Date: 2011-11-01 23:14-0500\n" +"PO-Revision-Date: 2011-11-02 04:13+0000\n" "Last-Translator: cwebber <cwebber@dustycloud.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" @@ -44,76 +44,76 @@ msgstr "å†è¼¸å…¥ä¸€æ¬¡ï¼Œç¢ºå®šä½ 沒有打錯å—。" msgid "Email address" msgstr "é›»å郵件ä½ç½®" -#: mediagoblin/auth/views.py:42 +#: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." msgstr "抱æ‰, é€™å€‹é …ç›®å·²ç¶“è¢«æš«åœè¨»å†Š." -#: mediagoblin/auth/views.py:60 +#: mediagoblin/auth/views.py:73 msgid "Sorry, a user with that name already exists." msgstr "抱æ‰, 這個使用者å稱已經å˜åœ¨." -#: mediagoblin/auth/views.py:64 +#: mediagoblin/auth/views.py:77 msgid "Sorry, that email address has already been taken." msgstr "抱æ‰ï¼Œé€™å€‹é›»å郵件已經被其他人使用了。" -#: mediagoblin/auth/views.py:165 +#: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "ä½ çš„é›»å郵件ä½å€å·²è¢«èªè‰. ä½ ç¾åœ¨å°±å¯ä»¥ç™»å…¥, ç·¨è¼¯ä½ çš„å€‹äººæª”æ¡ˆè€Œä¸”éžäº¤ç…§ç‰‡!" -#: mediagoblin/auth/views.py:171 +#: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" msgstr "èªè‰ç¢¼æˆ–是使用者帳號錯誤" -#: mediagoblin/auth/views.py:192 +#: mediagoblin/auth/views.py:207 msgid "Resent your verification email." msgstr "é‡é€èªè‰ä¿¡." -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:248 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." -msgstr "" +msgstr "無法傳é€å¯†ç¢¼å›žå¾©ä¿¡ä»¶ï¼Œå› ç‚ºä½ çš„ä½¿ç”¨è€…å稱已失效或是帳號尚未èªè‰ã€‚" -#: mediagoblin/edit/forms.py:26 mediagoblin/submit/forms.py:27 +#: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "標題" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" msgstr "標籤" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:31 msgid "Slug" msgstr "自訂å—串" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:32 msgid "The slug can't be empty" msgstr "自訂å—串ä¸èƒ½ç©ºç™½" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:33 msgid "" "The title part of this media's URL. You usually don't need to change this." -msgstr "" +msgstr "æ¤åª’體網å€çš„åç¨±ã€‚ä½ é€šå¸¸ä¸éœ€è¦è®Šå‹•這個的。" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:40 msgid "Bio" msgstr "自我介紹" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:43 msgid "Website" msgstr "網站" -#: mediagoblin/edit/views.py:63 +#: mediagoblin/edit/views.py:64 msgid "An entry with that slug already exists for this user." msgstr "這個自訂å—串已經被其他人用了" -#: mediagoblin/edit/views.py:84 +#: mediagoblin/edit/views.py:85 msgid "You are editing another user's media. Proceed with caution." msgstr "ä½ æ£åœ¨ç·¨è¼¯ä»–人的媒體檔案. 請謹慎處ç†." -#: mediagoblin/edit/views.py:154 +#: mediagoblin/edit/views.py:155 msgid "You are editing a user's profile. Proceed with caution." msgstr "ä½ æ£åœ¨ç·¨è¼¯ä¸€ä½ç”¨æˆ¶çš„æª”案. 請謹慎處ç†." @@ -127,17 +127,17 @@ msgstr "檔案" #: mediagoblin/submit/forms.py:30 msgid "Description of this work" -msgstr "" +msgstr "這個作å“çš„æè¿°" -#: mediagoblin/submit/views.py:47 +#: mediagoblin/submit/views.py:46 msgid "You must provide a file." msgstr "ä½ å¿…é ˆæä¾›ä¸€å€‹æª”案" -#: mediagoblin/submit/views.py:50 +#: mediagoblin/submit/views.py:49 msgid "The file doesn't seem to be an image!" msgstr "æª”æ¡ˆä¼¼ä¹Žä¸æ˜¯ä¸€å€‹åœ–片喔!" -#: mediagoblin/submit/views.py:122 +#: mediagoblin/submit/views.py:121 msgid "Woohoo! Submitted!" msgstr "呼呼! é€å‡ºåŽ»åš•!" @@ -176,8 +176,8 @@ msgid "verify your email!" msgstr "ç¢ºèªæ‚¨çš„é›»å郵件!" #: mediagoblin/templates/mediagoblin/base.html:73 -#: mediagoblin/templates/mediagoblin/auth/login.html:26 -#: mediagoblin/templates/mediagoblin/auth/login.html:34 +#: mediagoblin/templates/mediagoblin/auth/login.html:27 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Log in" msgstr "登入" @@ -191,7 +191,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:24 msgid "Explore" -msgstr "" +msgstr "探索" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, media lover! MediaGoblin is..." @@ -236,7 +236,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:38 msgid "Excited to join us?" -msgstr "" +msgstr "è¿«ä¸äºŸå¾…想è¦åŠ å…¥æˆ‘å€‘ï¼Ÿ" #: mediagoblin/templates/mediagoblin/root.html:39 #, python-format @@ -245,27 +245,30 @@ msgid "" " or\n" " <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">Set up MediaGoblin on your own server</a>" msgstr "" +"<a class=\"header_submit_highlight\" href=\"%(register_url)s\">建立一個å…費帳號</a>\n" +" 或是\n" +" <a class=\"header_submit\" href=\"http://wiki.mediagoblin.org/HackingHowto\">åœ¨ä½ çš„ä¼ºæœå™¨ä¸Šè¨ç«‹ MediaGoblin</a>" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" -msgstr "" +msgstr "最新的媒體" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:27 +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" -msgstr "" +msgstr "è¼¸å…¥ä½ çš„æ–°å¯†ç¢¼" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 msgid "Enter your username or email" -msgstr "" +msgstr "è¼¸å…¥ä½ çš„å¸³è™Ÿæˆ–æ˜¯é›»å郵件" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +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 "" +msgstr "æª¢æŸ¥ä½ çš„æ”¶ä»¶åŒ£ã€‚æˆ‘å€‘å·²ç¶“å‚³é€äº†é›»åéƒµä»¶ï¼Œä½ å¯åˆ©ç”¨éƒµä»¶ä¸çš„ç¶²å€è®Šæ›´å¯†ç¢¼ã€‚" #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -280,32 +283,39 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" +"å—¨ %(username)s,\n" +"\n" +"è¦æ›´æ”¹ GNU MediaGoblin的密碼,在ç€è¦½å™¨ä¸æ‰“開下é¢çš„ç¶²å€:\n" +"\n" +"%(verification_url)s\n" +"\n" +"å¦‚æžœä½ èªç‚ºé€™å€‹æ˜¯å€‹èª¤æœƒï¼Œè«‹å¿½ç•¥æ¤å°ä¿¡ä»¶ï¼Œç¹¼çºŒç•¶å€‹å¿«æ¨‚çš„goblin!" -#: mediagoblin/templates/mediagoblin/auth/login.html:29 +#: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "登入失敗ï¼" -#: mediagoblin/templates/mediagoblin/auth/login.html:42 +#: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" msgstr "還沒有帳號嗎?" -#: mediagoblin/templates/mediagoblin/auth/login.html:45 +#: mediagoblin/templates/mediagoblin/auth/login.html:46 msgid "Create one here!" msgstr "在這裡建立一個å§!" -#: mediagoblin/templates/mediagoblin/auth/login.html:48 +#: mediagoblin/templates/mediagoblin/auth/login.html:49 msgid "Forgot your password?" -msgstr "" +msgstr "忘了密碼嗎?" -#: mediagoblin/templates/mediagoblin/auth/login.html:51 +#: mediagoblin/templates/mediagoblin/auth/login.html:52 msgid "Change it!" -msgstr "" +msgstr "變更ï¼" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "建立一個帳號!" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "建立" @@ -353,7 +363,7 @@ msgstr "媒體檔案被標籤為:" msgid "Submit yer media" msgstr "éžäº¤ä½ 的媒體檔案" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "é€å‡º" @@ -374,7 +384,7 @@ msgstr "真的è¦åˆªé™¤ %(title)s?" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 msgid "Delete Permanently" -msgstr "" +msgstr "æ°¸é 刪除" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 msgid "Media processing panel" @@ -479,11 +489,11 @@ msgstr "Atom feed" #: mediagoblin/templates/mediagoblin/utils/pagination.html:40 msgid "Newer" -msgstr "" +msgstr "新一點" #: mediagoblin/templates/mediagoblin/utils/pagination.html:46 msgid "Older" -msgstr "" +msgstr "舊一點" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -491,9 +501,17 @@ msgstr "è©•è«–" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" +msgstr "我確定我想è¦åˆªé™¤" + +#: mediagoblin/user_pages/views.py:142 +msgid "Empty comments are not allowed." +msgstr "" + +#: mediagoblin/user_pages/views.py:148 +msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." msgstr "ä½ åœ¨åˆªé™¤å…¶ä»–äººçš„åª’é«”æª”æ¡ˆã€‚è«‹å°å¿ƒè™•ç†å–”。" diff --git a/mediagoblin/listings/views.py b/mediagoblin/listings/views.py index 2d61ee9b..12e539e7 100644 --- a/mediagoblin/listings/views.py +++ b/mediagoblin/listings/views.py @@ -16,7 +16,8 @@ from mediagoblin.db.util import DESCENDING -from mediagoblin.util import Pagination, render_to_response +from mediagoblin.tools.pagination import Pagination +from mediagoblin.tools.response import render_to_response from mediagoblin.decorators import uses_pagination from werkzeug.contrib.atom import AtomFeed diff --git a/mediagoblin/middleware/__init__.py b/mediagoblin/middleware/__init__.py index 586debbf..05325ee5 100644 --- a/mediagoblin/middleware/__init__.py +++ b/mediagoblin/middleware/__init__.py @@ -16,4 +16,5 @@ ENABLED_MIDDLEWARE = ( 'mediagoblin.middleware.noop:NoOpMiddleware', + 'mediagoblin.middleware.csrf:CsrfMiddleware', ) diff --git a/mediagoblin/middleware/csrf.py b/mediagoblin/middleware/csrf.py new file mode 100644 index 00000000..8275c18e --- /dev/null +++ b/mediagoblin/middleware/csrf.py @@ -0,0 +1,132 @@ +# 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 hashlib +import random + +from webob.exc import HTTPForbidden +from wtforms import Form, HiddenField, validators + +from mediagoblin import mg_globals + +# Use the system (hardware-based) random number generator if it exists. +# -- this optimization is lifted from Django +if hasattr(random, 'SystemRandom'): + getrandbits = random.SystemRandom().getrandbits +else: + getrandbits = random.getrandbits + + +class CsrfForm(Form): + """Simple form to handle rendering a CSRF token and confirming it + is included in the POST.""" + + csrf_token = HiddenField("", + [validators.Required()]) + + +def render_csrf_form_token(request): + """Render the CSRF token in a format suitable for inclusion in a + form.""" + + form = CsrfForm(csrf_token=request.environ['CSRF_TOKEN']) + + return form.csrf_token + + +class CsrfMiddleware(object): + """CSRF Protection Middleware + + Adds a CSRF Cookie to responses and verifies that it is present + and matches the form token for non-safe requests. + """ + + CSRF_KEYLEN = 64 + SAFE_HTTP_METHODS = ("GET", "HEAD", "OPTIONS", "TRACE") + + def __init__(self, mg_app): + self.app = mg_app + + def process_request(self, request): + """For non-safe requests, confirm that the tokens are present + and match. + """ + + # get the token from the cookie + try: + request.environ['CSRF_TOKEN'] = \ + request.cookies[mg_globals.app_config['csrf_cookie_name']] + + except KeyError, e: + # if it doesn't exist, make a new one + request.environ['CSRF_TOKEN'] = self._make_token(request) + + # if this is a non-"safe" request (ie, one that could have + # side effects), confirm that the CSRF tokens are present and + # valid + if request.method not in self.SAFE_HTTP_METHODS \ + and ('gmg.verify_csrf' in request.environ or + 'paste.testing' not in request.environ): + + return self.verify_tokens(request) + + def process_response(self, request, response): + """Add the CSRF cookie to the response if needed and set Vary + headers. + """ + + # set the CSRF cookie + response.set_cookie( + mg_globals.app_config['csrf_cookie_name'], + request.environ['CSRF_TOKEN'], + path=request.environ['SCRIPT_NAME'], + domain=mg_globals.app_config.get('csrf_cookie_domain'), + secure=(request.scheme.lower() == 'https'), + httponly=True) + + # update the Vary header + response.vary = (getattr(response, 'vary', None) or []) + ['Cookie'] + + def _make_token(self, request): + """Generate a new token to use for CSRF protection.""" + + return "%s" % (getrandbits(self.CSRF_KEYLEN),) + + def verify_tokens(self, request): + """Verify that the CSRF Cookie exists and that it matches the + form value.""" + + # confirm the cookie token was presented + cookie_token = request.cookies.get( + mg_globals.app_config['csrf_cookie_name'], + None) + + if cookie_token is None: + # the CSRF cookie must be present in the request + return HTTPForbidden() + + # get the form token and confirm it matches + form = CsrfForm(request.POST) + if form.validate(): + form_token = form.csrf_token.data + + if form_token == cookie_token: + # all's well that ends well + return + + # either the tokens didn't match or the form token wasn't + # present; either way, the request is denied + return HTTPForbidden() diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 9a7d5c39..3d6b418f 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -14,8 +14,9 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -import Image +import os +import Image from celery.task import Task from celery import registry @@ -123,21 +124,20 @@ def process_image(entry): mgg.queue_store, queued_filepath, 'source') + extension = os.path.splitext(queued_filename)[1] + try: thumb = Image.open(queued_filename) except IOError: raise BadMediaFail() thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS) - # ensure color mode is compatible with jpg - if thumb.mode != "RGB": - thumb = thumb.convert("RGB") - thumb_filepath = create_pub_filepath(entry, 'thumbnail.jpg') + thumb_filepath = create_pub_filepath(entry, 'thumbnail' + extension) thumb_file = mgg.public_store.get_file(thumb_filepath, 'w') with thumb_file: - thumb.save(thumb_file, "JPEG", quality=90) + thumb.save(thumb_file) # If the size of the original file exceeds the specified size of a `medium` # file, a `medium.jpg` files is created and later associated with the media @@ -148,14 +148,11 @@ def process_image(entry): if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]: medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS) - if medium.mode != "RGB": - medium = medium.convert("RGB") - - medium_filepath = create_pub_filepath(entry, 'medium.jpg') + medium_filepath = create_pub_filepath(entry, 'medium' + extension) medium_file = mgg.public_store.get_file(medium_filepath, 'w') with medium_file: - medium.save(medium_file, "JPEG", quality=90) + medium.save(medium_file) medium_processed = True # we have to re-read because unlike PIL, not everything reads diff --git a/mediagoblin/process_media/errors.py b/mediagoblin/process_media/errors.py index cb236154..4224a3e1 100644 --- a/mediagoblin/process_media/errors.py +++ b/mediagoblin/process_media/errors.py @@ -14,7 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -from mediagoblin.util import lazy_pass_to_ugettext as _ +from mediagoblin.tools.translate import lazy_pass_to_ugettext as _ class BaseProcessingFail(Exception): diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index b108cc9e..afd10207 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -22,7 +22,7 @@ font-family: 'Lato'; font-style: normal; font-weight: 400; - src: local('Lato Regular'), local('Lato-Regular'), url('../fonts/Lato-Regular.woff') format('truetype'); + src: local('Lato Regular'), local('Lato-Regular'), url('../fonts/Lato-Regular.ttf') format('truetype'); } body { @@ -161,7 +161,6 @@ background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109, padding-right: 11px; text-decoration: none; font-family: 'Lato', sans-serif; - font-size: 1.2em; font-weight: bold; } @@ -213,10 +212,6 @@ text-align: center; width: 100%; } -.form_field_box { - margin-bottom: 24px; -} - .form_field_label,.form_field_input { margin-bottom: 4px; } @@ -250,8 +245,12 @@ text-align: center; font-size: 0.9em; } +.comment_content { + margin-bottom: 30px; +} + .comment_content p { - margin-bottom: 4px; + margin-bottom: 0px; } /* media galleries */ @@ -291,13 +290,16 @@ img.media_icon{ /* navigation */ .navigation_button{ - width: 139px; + width: 135px; display: block; float: left; text-align: center; - background-color: #333; + background-color: #1d1d1d; + border: 1px solid; + border-color: #2c2c2c #232323 #1a1a1a; + border-radius: 3px; text-decoration: none; - padding: 12px 0pt; + padding: 8px 0px 14px; font-size: 2em; margin: 0 0 20px } @@ -307,7 +309,7 @@ p.navigation_button{ } .navigation_left{ - margin-right: 2px; + margin-right: 6px; } /* messages */ diff --git a/mediagoblin/static/images/icon_comment.png b/mediagoblin/static/images/icon_comment.png Binary files differnew file mode 100644 index 00000000..76860a92 --- /dev/null +++ b/mediagoblin/static/images/icon_comment.png diff --git a/mediagoblin/static/images/logo.png b/mediagoblin/static/images/logo.png Binary files differindex 1c08a2fb..b40e58fb 100644 --- a/mediagoblin/static/images/logo.png +++ b/mediagoblin/static/images/logo.png diff --git a/mediagoblin/static/images/logo.svg b/mediagoblin/static/images/logo.svg new file mode 100644 index 00000000..f236a597 --- /dev/null +++ b/mediagoblin/static/images/logo.svg @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="554" + height="101.99998" + id="svg2" + version="1.1" + inkscape:version="0.48.2 r9819" + sodipodi:docname="mediagoblin.svg" + inkscape:export-filename="mediagoblin.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:zoom="1" + inkscape:cx="279.13053" + inkscape:cy="65.605728" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + borderlayer="true" + inkscape:showpageshadow="false" + inkscape:window-width="1280" + inkscape:window-height="1000" + inkscape:window-x="0" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:snap-bbox="true" + inkscape:bbox-paths="true" + inkscape:bbox-nodes="true" + inkscape:snap-bbox-midpoints="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:object-paths="true" + inkscape:object-nodes="true" + inkscape:snap-midpoints="true" + inkscape:snap-smooth-nodes="true" + inkscape:snap-intersection-paths="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-center="true" + inkscape:snap-page="true" + showguides="false" + inkscape:guide-bbox="true" + inkscape:snap-global="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + showborder="false"> + <sodipodi:guide + orientation="1,0" + position="1062.0155,252.54874" + id="guide3002" /> + <inkscape:grid + type="xygrid" + id="grid4021" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" /> + <sodipodi:guide + orientation="0,1" + position="62.322892,118.88571" + id="guide3814" /> + <sodipodi:guide + orientation="0,1" + position="154.25003,65.249969" + id="guide3816" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="main" + inkscape:groupmode="layer" + id="layer1" + transform="translate(865.93433,-886.66071)"> + <g + id="g3010" + transform="matrix(0.68692139,0,0,0.52224846,-26.609327,197.42947)" /> + <g + id="g3951" + transform="matrix(0.75599155,0,0,0.75599155,-269.59547,339.3242)" /> + <g + transform="matrix(0.75599155,0,0,0.75599155,5.8142558,339.3242)" + id="g3969" /> + <path + id="path3051" + style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:11;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" + d="m -498.47812,909.8741 c -14.29997,-0.25966 -24.30551,9.34241 -26.50888,22.91161 -2.4313,14.97291 6.8419,28.27685 20.6875,30.5 13.84559,2.22316 27.00531,-7.50109 29.46875,-22.46875 2.41774,-14.68996 -7.14681,-30.64325 -23.64737,-30.94286 z m -1.10263,8.03661 c 11.82552,0.0748 16.8356,12.60864 15.5625,21.78125 -1.4685,10.58046 -9.88714,17.25696 -18.65625,15.6875 -8.7691,-1.56946 -14.66487,-10.77344 -13.125,-21.34375 1.3955,-9.57934 8.39284,-16.17451 16.21875,-16.125 z m 130.09735,-24.04343 c 0,3.62036 -2.93488,6.55525 -6.55524,6.55525 -3.62036,0 -6.55524,-2.93489 -6.55524,-6.55525 0,-3.62036 2.93488,-6.55524 6.55524,-6.55524 3.62036,0 6.55524,2.93488 6.55524,6.55524 z m -11.15801,16.87173 0,51.92717 9.20553,0 0,-51.92717 z m -280.41892,6e-5 0,51.92717 9.20553,0 0,-51.92717 z m 11.15802,-16.87173 c 0,3.62036 -2.93488,6.55525 -6.55524,6.55525 -3.62037,0 -6.55525,-2.93489 -6.55525,-6.55525 0,-3.62036 2.93488,-6.55524 6.55525,-6.55524 3.62036,0 6.55524,2.93488 6.55524,6.55524 z m 91.82766,15.94962 c -17.68301,0 -26.96853,15.66588 -26.96875,26.8125 -3.2e-4,16.07708 10.57093,26.13091 23.6875,26.875 4.79063,0.27178 11.67595,-0.19435 17.96875,-6.34375 0.25,15.44904 -3.39617,22.87085 -13.875,23.25 -7.92125,0.28661 -13.39214,-3.93545 -15.75595,-10.70298 l -7.46875,0 c 1.52404,7.39528 6.81992,18.97887 23.75595,18.64048 16.96269,-0.33892 22.5625,-13.84938 22.5625,-30.6875 l 0,-29.5625 c -0.0225,-6.25597 0.90001,-12.00727 2.71875,-17.34375 l -7.4375,0 c -0.95827,2.12785 -1.63064,4.94081 -2.27681,7.63925 -3.53047,-5.63263 -9.91399,-8.57675 -16.91069,-8.57675 z m 15.09375,27.75 c 0,9.35634 -7.1389,18.15625 -17.21875,18.15625 -10.36378,0 -15.59375,-9.243 -15.59375,-18.28125 0,-7.95083 4.08876,-18.88021 16.15625,-19.65625 7.84943,-0.50479 16.39174,7.25265 16.65625,19.78125 z m -143.1507,-50.84375 0,29.03125 c -3.26199,-4.21342 -10.81819,-6.62398 -16.34375,-6.3125 -17.88151,1.00802 -25.3123,17.2168 -25.3125,27.25 -3.2e-4,16.07708 10.47719,26.7559 23.59375,27.5 5.19493,0.29471 13.81969,-1.57948 19.625,-9.1875 0.60295,2.26134 1.86305,5.37114 3.15625,7.65625 l 7.4375,0 c -2.12044,-5.15404 -2.9375,-10.37795 -2.9375,-18.53125 l 0,-57.40625 z m -16.34375,30.875 c 12.02937,-0.0869 16.24638,9.43483 16.65625,19.59375 0,11.03464 -8.39635,19.0625 -17.21875,19.0625 -9.45765,0 -15.76506,-9.58978 -15.53125,-18.625 0.20843,-8.0541 4.61687,-19.94837 16.09375,-20.03125 z m -54.5723,-7.71875 c -14.69916,0 -25.74033,13.03618 -25.75,27.4375 -0.01,14.78695 10.244,26.125 23.65625,26.125 13.17686,0 17.98713,-4.04194 21.40625,-7.1875 l -4.3125,-5.0625 c -3.0707,2.07296 -7.16015,4.5625 -15.96875,4.5625 -7.45652,0 -14.61337,-5.22342 -15.5625,-14.375 12.17349,2.42928 34.34076,3.97324 38.34375,-8.3125 4.15154,-12.74162 -9.23233,-23.1875 -21.8125,-23.1875 z m -0.1875,7.875 c 7.44103,-0.28295 15.86681,7.08099 13.34375,12.5625 -1.07884,2.34384 -4.36121,3.84759 -11.0625,4.1875 -4.72973,0.2399 -11.67545,0.0602 -18.53125,-1.53125 1.38994,-7.13675 6.98538,-14.86646 16.25,-15.21875 z m 138.94915,-7.84375 c -6.22358,0 -12.35769,2.10385 -17.4375,5.78125 l 3.75,5.65625 c 4.03537,-2.17319 9.28716,-3.79268 14.34375,-3.46875 6.55828,0.42013 14.7598,2.73287 14.7598,14.233 -1.85084,-1.38482 -9.08908,-2.44485 -13.54105,-2.57675 -13.63282,-0.40393 -22.07092,5.70413 -22.86428,15.3125 -1.14325,13.84598 10.26769,18.625 20.33303,18.625 7.39807,5.2e-4 15.35814,-5.72151 17,-8.4375 0.43984,2.49906 2.01961,5.57335 3.125,7.625 l 7.46875,0 c -2.12043,-5.15404 -2.96875,-10.37795 -2.96875,-18.53125 l 0,-9.84375 c 0,-24.39387 -18.81089,-24.375 -23.96875,-24.375 z m 0.78125,27.4375 c 8.05656,-0.0156 14.8125,1.66674 14.8125,4.01961 0,6.72106 -7.55371,13.8524 -16.4375,14.23039 -4.54841,0.19353 -11.57496,-2.09719 -11.48928,-9.59375 0.0808,-7.06964 7.87645,-8.64609 13.11428,-8.65625 z m -223.80458,-27.53125 c -7.78959,0 -12.57316,3.37364 -14.53125,6.625 -0.75834,-1.89688 -1.49654,-3.84633 -2.375,-5.6875 l -7.4375,0 c 2.20887,5.93379 2.73712,12.19296 2.71875,17.3125 l 0,34.59375 9.21875,0 0,-34.78125 c 0,-6.65558 6.44423,-10.26976 12.4375,-10.40625 6.57556,-0.14975 9.05752,3.56709 9.125,8.90625 l 0,36.28125 9.1875,0 0,-34.78125 c 0,-6.65558 6.44424,-10.26976 12.4375,-10.40625 6.57556,-0.14975 9.18251,3.56709 9.25,8.90625 l 0,36.28125 9.21875,0 0,-36.28125 c 0,-11.16352 -8.04836,-16.5625 -18.5,-16.5625 -7.68395,0 -13.41885,3.49982 -15.34375,6.53125 -3.21828,-4.38545 -8.81153,-6.53125 -15.40625,-6.53125 z m 435.58675,-23.11502 0,60.98954 c 0,4.50655 1.82444,11.36243 4.13429,14.95446 l 7.46542,0 c -1.71595,-4.95183 -2.38614,-11.95254 -2.38614,-18.52179 l 0,-57.42221 z m -59.85447,0.0213 0,57.40625 c 0,8.48573 -0.72207,13.98198 -2.5625,18.53125 l 7.46875,0 c 0.49268,-1.18272 1.50645,-4.57275 2.125,-6.375 3.2358,3.63861 9.91843,7.15293 16.6875,7.28125 17.0179,0 26.83165,-13.62855 27.09375,-25.84375 0.32424,-15.11836 -9.23098,-28.09919 -25.40625,-27.96875 -7.10965,0.0573 -12.81683,3.2018 -16.1875,7.1875 l 0,-30.21875 -9.21875,0 z m 25.125,30.96875 c 0.34959,-0.0146 0.70152,-0.008 1.0625,0 6.22899,0.13299 15.65387,5.56214 15.4375,19.65625 -0.16934,11.02718 -8.18402,18.37679 -16.84375,18.34375 -11.39711,-0.0435 -15.84382,-8.59471 -15.84375,-18.8125 0,-7.75719 5.35029,-18.73358 16.1875,-19.1875 z m 107.7562,-7.80926 c -7.78958,0 -13.83625,3.29749 -15.79433,6.54885 -0.67753,-1.63171 -1.5038,-3.80006 -2.38135,-5.68127 l -7.4404,0 c 2.20887,5.93379 2.75814,12.20005 2.73977,17.31959 l 0,34.58661 9.20554,0 0,-34.77561 c 0,-6.65558 7.70716,-9.7658 13.70041,-9.90229 6.57556,-0.14975 10.98867,3.05115 11.05615,8.39031 l 0,36.28759 9.20552,0 0,-36.28759 c 0,-11.16352 -9.83967,-16.48619 -20.29131,-16.48619 z" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/mediagoblin/storage/__init__.py b/mediagoblin/storage/__init__.py index 8665d9e5..9e592b9e 100644 --- a/mediagoblin/storage/__init__.py +++ b/mediagoblin/storage/__init__.py @@ -21,7 +21,7 @@ import uuid from werkzeug.utils import secure_filename -from mediagoblin import util +from mediagoblin.tools import common ######## # Errors @@ -236,5 +236,5 @@ def storage_system_from_config(config_section): else: storage_class = 'mediagoblin.storage.filestorage:BasicFileStorage' - storage_class = util.import_component(storage_class) + storage_class = common.import_component(storage_class) return storage_class(**config_params) diff --git a/mediagoblin/storage/mountstorage.py b/mediagoblin/storage/mountstorage.py index 6adb7a0d..7239931f 100644 --- a/mediagoblin/storage/mountstorage.py +++ b/mediagoblin/storage/mountstorage.py @@ -14,7 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -from medigoblin.storage import StorageInterface, clean_listy_filepath +from mediagoblin.storage import StorageInterface, clean_listy_filepath class MountStorage(StorageInterface): diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py index a999c714..25d6e304 100644 --- a/mediagoblin/submit/forms.py +++ b/mediagoblin/submit/forms.py @@ -17,8 +17,8 @@ import wtforms -from mediagoblin.util import tag_length_validator -from mediagoblin.util import fake_ugettext_passthrough as _ +from mediagoblin.tools.text import tag_length_validator +from mediagoblin.tools.translate import fake_ugettext_passthrough as _ class SubmitStartForm(wtforms.Form): diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index d450ca21..25f7d79d 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -22,10 +22,9 @@ from cgi import FieldStorage from werkzeug.utils import secure_filename from mediagoblin.db.util import ObjectId -from mediagoblin.util import ( - render_to_response, redirect, cleaned_markdown_conversion, \ - convert_to_tag_list_of_dicts) -from mediagoblin.util import pass_to_ugettext as _ +from mediagoblin.tools.text import cleaned_markdown_conversion, convert_to_tag_list_of_dicts +from mediagoblin.tools.translate import pass_to_ugettext as _ +from mediagoblin.tools.response import render_to_response, redirect from mediagoblin.decorators import require_active_login from mediagoblin.submit import forms as submit_forms, security from mediagoblin.process_media import process_media, mark_entry_failed diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html index 4be7e065..53186cec 100644 --- a/mediagoblin/templates/mediagoblin/auth/change_fp.html +++ b/mediagoblin/templates/mediagoblin/auth/change_fp.html @@ -23,6 +23,8 @@ <form action="{{ request.urlgen('mediagoblin.auth.verify_forgot_password') }}" method="POST" enctype="multipart/form-data"> + {{ csrf_token }} + <div class="grid_6 prefix_1 suffix_1 form_box"> <h1>{% trans %}Enter your new password{% endtrans %}</h1> diff --git a/mediagoblin/templates/mediagoblin/auth/forgot_password.html b/mediagoblin/templates/mediagoblin/auth/forgot_password.html index 23fa9eb5..9b821426 100644 --- a/mediagoblin/templates/mediagoblin/auth/forgot_password.html +++ b/mediagoblin/templates/mediagoblin/auth/forgot_password.html @@ -20,18 +20,15 @@ {% import "/mediagoblin/utils/wtforms.html" as wtforms_util %} {% block mediagoblin_content %} - <form action="{{ request.urlgen('mediagoblin.auth.forgot_password') }}" method="POST" enctype="multipart/form-data"> + {{ csrf_token }} <div class="grid_6 prefix_1 suffix_1 form_box"> - <h1>{% trans %}Enter your username or email{% endtrans %}</h1> - + <h1>{% trans %}Recover password{% endtrans %}</h1> {{ wtforms_util.render_divs(fp_form) }} <div class="form_submit_buttons"> - <input type="submit" value="submit" class="button"/> + <input type="submit" value="{% trans %}Send instructions{% endtrans %}" class="button"/> </div> - </div> </form> {% endblock %} - diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html index 3926a1df..756f67c0 100644 --- a/mediagoblin/templates/mediagoblin/auth/login.html +++ b/mediagoblin/templates/mediagoblin/auth/login.html @@ -22,6 +22,7 @@ {% block mediagoblin_content %} <form action="{{ request.urlgen('mediagoblin.auth.login') }}" method="POST" enctype="multipart/form-data"> + {{ csrf_token }} <div class="grid_6 prefix_1 suffix_1 form_box"> <h1>{% trans %}Log in{% endtrans %}</h1> {% if login_failed %} @@ -29,27 +30,23 @@ {% trans %}Logging in failed!{% endtrans %} </div> {% endif %} - {{ wtforms_util.render_divs(login_form) }} - <div class="form_submit_buttons"> - <input type="submit" value="{% trans %}Log in{% endtrans %}" class="button"/> - </div> - {% if next %} - <input type="hidden" name="next" value="{{ next }}" class="button" - style="display: none;"/> - {% endif %} {% if allow_registration %} <p> - {% trans %}Don't have an account yet?{% endtrans %} - <br /> - <a href="{{ request.urlgen('mediagoblin.auth.register') }}"> + {% trans %}Don't have an account yet?{% endtrans %} <a href="{{ request.urlgen('mediagoblin.auth.register') }}"> {%- trans %}Create one here!{% endtrans %}</a> </p> + {% endif %} + {{ wtforms_util.render_divs(login_form) }} <p> - {% trans %}Forgot your password?{% endtrans %} - <br /> <a href="{{ request.urlgen('mediagoblin.auth.forgot_password') }}"> - {%- trans %}Change it!{% endtrans %}</a> + {% trans %}Forgot your password?{% endtrans %}</a> </p> + <div class="form_submit_buttons"> + <input type="submit" value="{% trans %}Log in{% endtrans %}" class="button"/> + </div> + {% if next %} + <input type="hidden" name="next" value="{{ next }}" class="button" + style="display: none;"/> {% endif %} </div> </form> diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html index e72b3a52..25b68058 100644 --- a/mediagoblin/templates/mediagoblin/auth/register.html +++ b/mediagoblin/templates/mediagoblin/auth/register.html @@ -26,6 +26,7 @@ <div class="grid_6 prefix_1 suffix_1 form_box"> <h1>{% trans %}Create an account!{% endtrans %}</h1> {{ wtforms_util.render_divs(register_form) }} + {{ csrf_token }} <div class="form_submit_buttons"> <input type="submit" value="{% trans %}Create{% endtrans %}" class="button" /> diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index b4c4dcf3..925386e5 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -67,7 +67,7 @@ user= request.user['username']) }}"> {{ request.user['username'] }}</a> - (<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">log out</a>) + (<a href="{{ request.urlgen('mediagoblin.auth.logout') }}">{% trans %}log out{% endtrans %}</a>) {% else %} <a href="{{ request.urlgen('mediagoblin.auth.login') }}"> {% trans %}Log in{% endtrans %}</a> diff --git a/mediagoblin/templates/mediagoblin/edit/attachments.html b/mediagoblin/templates/mediagoblin/edit/attachments.html index 63b06581..d8b55f58 100644 --- a/mediagoblin/templates/mediagoblin/edit/attachments.html +++ b/mediagoblin/templates/mediagoblin/edit/attachments.html @@ -49,6 +49,7 @@ <div class="form_submit_buttons"> <a href="{{ media.url_for_self(request.urlgen) }}">Cancel</a> <input type="submit" value="Save changes" class="button" /> + {{ csrf_token }} </div> </div> </form> diff --git a/mediagoblin/templates/mediagoblin/edit/edit.html b/mediagoblin/templates/mediagoblin/edit/edit.html index 8c4e2efb..b4b3be85 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit.html +++ b/mediagoblin/templates/mediagoblin/edit/edit.html @@ -35,6 +35,7 @@ <div class="form_submit_buttons"> <a href="{{ media.url_for_self(request.urlgen) }}">{% trans %}Cancel{% endtrans %}</a> <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button" /> + {{ csrf_token }} </div> </div> </form> diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html index 464c663d..93b2a792 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit_profile.html +++ b/mediagoblin/templates/mediagoblin/edit/edit_profile.html @@ -33,6 +33,7 @@ {{ wtforms_util.render_divs(form) }} <div class="form_submit_buttons"> <input type="submit" value="{% trans %}Save changes{% endtrans %}" class="button" /> + {{ csrf_token }} </div> </div> </form> diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index 58863015..f797f72f 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -26,9 +26,13 @@ tag=tag_slug) }}"> {% endblock mediagoblin_head %} +{% block title %} + {% trans %}Media tagged with: {{ tag_name }}{% endtrans %} — {{ super() }} +{% endblock %} + {% block mediagoblin_content -%} <h1> - {% trans %}Media tagged with:{% endtrans %} {{ tag_name }} + {% trans %}Media tagged with: {{ tag_name }}{% endtrans %} </h1> <div class="container_16 media_gallery"> diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html index e3ca9726..43d973d1 100644 --- a/mediagoblin/templates/mediagoblin/root.html +++ b/mediagoblin/templates/mediagoblin/root.html @@ -24,30 +24,21 @@ <h1>{% trans %}Explore{% endtrans %}</h1> {% else %} <div class="grid_11 alpha"> - <h1>{% trans %}Hi there, media lover! MediaGoblin is...{% endtrans %}</h1> - <ul> - <li>{% trans %}The perfect place for your media!{% endtrans %}</li> - <li>{% trans %}A place for people to collaborate and show off original and derived creations!{% endtrans %}</li> - <li>{% trans %}Free, as in freedom. (We’re a <a href="http://gnu.org">GNU</a> project, after all.){% endtrans %}</li> - <li>{% trans %}Aiming to make the world a better place through decentralization and (eventually, coming soon!) federation!{% endtrans %}</li> - <li>{% trans %}Built for extensibility. (Multiple media types coming soon to the software, including video support!){% endtrans %}</li> - <li>{% trans %}Powered by people like you. (<a href="http://mediagoblin.org/pages/join.html">You can help us improve this software!</a>){% endtrans %}</li> - </ul> - + <h1>{% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}</h1> + <p>{% trans %}Your finest source for all goblin-related media.{% endtrans %}</p> + <p>{% trans %}To add your own media, place comments, save your favourites and more, you can log in with your MediaGoblin account.{% endtrans %}</p> {% if allow_registration %} - <p>{% trans %}Excited to join us?{% endtrans %}<p> + <p>{% trans %}Don't have one yet? It's easy!{% endtrans %}</p> {% trans register_url=request.urlgen('mediagoblin.auth.register') -%} - <a class="header_submit_highlight" href="{{ register_url }}">Create a free account</a> + <a class="header_submit_highlight" href="{{ register_url }}">Create an account at this site</a> or <a class="header_submit" href="http://wiki.mediagoblin.org/HackingHowto">Set up MediaGoblin on your own server</a> {%- endtrans %} {% endif %} </div> - <div class="grid_5 omega"> <img src="{{ request.staticdirect('/images/frontpage_image.png') }}" /> </div> - <div class="clear"></div> {% endif %} <h2>{% trans %}Most recent media{% endtrans %}</h2> diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html index f2e844df..29b01181 100644 --- a/mediagoblin/templates/mediagoblin/submit/start.html +++ b/mediagoblin/templates/mediagoblin/submit/start.html @@ -26,7 +26,8 @@ <h1>{% trans %}Submit yer media{% endtrans %}</h1> {{ wtforms_util.render_divs(submit_form) }} <div class="form_submit_buttons"> - <input type="submit" value="{% trans %}Submit{% endtrans %}" class="button" /> + {{ csrf_token }} + <input type="submit" value="{% trans %}Submit{% endtrans %}" class="button" /> </div> </div> </form> diff --git a/mediagoblin/templates/mediagoblin/test_submit.html b/mediagoblin/templates/mediagoblin/test_submit.html index 78b88ae8..190b9ac3 100644 --- a/mediagoblin/templates/mediagoblin/test_submit.html +++ b/mediagoblin/templates/mediagoblin/test_submit.html @@ -26,6 +26,7 @@ <tr> <td></td> <td><input type="submit" value="submit" class="button" /></td> + {{ csrf_token }} </tr> </table> </form> diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html index df931d9c..b066dd71 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html +++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html @@ -26,29 +26,30 @@ user=user.username) }}"> {% endblock mediagoblin_head %} +{% block title %} + {%- trans username=user.username -%} + {{ username }}'s media + {%- endtrans %} — {{ super() }} +{% endblock %} + {% block mediagoblin_content -%} - {% if user %} - <h1> - {%- trans username=user.username, - user_url=request.urlgen( - 'mediagoblin.user_pages.user_home', - user=user.username) -%} - <a href="{{ user_url }}">{{ username }}</a>'s media - {%- endtrans %} - </h1> + <h1> + {%- trans username=user.username, + user_url=request.urlgen( + 'mediagoblin.user_pages.user_home', + user=user.username) -%} + <a href="{{ user_url }}">{{ username }}</a>'s media + {%- endtrans %} + </h1> - <div class="container_16 media_gallery"> - {{ object_gallery(request, media_entries, pagination) }} - </div> + <div class="container_16 media_gallery"> + {{ object_gallery(request, media_entries, pagination) }} + </div> - <div class="grid_16"> - {% set feed_url = request.urlgen( - 'mediagoblin.user_pages.atom_feed', - user=user.username) %} - {% include "mediagoblin/utils/feed_link.html" %} - </div> - {% else %} - {# This *should* not occur as the view makes sure we pass in a user. #} - <p>{% trans %}Sorry, no such user found.{% endtrans %}<p/> - {% endif %} + <div class="grid_16"> + {% set feed_url = request.urlgen( + 'mediagoblin.user_pages.atom_feed', + user=user.username) %} + {% include "mediagoblin/utils/feed_link.html" %} + </div> {% endblock %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 442bef6d..2441ec1b 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -20,6 +20,8 @@ {% import "/mediagoblin/utils/wtforms.html" as wtforms_util %} {% from "mediagoblin/utils/pagination.html" import render_pagination %} +{% block title %}{{ media.title }} — {{ super() }}{% endblock %} + {% block mediagoblin_content %} {% if media %} <div class="grid_11 alpha"> @@ -47,35 +49,22 @@ <h2 class="media_title"> {{ media.title }} </h2> - + {% autoescape False %} + <p>{{ media.description_html }}</p> + {% endautoescape %} <p class="media_uploader"> {% trans date=media.created.strftime("%Y-%m-%d"), user_url=request.urlgen( 'mediagoblin.user_pages.user_home', user=media.uploader().username), username=media.uploader().username -%} - Uploaded on {{ date }} by <a href="{{ user_url }}">{{ username }}</a> + By <a href="{{ user_url }}">{{ username }}</a> on {{ date }} {%- endtrans %} </p> - - {% autoescape False %} - <p>{{ media.description_html }}</p> - {% endautoescape %} - - <br /> - <h3>{% trans %}Comments{% endtrans %}</h3> - + <h3></h3> {% if request.user %} - <form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment', - user= media.uploader().username, - media=media._id) }}" method="POST"> - {{ wtforms_util.render_divs(comment_form) }} - <div class="form_submit_buttons"> - <input type="submit" value="{% trans %}Post comment!{% endtrans %}" class="button" /> - </div> - </form> + <p><a href="#comment_form">{% trans %}Post a comment{% endtrans %}</a></p> {% endif %} - {% if comments %} {% for comment in comments %} {% set comment_author = comment.author() %} @@ -86,14 +75,10 @@ <div class="comment_wrapper" id="comment-{{ comment['_id'] }}"> {% endif %} - <div class="comment_content"> - {% autoescape False %} - {{ comment.content_html }} + <div class="comment_content">{% autoescape False %}{{ comment.content_html }} {% endautoescape %} - </div> - - <div class="comment_author">— - <a href="{{ request.urlgen('mediagoblin.user_pages.user_home', + <img src="{{ request.staticdirect('/images/icon_comment.png') }}" /> + <a href="{{ request.urlgen('mediagoblin.user_pages.user_home', user = comment_author['username']) }}"> {{ comment_author['username'] }}</a> {% trans %}at{% endtrans %} @@ -101,12 +86,24 @@ comment = comment['_id'], user = media.uploader().username, media = media._id) }}#comment"> - {{ comment.created.strftime("%Y-%m-%d %I:%M%p") }} + {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }} </a> </div> </div> {% endfor %} + {% if request.user %} + <form action="{{ request.urlgen('mediagoblin.user_pages.media_post_comment', + user= media.uploader().username, + media=media._id) }}" method="POST"> + {{ wtforms_util.render_divs(comment_form) }} + <div class="form_submit_buttons"> + <input type="submit" value="{% trans %}Post comment!{% endtrans %}" class="button" /> + {{ csrf_token }} + </div> + </form> + {% endif %} + {{ render_pagination(request, pagination, request.urlgen('mediagoblin.user_pages.media_home', user = media.uploader().username, @@ -119,7 +116,7 @@ {% if media['uploader'] == request.user['_id'] or request.user['is_admin'] %} - <h3>Temporary button holder</h3> + <h3>{% trans %}Actions{% endtrans %}</h3> <p> {% set edit_url = request.urlgen('mediagoblin.edit.edit_media', user= media.uploader().username, diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html index 01323a6e..8da90f79 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html @@ -41,13 +41,14 @@ <p class="delete_checkbox_box"> {{ form.confirm }} - {{ _(form.confirm.label.text) }} + <label for="{{ (form.confirm.name) }}">{{ _(form.confirm.label.text) }}</label> </p> <div class="form_submit_buttons"> {# TODO: This isn't a button really... might do unexpected things :) #} <a class="cancel_link" href="{{ media.url_for_self(request.urlgen) }}">{% trans %}Cancel{% endtrans %}</a> <input type="submit" value="{% trans %}Delete Permanently{% endtrans %}" class="button" /> + {{ csrf_token }} </div> </div> </form> diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index c5beeaaa..d65da055 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -26,6 +26,17 @@ user=user.username) }}"> {% endblock mediagoblin_head %} +{% block title %} + {%- if user -%} + {%- trans username=user.username -%} + {{ username }}'s profile + {%- endtrans %} — {{ super() }} + {%- else -%} + {{ super() }} + {%- endif -%} +{% endblock %} + + {% block mediagoblin_content -%} {# If no user... #} {% if not user %} diff --git a/mediagoblin/templates/mediagoblin/utils/pagination.html b/mediagoblin/templates/mediagoblin/utils/pagination.html index 0df3bfea..84336103 100644 --- a/mediagoblin/templates/mediagoblin/utils/pagination.html +++ b/mediagoblin/templates/mediagoblin/utils/pagination.html @@ -21,7 +21,7 @@ {# only display if {{pagination}} is defined #} {% if pagination and pagination.pages > 1 %} {% if not base_url %} - {% set base_url = request.path_info %} + {% set base_url = request.full_path %} {% endif %} {% if preserve_get_params %} diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html index 87e6a85f..b3211bd9 100644 --- a/mediagoblin/templates/mediagoblin/utils/tags.html +++ b/mediagoblin/templates/mediagoblin/utils/tags.html @@ -23,7 +23,7 @@ <li class="tag"> <a href="{{ request.urlgen( 'mediagoblin.listings.tags_listing', - tag=tag['slug']) }}">{{ tag['name'] }}</li> + tag=tag['slug']) }}">{{ tag['name'] }}</a></li> {% endfor %} </ul> {% endblock %} diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index fbbe1613..40961eca 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -22,7 +22,7 @@ from nose.tools import assert_equal from mediagoblin.auth import lib as auth_lib from mediagoblin.tests.tools import setup_fresh_app from mediagoblin import mg_globals -from mediagoblin import util +from mediagoblin.tools import template, mail ######################## @@ -76,16 +76,16 @@ def test_register_views(test_app): test_app.get('/auth/register/') # Make sure it rendered with the appropriate template - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.TEMPLATE_TEST_CONTEXT.has_key( 'mediagoblin/auth/register.html') # Try to register without providing anything, should error # -------------------------------------------------------- - util.clear_test_template_context() + template.clear_test_template_context() test_app.post( '/auth/register/', {}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] form = context['register_form'] assert form.username.errors == [u'This field is required.'] assert form.password.errors == [u'This field is required.'] @@ -96,14 +96,14 @@ def test_register_views(test_app): # -------------------------------------------------------- ## too short - util.clear_test_template_context() + template.clear_test_template_context() test_app.post( '/auth/register/', { 'username': 'l', 'password': 'o', 'confirm_password': 'o', 'email': 'l'}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] form = context['register_form'] assert form.username.errors == [ @@ -112,12 +112,12 @@ def test_register_views(test_app): u'Field must be between 6 and 30 characters long.'] ## bad form - util.clear_test_template_context() + template.clear_test_template_context() test_app.post( '/auth/register/', { 'username': '@_@', 'email': 'lollerskates'}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] form = context['register_form'] assert form.username.errors == [ @@ -126,12 +126,12 @@ def test_register_views(test_app): u'Invalid email address.'] ## mismatching passwords - util.clear_test_template_context() + template.clear_test_template_context() test_app.post( '/auth/register/', { 'password': 'herpderp', 'confirm_password': 'derpherp'}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] form = context['register_form'] assert form.password.errors == [ @@ -142,7 +142,7 @@ def test_register_views(test_app): # Successful register # ------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post( '/auth/register/', { 'username': 'happygirl', @@ -155,7 +155,7 @@ def test_register_views(test_app): assert_equal( urlparse.urlsplit(response.location)[2], '/u/happygirl/') - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.TEMPLATE_TEST_CONTEXT.has_key( 'mediagoblin/user_pages/user.html') ## Make sure user is in place @@ -166,15 +166,15 @@ def test_register_views(test_app): assert new_user['email_verified'] == False ## Make sure user is logged in - request = util.TEMPLATE_TEST_CONTEXT[ + request = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/user_pages/user.html']['request'] assert request.session['user_id'] == unicode(new_user['_id']) ## Make sure we get email confirmation, and try verifying - assert len(util.EMAIL_TEST_INBOX) == 1 - message = util.EMAIL_TEST_INBOX.pop() + assert len(mail.EMAIL_TEST_INBOX) == 1 + message = mail.EMAIL_TEST_INBOX.pop() assert message['To'] == 'happygrrl@example.org' - email_context = util.TEMPLATE_TEST_CONTEXT[ + email_context = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/auth/verification_email.txt'] assert email_context['verification_url'] in message.get_payload(decode=True) @@ -190,12 +190,12 @@ def test_register_views(test_app): new_user['verification_key']] ## Try verifying with bs verification key, shouldn't work - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.get( "/auth/verify_email/?userid=%s&token=total_bs" % unicode( new_user['_id'])) response.follow() - context = util.TEMPLATE_TEST_CONTEXT[ + context = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/user_pages/user.html'] # assert context['verification_successful'] == True # TODO: Would be good to test messages here when we can do so... @@ -206,10 +206,10 @@ def test_register_views(test_app): assert new_user['email_verified'] == False ## Verify the email activation works - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.get("%s?%s" % (path, get_params)) response.follow() - context = util.TEMPLATE_TEST_CONTEXT[ + context = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/user_pages/user.html'] # assert context['verification_successful'] == True # TODO: Would be good to test messages here when we can do so... @@ -222,7 +222,7 @@ def test_register_views(test_app): # Uniqueness checks # ----------------- ## We shouldn't be able to register with that user twice - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post( '/auth/register/', { 'username': 'happygirl', @@ -230,7 +230,7 @@ def test_register_views(test_app): 'confirm_password': 'iamsohappy2', 'email': 'happygrrl2@example.org'}) - context = util.TEMPLATE_TEST_CONTEXT[ + context = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/auth/register.html'] form = context['register_form'] assert form.username.errors == [ @@ -240,7 +240,7 @@ def test_register_views(test_app): ### Oops, forgot the password # ------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post( '/auth/forgot_password/', {'username': 'happygirl'}) @@ -250,14 +250,14 @@ def test_register_views(test_app): assert_equal( urlparse.urlsplit(response.location)[2], '/auth/forgot_password/email_sent/') - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.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 len(mail.EMAIL_TEST_INBOX) == 1 + message = mail.EMAIL_TEST_INBOX.pop() assert message['To'] == 'happygrrl@example.org' - email_context = util.TEMPLATE_TEST_CONTEXT[ + email_context = template.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) @@ -277,14 +277,14 @@ def test_register_views(test_app): 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() + template.clear_test_template_context() response = test_app.get( "/auth/forgot_password/verify/?userid=%s&token=total_bs" % unicode( new_user['_id']), status=400) assert response.status == '400 Bad Request' ## Try using an expired token to change password, shouldn't work - util.clear_test_template_context() + template.clear_test_template_context() real_token_expiration = new_user['fp_token_expire'] new_user['fp_token_expire'] = datetime.datetime.now() new_user.save() @@ -294,12 +294,12 @@ def test_register_views(test_app): new_user.save() ## Verify step 1 of password-change works -- can see form to change password - util.clear_test_template_context() + template.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') + assert template.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() + template.clear_test_template_context() response = test_app.post( '/auth/forgot_password/verify/', { 'userid': parsed_get_params['userid'], @@ -307,11 +307,11 @@ def test_register_views(test_app): 'confirm_password': 'iamveryveryhappy', 'token': parsed_get_params['token']}) response.follow() - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.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() + template.clear_test_template_context() response = test_app.post( '/auth/login/', { 'username': u'happygirl', @@ -322,7 +322,7 @@ def test_register_views(test_app): assert_equal( urlparse.urlsplit(response.location)[2], '/') - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.TEMPLATE_TEST_CONTEXT.has_key( 'mediagoblin/root.html') @@ -341,61 +341,61 @@ def test_authentication_views(test_app): # Get login # --------- test_app.get('/auth/login/') - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.TEMPLATE_TEST_CONTEXT.has_key( 'mediagoblin/auth/login.html') # Failed login - blank form # ------------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post('/auth/login/') - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] form = context['login_form'] assert form.username.errors == [u'This field is required.'] assert form.password.errors == [u'This field is required.'] # Failed login - blank user # ------------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post( '/auth/login/', { 'password': u'toast'}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] form = context['login_form'] assert form.username.errors == [u'This field is required.'] # Failed login - blank password # ----------------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post( '/auth/login/', { 'username': u'chris'}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] form = context['login_form'] assert form.password.errors == [u'This field is required.'] # Failed login - bad user # ----------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post( '/auth/login/', { 'username': u'steve', 'password': 'toast'}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] assert context['login_failed'] # Failed login - bad password # --------------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post( '/auth/login/', { 'username': u'chris', 'password': 'jam'}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/login.html'] assert context['login_failed'] # Successful login # ---------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post( '/auth/login/', { 'username': u'chris', @@ -406,17 +406,17 @@ def test_authentication_views(test_app): assert_equal( urlparse.urlsplit(response.location)[2], '/') - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.TEMPLATE_TEST_CONTEXT.has_key( 'mediagoblin/root.html') # Make sure user is in the session - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html'] session = context['request'].session assert session['user_id'] == unicode(test_user['_id']) # Successful logout # ----------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.get('/auth/logout/') # Should be redirected to index page @@ -424,17 +424,17 @@ def test_authentication_views(test_app): assert_equal( urlparse.urlsplit(response.location)[2], '/') - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.TEMPLATE_TEST_CONTEXT.has_key( 'mediagoblin/root.html') # Make sure the user is not in the session - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html'] session = context['request'].session assert session.has_key('user_id') == False # User is redirected to custom URL if POST['next'] is set # ------------------------------------------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = test_app.post( '/auth/login/', { 'username': u'chris', diff --git a/mediagoblin/tests/test_csrf_middleware.py b/mediagoblin/tests/test_csrf_middleware.py new file mode 100644 index 00000000..691f10b9 --- /dev/null +++ b/mediagoblin/tests/test_csrf_middleware.py @@ -0,0 +1,71 @@ +# 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 urlparse +import datetime + +from nose.tools import assert_equal + +from mediagoblin.tests.tools import setup_fresh_app +from mediagoblin import mg_globals + + +@setup_fresh_app +def test_csrf_cookie_set(test_app): + + cookie_name = mg_globals.app_config['csrf_cookie_name'] + + # get login page + response = test_app.get('/auth/login/') + + # assert that the mediagoblin nonce cookie has been set + assert 'Set-Cookie' in response.headers + assert cookie_name in response.cookies_set + + # assert that we're also sending a vary header + assert response.headers.get('Vary', False) == 'Cookie' + + +@setup_fresh_app +def test_csrf_token_must_match(test_app): + + # construct a request with no cookie or form token + assert test_app.post('/auth/login/', + extra_environ={'gmg.verify_csrf': True}, + expect_errors=True).status_int == 403 + + # construct a request with a cookie, but no form token + assert test_app.post('/auth/login/', + headers={'Cookie': str('%s=foo; ' % + mg_globals.app_config['csrf_cookie_name'])}, + extra_environ={'gmg.verify_csrf': True}, + expect_errors=True).status_int == 403 + + # if both the cookie and form token are provided, they must match + assert test_app.post('/auth/login/', + {'csrf_token': 'blarf'}, + headers={'Cookie': str('%s=foo; ' % + mg_globals.app_config['csrf_cookie_name'])}, + extra_environ={'gmg.verify_csrf': True}, + expect_errors=True).\ + status_int == 403 + + assert test_app.post('/auth/login/', + {'csrf_token': 'foo'}, + headers={'Cookie': str('%s=foo; ' % + mg_globals.app_config['csrf_cookie_name'])}, + extra_environ={'gmg.verify_csrf': True}).\ + status_int == 200 diff --git a/mediagoblin/tests/test_messages.py b/mediagoblin/tests/test_messages.py index 9c57a151..2635f4d7 100644 --- a/mediagoblin/tests/test_messages.py +++ b/mediagoblin/tests/test_messages.py @@ -16,7 +16,7 @@ from mediagoblin.messages import fetch_messages, add_message from mediagoblin.tests.tools import setup_fresh_app -from mediagoblin import util +from mediagoblin.tools import template @setup_fresh_app @@ -28,7 +28,7 @@ def test_messages(test_app): """ # Aquire a request object test_app.get('/') - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html'] request = context['request'] # The message queue should be empty diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini index ab32cccc..f979e810 100644 --- a/mediagoblin/tests/test_mgoblin_app.ini +++ b/mediagoblin/tests/test_mgoblin_app.ini @@ -1,5 +1,5 @@ [mediagoblin] -direct_remote_path = /mgoblin_static/ +direct_remote_path = /test_static/ email_sender_address = "notice@mediagoblin.example.org" email_debug_mode = true db_name = __mediagoblin_tests__ diff --git a/mediagoblin/tests/test_migrations.py b/mediagoblin/tests/test_migrations.py index fc2449f7..e7cef0a1 100644 --- a/mediagoblin/tests/test_migrations.py +++ b/mediagoblin/tests/test_migrations.py @@ -23,6 +23,7 @@ from mediagoblin.tests.tools import ( from mediagoblin.db.util import ( RegisterMigration, MigrationManager, ObjectId, MissingCurrentMigration) +from mediagoblin.db.migrations import add_table_field # This one will get filled with local migrations TEST_MIGRATION_REGISTRY = {} @@ -45,10 +46,7 @@ def creature_add_magical_powers(database): magical powers, all existing monsters, setting to an empty list is fine. """ - database['creatures'].update( - {'magical_powers': {'$exists': False}}, - {'$set': {'magical_powers': []}}, - multi=True) + add_table_field(database, 'creatures', 'magical_powers', []) @RegisterMigration(2, TEST_MIGRATION_REGISTRY) diff --git a/mediagoblin/tests/test_paste.ini b/mediagoblin/tests/test_paste.ini index e7574b7a..bd57994b 100644 --- a/mediagoblin/tests/test_paste.ini +++ b/mediagoblin/tests/test_paste.ini @@ -5,7 +5,7 @@ debug = true use = egg:Paste#urlmap / = mediagoblin /mgoblin_media/ = publicstore_serve -/mgoblin_static/ = mediagoblin_static +/test_static/ = mediagoblin_static [app:mediagoblin] use = egg:mediagoblin#app diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py index 007c0348..1c657e6c 100644 --- a/mediagoblin/tests/test_submission.py +++ b/mediagoblin/tests/test_submission.py @@ -22,7 +22,7 @@ from nose.tools import assert_equal, assert_true, assert_false from mediagoblin.auth import lib as auth_lib from mediagoblin.tests.tools import setup_fresh_app, get_test_app from mediagoblin import mg_globals -from mediagoblin import util +from mediagoblin.tools import template, common GOOD_JPG = pkg_resources.resource_filename( 'mediagoblin.tests', 'test_submission/good.jpg') @@ -63,20 +63,20 @@ class TestSubmission: def test_missing_fields(self): # Test blank form # --------------- - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', {}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] form = context['submit_form'] assert form.file.errors == [u'You must provide a file.'] # Test blank file # --------------- - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', { 'title': 'test title'}) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] form = context['submit_form'] assert form.file.errors == [u'You must provide a file.'] @@ -84,7 +84,7 @@ class TestSubmission: def test_normal_uploads(self): # Test JPG # -------- - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', { 'title': 'Normal upload 1' @@ -96,12 +96,12 @@ class TestSubmission: assert_equal( urlparse.urlsplit(response.location)[2], '/u/chris/') - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.TEMPLATE_TEST_CONTEXT.has_key( 'mediagoblin/user_pages/user.html') # Test PNG # -------- - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', { 'title': 'Normal upload 2' @@ -112,13 +112,13 @@ class TestSubmission: assert_equal( urlparse.urlsplit(response.location)[2], '/u/chris/') - assert util.TEMPLATE_TEST_CONTEXT.has_key( + assert template.TEMPLATE_TEST_CONTEXT.has_key( 'mediagoblin/user_pages/user.html') def test_tags(self): # Good tag string # -------- - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', { 'title': 'Balanced Goblin', @@ -128,7 +128,7 @@ class TestSubmission: # New media entry with correct tags should be created response.follow() - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/user_pages/user.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/user_pages/user.html'] request = context['request'] media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0] assert_equal(media['tags'], @@ -137,7 +137,7 @@ class TestSubmission: # Test tags that are too long # --------------- - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', { 'title': 'Balanced Goblin', @@ -146,14 +146,14 @@ class TestSubmission: 'file', GOOD_JPG)]) # Too long error should be raised - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] form = context['submit_form'] assert form.tags.errors == [ u'Tags must be shorter than 50 characters. Tags that are too long'\ ': ffffffffffffffffffffffffffuuuuuuuuuuuuuuuuuuuuuuuuuu'] def test_delete(self): - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', { 'title': 'Balanced Goblin', @@ -163,7 +163,7 @@ class TestSubmission: # Post image response.follow() - request = util.TEMPLATE_TEST_CONTEXT[ + request = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/user_pages/user.html']['request'] media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0] @@ -183,7 +183,7 @@ class TestSubmission: response.follow() - request = util.TEMPLATE_TEST_CONTEXT[ + request = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/user_pages/user.html']['request'] media = request.db.MediaEntry.find({'title': 'Balanced Goblin'})[0] @@ -202,7 +202,7 @@ class TestSubmission: response.follow() - request = util.TEMPLATE_TEST_CONTEXT[ + request = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/user_pages/user.html']['request'] # Does media entry still exist? @@ -213,14 +213,14 @@ class TestSubmission: def test_malicious_uploads(self): # Test non-suppoerted file with non-supported extension # ----------------------------------------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', { 'title': 'Malicious Upload 1' }, upload_files=[( 'file', EVIL_FILE)]) - context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] form = context['submit_form'] assert form.file.errors == ['The file doesn\'t seem to be an image!'] @@ -230,7 +230,7 @@ class TestSubmission: # Test non-supported file with .jpg extension # ------------------------------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', { 'title': 'Malicious Upload 2' @@ -250,7 +250,7 @@ class TestSubmission: # Test non-supported file with .png extension # ------------------------------------------- - util.clear_test_template_context() + template.clear_test_template_context() response = self.test_app.post( '/submit/', { 'title': 'Malicious Upload 3' diff --git a/mediagoblin/tests/test_tags.py b/mediagoblin/tests/test_tags.py index d4628795..a05831c9 100644 --- a/mediagoblin/tests/test_tags.py +++ b/mediagoblin/tests/test_tags.py @@ -15,9 +15,8 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. from mediagoblin.tests.tools import setup_fresh_app -from mediagoblin import util from mediagoblin import mg_globals - +from mediagoblin.tools import text @setup_fresh_app def test_list_of_dicts_conversion(test_app): @@ -28,23 +27,23 @@ def test_list_of_dicts_conversion(test_app): function performs the reverse operation when populating a form to edit tags. """ # Leading, trailing, and internal whitespace should be removed and slugified - assert util.convert_to_tag_list_of_dicts('sleep , 6 AM, chainsaw! ') == [ + assert text.convert_to_tag_list_of_dicts('sleep , 6 AM, chainsaw! ') == [ {'name': u'sleep', 'slug': u'sleep'}, {'name': u'6 AM', 'slug': u'6-am'}, {'name': u'chainsaw!', 'slug': u'chainsaw'}] # If the user enters two identical tags, record only one of them - assert util.convert_to_tag_list_of_dicts('echo,echo') == [{'name': u'echo', + assert text.convert_to_tag_list_of_dicts('echo,echo') == [{'name': u'echo', 'slug': u'echo'}] # Make sure converting the list of dicts to a string works - assert util.media_tags_as_string([{'name': u'yin', 'slug': u'yin'}, + assert text.media_tags_as_string([{'name': u'yin', 'slug': u'yin'}, {'name': u'yang', 'slug': u'yang'}]) == \ u'yin,yang' # If the tag delimiter is a space then we expect different results mg_globals.app_config['tags_delimiter'] = u' ' - assert util.convert_to_tag_list_of_dicts('unicorn ceramic nazi') == [ + assert text.convert_to_tag_list_of_dicts('unicorn ceramic nazi') == [ {'name': u'unicorn', 'slug': u'unicorn'}, {'name': u'ceramic', 'slug': u'ceramic'}, {'name': u'nazi', 'slug': u'nazi'}] diff --git a/mediagoblin/tests/test_util.py b/mediagoblin/tests/test_util.py index c2a3a67f..48fa8669 100644 --- a/mediagoblin/tests/test_util.py +++ b/mediagoblin/tests/test_util.py @@ -16,10 +16,9 @@ import email -from mediagoblin import util +from mediagoblin.tools import common, url, translate, mail, text, testing - -util._activate_testing() +testing._activate_testing() def _import_component_testing_method(silly_string): @@ -28,7 +27,7 @@ def _import_component_testing_method(silly_string): def test_import_component(): - imported_func = util.import_component( + imported_func = common.import_component( 'mediagoblin.tests.test_util:_import_component_testing_method') result = imported_func('hooobaladoobala') expected = u"'hooobaladoobala' is the silliest string I've ever seen" @@ -36,10 +35,10 @@ def test_import_component(): def test_send_email(): - util._clear_test_inboxes() + mail._clear_test_inboxes() # send the email - util.send_email( + mail.send_email( "sender@mediagoblin.example.org", ["amanda@example.org", "akila@example.org"], "Testing is so much fun!", @@ -48,8 +47,8 @@ def test_send_email(): I hope you like unit tests JUST AS MUCH AS I DO!""") # check the main inbox - assert len(util.EMAIL_TEST_INBOX) == 1 - message = util.EMAIL_TEST_INBOX.pop() + assert len(mail.EMAIL_TEST_INBOX) == 1 + message = mail.EMAIL_TEST_INBOX.pop() assert message['From'] == "sender@mediagoblin.example.org" assert message['To'] == "amanda@example.org, akila@example.org" assert message['Subject'] == "Testing is so much fun!" @@ -58,8 +57,8 @@ I hope you like unit tests JUST AS MUCH AS I DO!""") I hope you like unit tests JUST AS MUCH AS I DO!""" # Check everything that the FakeMhost.sendmail() method got is correct - assert len(util.EMAIL_TEST_MBOX_INBOX) == 1 - mbox_dict = util.EMAIL_TEST_MBOX_INBOX.pop() + assert len(mail.EMAIL_TEST_MBOX_INBOX) == 1 + mbox_dict = mail.EMAIL_TEST_MBOX_INBOX.pop() assert mbox_dict['from'] == "sender@mediagoblin.example.org" assert mbox_dict['to'] == ["amanda@example.org", "akila@example.org"] mbox_message = email.message_from_string(mbox_dict['message']) @@ -71,43 +70,43 @@ I hope you like unit tests JUST AS MUCH AS I DO!""" I hope you like unit tests JUST AS MUCH AS I DO!""" def test_slugify(): - assert util.slugify('a walk in the park') == 'a-walk-in-the-park' - assert util.slugify('A Walk in the Park') == 'a-walk-in-the-park' - assert util.slugify('a walk in the park') == 'a-walk-in-the-park' - assert util.slugify('a walk in-the-park') == 'a-walk-in-the-park' - assert util.slugify('a w@lk in the park?') == 'a-w-lk-in-the-park' - assert util.slugify(u'a walk in the par\u0107') == 'a-walk-in-the-parc' - assert util.slugify(u'\u00E0\u0042\u00E7\u010F\u00EB\u0066') == 'abcdef' + assert url.slugify('a walk in the park') == 'a-walk-in-the-park' + assert url.slugify('A Walk in the Park') == 'a-walk-in-the-park' + assert url.slugify('a walk in the park') == 'a-walk-in-the-park' + assert url.slugify('a walk in-the-park') == 'a-walk-in-the-park' + assert url.slugify('a w@lk in the park?') == 'a-w-lk-in-the-park' + assert url.slugify(u'a walk in the par\u0107') == 'a-walk-in-the-parc' + assert url.slugify(u'\u00E0\u0042\u00E7\u010F\u00EB\u0066') == 'abcdef' def test_locale_to_lower_upper(): """ Test cc.i18n.util.locale_to_lower_upper() """ - assert util.locale_to_lower_upper('en') == 'en' - assert util.locale_to_lower_upper('en_US') == 'en_US' - assert util.locale_to_lower_upper('en-us') == 'en_US' + assert translate.locale_to_lower_upper('en') == 'en' + assert translate.locale_to_lower_upper('en_US') == 'en_US' + assert translate.locale_to_lower_upper('en-us') == 'en_US' # crazy renditions. Useful? - assert util.locale_to_lower_upper('en-US') == 'en_US' - assert util.locale_to_lower_upper('en_us') == 'en_US' + assert translate.locale_to_lower_upper('en-US') == 'en_US' + assert translate.locale_to_lower_upper('en_us') == 'en_US' def test_locale_to_lower_lower(): """ Test cc.i18n.util.locale_to_lower_lower() """ - assert util.locale_to_lower_lower('en') == 'en' - assert util.locale_to_lower_lower('en_US') == 'en-us' - assert util.locale_to_lower_lower('en-us') == 'en-us' + assert translate.locale_to_lower_lower('en') == 'en' + assert translate.locale_to_lower_lower('en_US') == 'en-us' + assert translate.locale_to_lower_lower('en-us') == 'en-us' # crazy renditions. Useful? - assert util.locale_to_lower_lower('en-US') == 'en-us' - assert util.locale_to_lower_lower('en_us') == 'en-us' + assert translate.locale_to_lower_lower('en-US') == 'en-us' + assert translate.locale_to_lower_lower('en_us') == 'en-us' def test_html_cleaner(): # Remove images - result = util.clean_html( + result = text.clean_html( '<p>Hi everybody! ' '<img src="http://example.org/huge-purple-barney.png" /></p>\n' '<p>:)</p>') @@ -118,7 +117,7 @@ def test_html_cleaner(): '</div>') # Remove evil javascript - result = util.clean_html( + result = text.clean_html( '<p><a href="javascript:nasty_surprise">innocent link!</a></p>') assert result == ( '<p><a href="">innocent link!</a></p>') diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py index 308e83ee..420d9ba8 100644 --- a/mediagoblin/tests/tools.py +++ b/mediagoblin/tests/tools.py @@ -21,7 +21,8 @@ import os, shutil from paste.deploy import loadapp from webtest import TestApp -from mediagoblin import util +from mediagoblin import mg_globals +from mediagoblin.tools import testing from mediagoblin.init.config import read_mediagoblin_config from mediagoblin.decorators import _make_safe from mediagoblin.db.open import setup_connection_and_db_from_config @@ -49,6 +50,51 @@ $ CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_tests ./bin/nosetests""" class BadCeleryEnviron(Exception): pass +class TestingMiddleware(object): + """ + Middleware for the Unit tests + + It might make sense to perform some tests on all + requests/responses. Or prepare them in a special + manner. For example all html responses could be tested + for being valid html *after* being rendered. + + This module is getting inserted at the front of the + middleware list, which means: requests are handed here + first, responses last. So this wraps up the "normal" + app. + + If you need to add a test, either add it directly to + the appropiate process_request or process_response, or + create a new method and call it from process_*. + """ + + def __init__(self, mg_app): + self.app = mg_app + + def process_request(self, request): + pass + + def process_response(self, request, response): + # All following tests should be for html only! + if response.content_type != "text/html": + # Get out early + return + + # If the template contains a reference to + # /mgoblin_static/ instead of using + # /request.staticdirect(), error out here. + # This could probably be implemented as a grep on + # the shipped templates easier... + if response.text.find("/mgoblin_static/") >= 0: + raise AssertionError( + "Response HTML contains reference to /mgoblin_static/ " + "instead of staticdirect. Request was for: " + + request.full_path) + + return + + def suicide_if_bad_celery_environ(): if not os.environ.get('CELERY_CONFIG_MODULE') == \ 'mediagoblin.init.celery.from_tests': @@ -59,7 +105,7 @@ def get_test_app(dump_old_app=True): suicide_if_bad_celery_environ() # Make sure we've turned on testing - util._activate_testing() + testing._activate_testing() # Leave this imported as it sets up celery. from mediagoblin.init.celery import from_tests @@ -103,6 +149,12 @@ def get_test_app(dump_old_app=True): test_app = loadapp( 'config:' + TEST_SERVER_CONFIG) + # Insert the TestingMiddleware, which can do some + # sanity checks on every request/response. + # Doing it this way is probably not the cleanest way. + # We'll fix it, when we have plugins! + mg_globals.app.middleware.insert(0, TestingMiddleware(mg_globals.app)) + app = TestApp(test_app) MGOBLIN_APP = app @@ -117,7 +169,7 @@ def setup_fresh_app(func): """ def wrapper(*args, **kwargs): test_app = get_test_app() - util.clear_test_buckets() + testing.clear_test_buckets() return func(test_app, *args, **kwargs) return _make_safe(wrapper, func) diff --git a/mediagoblin/tools/__init__.py b/mediagoblin/tools/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/mediagoblin/tools/__init__.py diff --git a/mediagoblin/tools/common.py b/mediagoblin/tools/common.py new file mode 100644 index 00000000..12d8309e --- /dev/null +++ b/mediagoblin/tools/common.py @@ -0,0 +1,38 @@ +# 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/>. + +import sys + +DISPLAY_IMAGE_FETCHING_ORDER = [u'medium', u'original', u'thumb'] + +global TESTS_ENABLED +TESTS_ENABLED = False + + +def import_component(import_string): + """ + Import a module component defined by STRING. Probably a method, + class, or global variable. + + Args: + - import_string: a string that defines what to import. Written + in the format of "module1.module2:component" + """ + module_name, func_name = import_string.split(':', 1) + __import__(module_name) + module = sys.modules[module_name] + func = getattr(module, func_name) + return func diff --git a/mediagoblin/tools/files.py b/mediagoblin/tools/files.py new file mode 100644 index 00000000..e0bf0569 --- /dev/null +++ b/mediagoblin/tools/files.py @@ -0,0 +1,32 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from mediagoblin import mg_globals + +def delete_media_files(media): + """ + Delete all files associated with a MediaEntry + + Arguments: + - media: A MediaEntry document + """ + for listpath in media['media_files'].itervalues(): + mg_globals.public_store.delete_file( + listpath) + + for attachment in media['attachment_files']: + mg_globals.public_store.delete_file( + attachment['filepath']) diff --git a/mediagoblin/tools/mail.py b/mediagoblin/tools/mail.py new file mode 100644 index 00000000..9e00be7d --- /dev/null +++ b/mediagoblin/tools/mail.py @@ -0,0 +1,123 @@ +# 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 smtplib +from email.MIMEText import MIMEText +from mediagoblin import mg_globals +from mediagoblin.tools import common + +### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +### Special email test stuff begins HERE +### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# We have two "test inboxes" here: +# +# EMAIL_TEST_INBOX: +# ---------------- +# If you're writing test views, you'll probably want to check this. +# It contains a list of MIMEText messages. +# +# EMAIL_TEST_MBOX_INBOX: +# ---------------------- +# This collects the messages from the FakeMhost inbox. It's reslly +# just here for testing the send_email method itself. +# +# Anyway this contains: +# - from +# - to: a list of email recipient addresses +# - message: not just the body, but the whole message, including +# headers, etc. +# +# ***IMPORTANT!*** +# ---------------- +# Before running tests that call functions which send email, you should +# always call _clear_test_inboxes() to "wipe" the inboxes clean. + +EMAIL_TEST_INBOX = [] +EMAIL_TEST_MBOX_INBOX = [] + + +class FakeMhost(object): + """ + Just a fake mail host so we can capture and test messages + from send_email + """ + def login(self, *args, **kwargs): + pass + + def sendmail(self, from_addr, to_addrs, message): + EMAIL_TEST_MBOX_INBOX.append( + {'from': from_addr, + 'to': to_addrs, + 'message': message}) + + +def _clear_test_inboxes(): + global EMAIL_TEST_INBOX + global EMAIL_TEST_MBOX_INBOX + EMAIL_TEST_INBOX = [] + EMAIL_TEST_MBOX_INBOX = [] + + +### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +### </Special email test stuff> +### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +def send_email(from_addr, to_addrs, subject, message_body): + """ + Simple email sending wrapper, use this so we can capture messages + for unit testing purposes. + + Args: + - from_addr: address you're sending the email from + - to_addrs: list of recipient email addresses + - subject: subject of the email + - message_body: email body text + """ + if common.TESTS_ENABLED or mg_globals.app_config['email_debug_mode']: + mhost = FakeMhost() + elif not mg_globals.app_config['email_debug_mode']: + mhost = smtplib.SMTP( + mg_globals.app_config['email_smtp_host'], + mg_globals.app_config['email_smtp_port']) + + # SMTP.__init__ Issues SMTP.connect implicitly if host + if not mg_globals.app_config['email_smtp_host']: # e.g. host = '' + mhost.connect() # We SMTP.connect explicitly + + if mg_globals.app_config['email_smtp_user'] \ + or mg_globals.app_config['email_smtp_pass']: + mhost.login( + mg_globals.app_config['email_smtp_user'], + mg_globals.app_config['email_smtp_pass']) + + message = MIMEText(message_body.encode('utf-8'), 'plain', 'utf-8') + message['Subject'] = subject + message['From'] = from_addr + message['To'] = ', '.join(to_addrs) + + if common.TESTS_ENABLED: + EMAIL_TEST_INBOX.append(message) + + if mg_globals.app_config['email_debug_mode']: + print u"===== Email =====" + print u"From address: %s" % message['From'] + print u"To addresses: %s" % message['To'] + print u"Subject: %s" % message['Subject'] + print u"-- Body: --" + print message.get_payload(decode=True) + + return mhost.sendmail(from_addr, to_addrs, message.as_string()) diff --git a/mediagoblin/tools/pagination.py b/mediagoblin/tools/pagination.py new file mode 100644 index 00000000..bc20ec90 --- /dev/null +++ b/mediagoblin/tools/pagination.py @@ -0,0 +1,111 @@ +# 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 urllib +import copy +from math import ceil, floor +from itertools import izip, count + + +PAGINATION_DEFAULT_PER_PAGE = 30 + + +class Pagination(object): + """ + Pagination class for mongodb queries. + + Initialization through __init__(self, cursor, page=1, per_page=2), + get actual data slice through __call__(). + """ + + def __init__(self, page, cursor, per_page=PAGINATION_DEFAULT_PER_PAGE, + jump_to_id=False): + """ + Initializes Pagination + + Args: + - page: requested page + - per_page: number of objects per page + - cursor: db cursor + - jump_to_id: ObjectId, sets the page to the page containing the + object with _id == jump_to_id. + """ + self.page = page + self.per_page = per_page + self.cursor = cursor + self.total_count = self.cursor.count() + self.active_id = None + + if jump_to_id: + cursor = copy.copy(self.cursor) + + for (doc, increment) in izip(cursor, count(0)): + if doc['_id'] == jump_to_id: + self.page = 1 + int(floor(increment / self.per_page)) + + self.active_id = jump_to_id + break + + + def __call__(self): + """ + Returns slice of objects for the requested page + """ + return self.cursor.skip( + (self.page - 1) * self.per_page).limit(self.per_page) + + @property + def pages(self): + return int(ceil(self.total_count / float(self.per_page))) + + @property + def has_prev(self): + return self.page > 1 + + @property + def has_next(self): + return self.page < self.pages + + def iter_pages(self, left_edge=2, left_current=2, + right_current=5, right_edge=2): + last = 0 + for num in xrange(1, self.pages + 1): + if num <= left_edge or \ + (num > self.page - left_current - 1 and \ + num < self.page + right_current) or \ + num > self.pages - right_edge: + if last + 1 != num: + yield None + yield num + last = num + + def get_page_url_explicit(self, base_url, get_params, page_no): + """ + Get a page url by adding a page= parameter to the base url + """ + new_get_params = copy.copy(get_params or {}) + new_get_params['page'] = page_no + return "%s?%s" % ( + base_url, urllib.urlencode(new_get_params)) + + def get_page_url(self, request, page_no): + """ + Get a new page url based of the request, and the new page number. + + This is a nice wrapper around get_page_url_explicit() + """ + return self.get_page_url_explicit( + request.full_path, request.GET, page_no) diff --git a/mediagoblin/tools/request.py b/mediagoblin/tools/request.py new file mode 100644 index 00000000..b1cbe119 --- /dev/null +++ b/mediagoblin/tools/request.py @@ -0,0 +1,37 @@ +# 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.db.util import ObjectId + +def setup_user_in_request(request): + """ + Examine a request and tack on a request.user parameter if that's + appropriate. + """ + if not request.session.has_key('user_id'): + request.user = None + return + + user = None + user = request.app.db.User.one( + {'_id': ObjectId(request.session['user_id'])}) + + if not user: + # Something's wrong... this user doesn't exist? Invalidate + # this session. + request.session.invalidate() + + request.user = user diff --git a/mediagoblin/tools/response.py b/mediagoblin/tools/response.py new file mode 100644 index 00000000..b01d31a2 --- /dev/null +++ b/mediagoblin/tools/response.py @@ -0,0 +1,47 @@ +# 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 webob import Response, exc +from mediagoblin.tools.template import render_template + + +def render_to_response(request, template, context, status=200): + """Much like Django's shortcut.render()""" + return Response( + render_template(request, template, context), + status=status) + + +def render_404(request): + """ + Render a 404. + """ + return render_to_response( + request, 'mediagoblin/404.html', {}, status=400) + + +def redirect(request, *args, **kwargs): + """Returns a HTTPFound(), takes a request and then urlgen params""" + + querystring = None + if kwargs.get('querystring'): + querystring = kwargs.get('querystring') + del kwargs['querystring'] + + return exc.HTTPFound( + location=''.join([ + request.urlgen(*args, **kwargs), + querystring if querystring else ''])) diff --git a/mediagoblin/tools/template.py b/mediagoblin/tools/template.py new file mode 100644 index 00000000..905a36df --- /dev/null +++ b/mediagoblin/tools/template.py @@ -0,0 +1,119 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from math import ceil +import jinja2 +from babel.localedata import exists +from mediagoblin import mg_globals +from mediagoblin import messages +from mediagoblin.tools import common +from mediagoblin.tools.translate import setup_gettext +from mediagoblin.middleware.csrf import render_csrf_form_token + + +SETUP_JINJA_ENVS = {} + + +def get_jinja_env(template_loader, locale): + """ + Set up the Jinja environment, + + (In the future we may have another system for providing theming; + for now this is good enough.) + """ + setup_gettext(locale) + + # If we have a jinja environment set up with this locale, just + # return that one. + if SETUP_JINJA_ENVS.has_key(locale): + return SETUP_JINJA_ENVS[locale] + + template_env = jinja2.Environment( + loader=template_loader, autoescape=True, + extensions=['jinja2.ext.i18n', 'jinja2.ext.autoescape']) + + template_env.install_gettext_callables( + mg_globals.translations.ugettext, + mg_globals.translations.ungettext) + + # All templates will know how to ... + # ... fetch all waiting messages and remove them from the queue + # ... construct a grid of thumbnails or other media + template_env.globals['fetch_messages'] = messages.fetch_messages + template_env.globals['gridify_list'] = gridify_list + template_env.globals['gridify_cursor'] = gridify_cursor + + if exists(locale): + SETUP_JINJA_ENVS[locale] = template_env + + return template_env + + +# We'll store context information here when doing unit tests +TEMPLATE_TEST_CONTEXT = {} + + +def render_template(request, template_path, context): + """ + Render a template with context. + + Always inserts the request into the context, so you don't have to. + Also stores the context if we're doing unit tests. Helpful! + """ + template = request.template_env.get_template( + template_path) + context['request'] = request + context['csrf_token'] = render_csrf_form_token(request) + rendered = template.render(context) + + if common.TESTS_ENABLED: + TEMPLATE_TEST_CONTEXT[template_path] = context + + return rendered + + +def clear_test_template_context(): + global TEMPLATE_TEST_CONTEXT + TEMPLATE_TEST_CONTEXT = {} + + +def gridify_list(this_list, num_cols=5): + """ + Generates a list of lists where each sub-list's length depends on + the number of columns in the list + """ + grid = [] + + # Figure out how many rows we should have + num_rows = int(ceil(float(len(this_list)) / num_cols)) + + for row_num in range(num_rows): + slice_min = row_num * num_cols + slice_max = (row_num + 1) * num_cols + + row = this_list[slice_min:slice_max] + + grid.append(row) + + return grid + + +def gridify_cursor(this_cursor, num_cols=5): + """ + Generates a list of lists where each sub-list's length depends on + the number of columns in the list + """ + return gridify_list(list(this_cursor), num_cols) diff --git a/mediagoblin/tools/testing.py b/mediagoblin/tools/testing.py new file mode 100644 index 00000000..39435ca5 --- /dev/null +++ b/mediagoblin/tools/testing.py @@ -0,0 +1,45 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +from mediagoblin.tools import common +from mediagoblin.tools.template import clear_test_template_context +from mediagoblin.tools.mail import EMAIL_TEST_INBOX, EMAIL_TEST_MBOX_INBOX + +def _activate_testing(): + """ + Call this to activate testing in util.py + """ + + common.TESTS_ENABLED = True + +def clear_test_buckets(): + """ + We store some things for testing purposes that should be cleared + when we want a "clean slate" of information for our next round of + tests. Call this function to wipe all that stuff clean. + + Also wipes out some other things we might redefine during testing, + like the jinja envs. + """ + global SETUP_JINJA_ENVS + SETUP_JINJA_ENVS = {} + + global EMAIL_TEST_INBOX + global EMAIL_TEST_MBOX_INBOX + EMAIL_TEST_INBOX = [] + EMAIL_TEST_MBOX_INBOX = [] + + clear_test_template_context() diff --git a/mediagoblin/tools/text.py b/mediagoblin/tools/text.py new file mode 100644 index 00000000..be1adb00 --- /dev/null +++ b/mediagoblin/tools/text.py @@ -0,0 +1,124 @@ +# 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 wtforms +import markdown +from lxml.html.clean import Cleaner + +from mediagoblin import mg_globals +from mediagoblin.tools import url + + +# A super strict version of the lxml.html cleaner class +HTML_CLEANER = Cleaner( + scripts=True, + javascript=True, + comments=True, + style=True, + links=True, + page_structure=True, + processing_instructions=True, + embedded=True, + frames=True, + forms=True, + annoying_tags=True, + allow_tags=[ + 'div', 'b', 'i', 'em', 'strong', 'p', 'ul', 'ol', 'li', 'a', 'br'], + remove_unknown_tags=False, # can't be used with allow_tags + safe_attrs_only=True, + add_nofollow=True, # for now + host_whitelist=(), + whitelist_tags=set([])) + + +def clean_html(html): + # clean_html barfs on an empty string + if not html: + return u'' + + return HTML_CLEANER.clean_html(html) + + +def convert_to_tag_list_of_dicts(tag_string): + """ + Filter input from incoming string containing user tags, + + Strips trailing, leading, and internal whitespace, and also converts + the "tags" text into an array of tags + """ + taglist = [] + if tag_string: + + # Strip out internal, trailing, and leading whitespace + stripped_tag_string = u' '.join(tag_string.strip().split()) + + # Split the tag string into a list of tags + for tag in stripped_tag_string.split( + mg_globals.app_config['tags_delimiter']): + + # Ignore empty or duplicate tags + if tag.strip() and tag.strip() not in [t['name'] for t in taglist]: + + taglist.append({'name': tag.strip(), + 'slug': url.slugify(tag.strip())}) + return taglist + + +def media_tags_as_string(media_entry_tags): + """ + Generate a string from a media item's tags, stored as a list of dicts + + This is the opposite of convert_to_tag_list_of_dicts + """ + media_tag_string = '' + if media_entry_tags: + media_tag_string = mg_globals.app_config['tags_delimiter'].join( + [tag['name'] for tag in media_entry_tags]) + return media_tag_string + + +TOO_LONG_TAG_WARNING = \ + u'Tags must be shorter than %s characters. Tags that are too long: %s' + + +def tag_length_validator(form, field): + """ + Make sure tags do not exceed the maximum tag length. + """ + tags = convert_to_tag_list_of_dicts(field.data) + too_long_tags = [ + tag['name'] for tag in tags + if len(tag['name']) > mg_globals.app_config['tags_max_length']] + + if too_long_tags: + raise wtforms.ValidationError( + TOO_LONG_TAG_WARNING % (mg_globals.app_config['tags_max_length'], \ + ', '.join(too_long_tags))) + + +MARKDOWN_INSTANCE = markdown.Markdown(safe_mode='escape') + + +def cleaned_markdown_conversion(text): + """ + Take a block of text, run it through MarkDown, and clean its HTML. + """ + # Markdown will do nothing with and clean_html can do nothing with + # an empty string :) + if not text: + return u'' + + return clean_html(MARKDOWN_INSTANCE.convert(text)) diff --git a/mediagoblin/tools/translate.py b/mediagoblin/tools/translate.py new file mode 100644 index 00000000..b99c4aa4 --- /dev/null +++ b/mediagoblin/tools/translate.py @@ -0,0 +1,172 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import gettext +import pkg_resources +from babel.localedata import exists +from babel.support import LazyProxy + +from mediagoblin import mg_globals + +################### +# Translation tools +################### + + +TRANSLATIONS_PATH = pkg_resources.resource_filename( + 'mediagoblin', 'i18n') + + +def locale_to_lower_upper(locale): + """ + Take a locale, regardless of style, and format it like "en-us" + """ + if '-' in locale: + lang, country = locale.split('-', 1) + return '%s_%s' % (lang.lower(), country.upper()) + elif '_' in locale: + lang, country = locale.split('_', 1) + return '%s_%s' % (lang.lower(), country.upper()) + else: + return locale.lower() + + +def locale_to_lower_lower(locale): + """ + Take a locale, regardless of style, and format it like "en_US" + """ + if '_' in locale: + lang, country = locale.split('_', 1) + return '%s-%s' % (lang.lower(), country.lower()) + else: + return locale.lower() + + +def get_locale_from_request(request): + """ + Figure out what target language is most appropriate based on the + request + """ + request_form = request.GET or request.POST + + if request_form.has_key('lang'): + return locale_to_lower_upper(request_form['lang']) + + # Your routing can explicitly specify a target language + matchdict = request.matchdict or {} + + if matchdict.has_key('locale'): + target_lang = matchdict['locale'] + elif request.session.has_key('target_lang'): + target_lang = request.session['target_lang'] + # Pull the first acceptable language or English + else: + # WebOb recently changed how it handles determining best language. + # Here's a compromise commit that handles either/or... + if hasattr(request.accept_language, "best_matches"): + accept_lang_matches = request.accept_language.best_matches() + if accept_lang_matches: + target_lang = accept_lang_matches[0] + else: + target_lang = 'en' + else: + target_lang = request.accept.best_match( + request.accept_language, 'en') + + return locale_to_lower_upper(target_lang) + +SETUP_GETTEXTS = {} + +def setup_gettext(locale): + """ + Setup the gettext instance based on this locale + """ + # Later on when we have plugins we may want to enable the + # multi-translations system they have so we can handle plugin + # translations too + + # TODO: fallback nicely on translations from pt_PT to pt if not + # available, etc. + if SETUP_GETTEXTS.has_key(locale): + this_gettext = SETUP_GETTEXTS[locale] + else: + this_gettext = gettext.translation( + 'mediagoblin', TRANSLATIONS_PATH, [locale], fallback=True) + if exists(locale): + SETUP_GETTEXTS[locale] = this_gettext + + mg_globals.setup_globals( + translations=this_gettext) + + +# Force en to be setup before anything else so that +# mg_globals.translations is never None +setup_gettext('en') + + +def pass_to_ugettext(*args, **kwargs): + """ + Pass a translation on to the appropriate ugettext method. + + The reason we can't have a global ugettext method is because + mg_globals gets swapped out by the application per-request. + """ + return mg_globals.translations.ugettext( + *args, **kwargs) + + +def lazy_pass_to_ugettext(*args, **kwargs): + """ + Lazily pass to ugettext. + + This is useful if you have to define a translation on a module + level but you need it to not translate until the time that it's + used as a string. + """ + return LazyProxy(pass_to_ugettext, *args, **kwargs) + + +def pass_to_ngettext(*args, **kwargs): + """ + Pass a translation on to the appropriate ngettext method. + + The reason we can't have a global ngettext method is because + mg_globals gets swapped out by the application per-request. + """ + return mg_globals.translations.ngettext( + *args, **kwargs) + + +def lazy_pass_to_ngettext(*args, **kwargs): + """ + Lazily pass to ngettext. + + This is useful if you have to define a translation on a module + level but you need it to not translate until the time that it's + used as a string. + """ + return LazyProxy(pass_to_ngettext, *args, **kwargs) + + +def fake_ugettext_passthrough(string): + """ + Fake a ugettext call for extraction's sake ;) + + In wtforms there's a separate way to define a method to translate + things... so we just need to mark up the text so that it can be + extracted, not so that it's actually run through gettext. + """ + return string diff --git a/mediagoblin/tools/url.py b/mediagoblin/tools/url.py new file mode 100644 index 00000000..78b5dd63 --- /dev/null +++ b/mediagoblin/tools/url.py @@ -0,0 +1,33 @@ +# 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/>. + +import re +import translitcodec + + +_punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+') + + +def slugify(text, delim=u'-'): + """ + Generates an ASCII-only slug. Taken from http://flask.pocoo.org/snippets/5/ + """ + result = [] + for word in _punct_re.split(text.lower()): + word = word.encode('translit/long') + if word: + result.append(word) + return unicode(delim.join(result)) diff --git a/mediagoblin/user_pages/forms.py b/mediagoblin/user_pages/forms.py index 57061d34..301f1f0a 100644 --- a/mediagoblin/user_pages/forms.py +++ b/mediagoblin/user_pages/forms.py @@ -16,7 +16,7 @@ import wtforms -from mediagoblin.util import fake_ugettext_passthrough as _ +from mediagoblin.tools.translate import fake_ugettext_passthrough as _ class MediaCommentForm(wtforms.Form): diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index e6ba6b79..2090d6fd 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -18,10 +18,11 @@ from webob import exc from mediagoblin import messages, mg_globals from mediagoblin.db.util import DESCENDING, ObjectId -from mediagoblin.util import ( - Pagination, render_to_response, redirect, cleaned_markdown_conversion, - render_404, delete_media_files) -from mediagoblin.util import pass_to_ugettext as _ +from mediagoblin.tools.text import cleaned_markdown_conversion +from mediagoblin.tools.response import render_to_response, render_404, redirect +from mediagoblin.tools.translate import pass_to_ugettext as _ +from mediagoblin.tools.pagination import Pagination +from mediagoblin.tools.files import delete_media_files from mediagoblin.user_pages import forms as user_forms from mediagoblin.decorators import (uses_pagination, get_user_media_entry, @@ -125,27 +126,34 @@ def media_home(request, media, page, **kwargs): 'app_config': mg_globals.app_config}) +@get_user_media_entry @require_active_login -def media_post_comment(request): +def media_post_comment(request, media): """ recieves POST from a MediaEntry() comment form, saves the comment. """ + assert request.method == 'POST' + comment = request.db.MediaComment() - comment['media_entry'] = ObjectId(request.matchdict['media']) + comment['media_entry'] = media['_id'] comment['author'] = request.user['_id'] comment['content'] = unicode(request.POST['comment_content']) - comment['content_html'] = cleaned_markdown_conversion(comment['content']) - comment.save() + if not comment['content'].strip(): + messages.add_message( + request, + messages.ERROR, + _("Empty comments are not allowed.")) + else: + comment.save() - messages.add_message( - request, messages.SUCCESS, - 'Comment posted!') + messages.add_message( + request, messages.SUCCESS, + _('Comment posted!')) - return redirect(request, 'mediagoblin.user_pages.media_home', - media=request.matchdict['media'], - user=request.matchdict['user']) + return exc.HTTPFound( + location=media.url_for_self(request.urlgen)) @get_user_media_entry diff --git a/mediagoblin/util.py b/mediagoblin/util.py deleted file mode 100644 index d6ce5930..00000000 --- a/mediagoblin/util.py +++ /dev/null @@ -1,705 +0,0 @@ -# GNU MediaGoblin -- federated, autonomous media hosting -# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import division - -from email.MIMEText import MIMEText -import gettext -import pkg_resources -import smtplib -import sys -import re -import urllib -from math import ceil, floor -import copy -import wtforms - -from babel.localedata import exists -from babel.support import LazyProxy -import jinja2 -import translitcodec -from webob import Response, exc -from lxml.html.clean import Cleaner -import markdown -from wtforms.form import Form - -from mediagoblin import mg_globals -from mediagoblin import messages -from mediagoblin.db.util import ObjectId - -from itertools import izip, count - -DISPLAY_IMAGE_FETCHING_ORDER = [u'medium', u'original', u'thumb'] - -TESTS_ENABLED = False - - -def _activate_testing(): - """ - Call this to activate testing in util.py - """ - global TESTS_ENABLED - TESTS_ENABLED = True - - -def clear_test_buckets(): - """ - We store some things for testing purposes that should be cleared - when we want a "clean slate" of information for our next round of - tests. Call this function to wipe all that stuff clean. - - Also wipes out some other things we might redefine during testing, - like the jinja envs. - """ - global SETUP_JINJA_ENVS - SETUP_JINJA_ENVS = {} - - global EMAIL_TEST_INBOX - global EMAIL_TEST_MBOX_INBOX - EMAIL_TEST_INBOX = [] - EMAIL_TEST_MBOX_INBOX = [] - - clear_test_template_context() - - -SETUP_JINJA_ENVS = {} - - -def get_jinja_env(template_loader, locale): - """ - Set up the Jinja environment, - - (In the future we may have another system for providing theming; - for now this is good enough.) - """ - setup_gettext(locale) - - # If we have a jinja environment set up with this locale, just - # return that one. - if locale in SETUP_JINJA_ENVS: - return SETUP_JINJA_ENVS[locale] - - template_env = jinja2.Environment( - loader=template_loader, autoescape=True, - extensions=['jinja2.ext.i18n', 'jinja2.ext.autoescape']) - - template_env.install_gettext_callables( - mg_globals.translations.ugettext, - mg_globals.translations.ungettext) - - # All templates will know how to ... - # ... fetch all waiting messages and remove them from the queue - # ... construct a grid of thumbnails or other media - template_env.globals['fetch_messages'] = messages.fetch_messages - template_env.globals['gridify_list'] = gridify_list - template_env.globals['gridify_cursor'] = gridify_cursor - - if exists(locale): - SETUP_JINJA_ENVS[locale] = template_env - - return template_env - - -# We'll store context information here when doing unit tests -TEMPLATE_TEST_CONTEXT = {} - - -def render_template(request, template_path, context): - """ - Render a template with context. - - Always inserts the request into the context, so you don't have to. - Also stores the context if we're doing unit tests. Helpful! - """ - template = request.template_env.get_template( - template_path) - context['request'] = request - rendered = template.render(context) - - if TESTS_ENABLED: - TEMPLATE_TEST_CONTEXT[template_path] = context - - return rendered - - -def clear_test_template_context(): - global TEMPLATE_TEST_CONTEXT - TEMPLATE_TEST_CONTEXT = {} - - -def render_to_response(request, template, context, status=200): - """Much like Django's shortcut.render()""" - return Response( - render_template(request, template, context), - status=status) - - -def redirect(request, *args, **kwargs): - """Returns a HTTPFound(), takes a request and then urlgen params""" - - querystring = None - if kwargs.get('querystring'): - querystring = kwargs.get('querystring') - del kwargs['querystring'] - - return exc.HTTPFound( - location=''.join([ - request.urlgen(*args, **kwargs), - querystring if querystring else ''])) - - -def setup_user_in_request(request): - """ - Examine a request and tack on a request.user parameter if that's - appropriate. - """ - if not 'user_id' in request.session: - request.user = None - return - - user = None - user = request.app.db.User.one( - {'_id': ObjectId(request.session['user_id'])}) - - if not user: - # Something's wrong... this user doesn't exist? Invalidate - # this session. - request.session.invalidate() - - request.user = user - - -def import_component(import_string): - """ - Import a module component defined by STRING. Probably a method, - class, or global variable. - - Args: - - import_string: a string that defines what to import. Written - in the format of "module1.module2:component" - """ - module_name, func_name = import_string.split(':', 1) - __import__(module_name) - module = sys.modules[module_name] - func = getattr(module, func_name) - return func - -_punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+') - - -def slugify(text, delim=u'-'): - """ - Generates an ASCII-only slug. Taken from http://flask.pocoo.org/snippets/5/ - """ - result = [] - for word in _punct_re.split(text.lower()): - word = word.encode('translit/long') - if word: - result.append(word) - return unicode(delim.join(result)) - -### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -### Special email test stuff begins HERE -### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -# We have two "test inboxes" here: -# -# EMAIL_TEST_INBOX: -# ---------------- -# If you're writing test views, you'll probably want to check this. -# It contains a list of MIMEText messages. -# -# EMAIL_TEST_MBOX_INBOX: -# ---------------------- -# This collects the messages from the FakeMhost inbox. It's reslly -# just here for testing the send_email method itself. -# -# Anyway this contains: -# - from -# - to: a list of email recipient addresses -# - message: not just the body, but the whole message, including -# headers, etc. -# -# ***IMPORTANT!*** -# ---------------- -# Before running tests that call functions which send email, you should -# always call _clear_test_inboxes() to "wipe" the inboxes clean. - -EMAIL_TEST_INBOX = [] -EMAIL_TEST_MBOX_INBOX = [] - - -class FakeMhost(object): - """ - Just a fake mail host so we can capture and test messages - from send_email - """ - def login(self, *args, **kwargs): - pass - - def sendmail(self, from_addr, to_addrs, message): - EMAIL_TEST_MBOX_INBOX.append( - {'from': from_addr, - 'to': to_addrs, - 'message': message}) - - -def _clear_test_inboxes(): - global EMAIL_TEST_INBOX - global EMAIL_TEST_MBOX_INBOX - EMAIL_TEST_INBOX = [] - EMAIL_TEST_MBOX_INBOX = [] - -### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -### </Special email test stuff> -### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - -def send_email(from_addr, to_addrs, subject, message_body): - """ - Simple email sending wrapper, use this so we can capture messages - for unit testing purposes. - - Args: - - from_addr: address you're sending the email from - - to_addrs: list of recipient email addresses - - subject: subject of the email - - message_body: email body text - """ - if TESTS_ENABLED or mg_globals.app_config['email_debug_mode']: - mhost = FakeMhost() - elif not mg_globals.app_config['email_debug_mode']: - mhost = smtplib.SMTP( - mg_globals.app_config['email_smtp_host'], - mg_globals.app_config['email_smtp_port']) - - # SMTP.__init__ Issues SMTP.connect implicitly if host - if not mg_globals.app_config['email_smtp_host']: # e.g. host = '' - mhost.connect() # We SMTP.connect explicitly - - if mg_globals.app_config['email_smtp_user'] \ - or mg_globals.app_config['email_smtp_pass']: - mhost.login( - mg_globals.app_config['email_smtp_user'], - mg_globals.app_config['email_smtp_pass']) - - message = MIMEText(message_body.encode('utf-8'), 'plain', 'utf-8') - message['Subject'] = subject - message['From'] = from_addr - message['To'] = ', '.join(to_addrs) - - if TESTS_ENABLED: - EMAIL_TEST_INBOX.append(message) - - if mg_globals.app_config['email_debug_mode']: - print u"===== Email =====" - print u"From address: %s" % message['From'] - print u"To addresses: %s" % message['To'] - print u"Subject: %s" % message['Subject'] - print u"-- Body: --" - print message.get_payload(decode=True) - - return mhost.sendmail(from_addr, to_addrs, message.as_string()) - - -################### -# Translation tools -################### - - -TRANSLATIONS_PATH = pkg_resources.resource_filename( - 'mediagoblin', 'i18n') - - -def locale_to_lower_upper(locale): - """ - Take a locale, regardless of style, and format it like "en-us" - """ - if '-' in locale: - lang, country = locale.split('-', 1) - return '%s_%s' % (lang.lower(), country.upper()) - elif '_' in locale: - lang, country = locale.split('_', 1) - return '%s_%s' % (lang.lower(), country.upper()) - else: - return locale.lower() - - -def locale_to_lower_lower(locale): - """ - Take a locale, regardless of style, and format it like "en_US" - """ - if '_' in locale: - lang, country = locale.split('_', 1) - return '%s-%s' % (lang.lower(), country.lower()) - else: - return locale.lower() - - -def get_locale_from_request(request): - """ - Figure out what target language is most appropriate based on the - request - """ - request_form = request.GET or request.POST - - if 'lang' in request_form: - return locale_to_lower_upper(request_form['lang']) - - accept_lang_matches = request.accept_language.best_matches() - - # Your routing can explicitly specify a target language - matchdict = request.matchdict or {} - - if 'locale' in matchdict: - target_lang = matchdict['locale'] - elif 'target_lang' in request.session: - target_lang = request.session['target_lang'] - # Pull the first acceptable language - elif accept_lang_matches: - target_lang = accept_lang_matches[0] - # Fall back to English - else: - target_lang = 'en' - - return locale_to_lower_upper(target_lang) - - -# A super strict version of the lxml.html cleaner class -HTML_CLEANER = Cleaner( - scripts=True, - javascript=True, - comments=True, - style=True, - links=True, - page_structure=True, - processing_instructions=True, - embedded=True, - frames=True, - forms=True, - annoying_tags=True, - allow_tags=[ - 'div', 'b', 'i', 'em', 'strong', 'p', 'ul', 'ol', 'li', 'a', 'br'], - remove_unknown_tags=False, # can't be used with allow_tags - safe_attrs_only=True, - add_nofollow=True, # for now - host_whitelist=(), - whitelist_tags=set([])) - - -def clean_html(html): - # clean_html barfs on an empty string - if not html: - return u'' - - return HTML_CLEANER.clean_html(html) - - -def convert_to_tag_list_of_dicts(tag_string): - """ - Filter input from incoming string containing user tags, - - Strips trailing, leading, and internal whitespace, and also converts - the "tags" text into an array of tags - """ - taglist = [] - if tag_string: - - # Strip out internal, trailing, and leading whitespace - stripped_tag_string = u' '.join(tag_string.strip().split()) - - # Split the tag string into a list of tags - for tag in stripped_tag_string.split( - mg_globals.app_config['tags_delimiter']): - - # Ignore empty or duplicate tags - if tag.strip() and tag.strip() not in [t['name'] for t in taglist]: - - taglist.append({'name': tag.strip(), - 'slug': slugify(tag.strip())}) - return taglist - - -def media_tags_as_string(media_entry_tags): - """ - Generate a string from a media item's tags, stored as a list of dicts - - This is the opposite of convert_to_tag_list_of_dicts - """ - media_tag_string = '' - if media_entry_tags: - media_tag_string = mg_globals.app_config['tags_delimiter'].join( - [tag['name'] for tag in media_entry_tags]) - return media_tag_string - -TOO_LONG_TAG_WARNING = \ - u'Tags must be shorter than %s characters. Tags that are too long: %s' - - -def tag_length_validator(form, field): - """ - Make sure tags do not exceed the maximum tag length. - """ - tags = convert_to_tag_list_of_dicts(field.data) - too_long_tags = [ - tag['name'] for tag in tags - if len(tag['name']) > mg_globals.app_config['tags_max_length']] - - if too_long_tags: - raise wtforms.ValidationError( - TOO_LONG_TAG_WARNING % (mg_globals.app_config['tags_max_length'], \ - ', '.join(too_long_tags))) - - -MARKDOWN_INSTANCE = markdown.Markdown(safe_mode='escape') - - -def cleaned_markdown_conversion(text): - """ - Take a block of text, run it through MarkDown, and clean its HTML. - """ - # Markdown will do nothing with and clean_html can do nothing with - # an empty string :) - if not text: - return u'' - - return clean_html(MARKDOWN_INSTANCE.convert(text)) - - -SETUP_GETTEXTS = {} - - -def setup_gettext(locale): - """ - Setup the gettext instance based on this locale - """ - # Later on when we have plugins we may want to enable the - # multi-translations system they have so we can handle plugin - # translations too - - # TODO: fallback nicely on translations from pt_PT to pt if not - # available, etc. - if locale in SETUP_GETTEXTS: - this_gettext = SETUP_GETTEXTS[locale] - else: - this_gettext = gettext.translation( - 'mediagoblin', TRANSLATIONS_PATH, [locale], fallback=True) - if exists(locale): - SETUP_GETTEXTS[locale] = this_gettext - - mg_globals.setup_globals( - translations=this_gettext) - - -# Force en to be setup before anything else so that -# mg_globals.translations is never None -setup_gettext('en') - - -def pass_to_ugettext(*args, **kwargs): - """ - Pass a translation on to the appropriate ugettext method. - - The reason we can't have a global ugettext method is because - mg_globals gets swapped out by the application per-request. - """ - return mg_globals.translations.ugettext( - *args, **kwargs) - - -def lazy_pass_to_ugettext(*args, **kwargs): - """ - Lazily pass to ugettext. - - This is useful if you have to define a translation on a module - level but you need it to not translate until the time that it's - used as a string. - """ - return LazyProxy(pass_to_ugettext, *args, **kwargs) - - -def pass_to_ngettext(*args, **kwargs): - """ - Pass a translation on to the appropriate ngettext method. - - The reason we can't have a global ngettext method is because - mg_globals gets swapped out by the application per-request. - """ - return mg_globals.translations.ngettext( - *args, **kwargs) - - -def lazy_pass_to_ngettext(*args, **kwargs): - """ - Lazily pass to ngettext. - - This is useful if you have to define a translation on a module - level but you need it to not translate until the time that it's - used as a string. - """ - return LazyProxy(pass_to_ngettext, *args, **kwargs) - - -def fake_ugettext_passthrough(string): - """ - Fake a ugettext call for extraction's sake ;) - - In wtforms there's a separate way to define a method to translate - things... so we just need to mark up the text so that it can be - extracted, not so that it's actually run through gettext. - """ - return string - - -PAGINATION_DEFAULT_PER_PAGE = 30 - - -class Pagination(object): - """ - Pagination class for mongodb queries. - - Initialization through __init__(self, cursor, page=1, per_page=2), - get actual data slice through __call__(). - """ - - def __init__(self, page, cursor, per_page=PAGINATION_DEFAULT_PER_PAGE, - jump_to_id=False): - """ - Initializes Pagination - - Args: - - page: requested page - - per_page: number of objects per page - - cursor: db cursor - - jump_to_id: ObjectId, sets the page to the page containing the - object with _id == jump_to_id. - """ - self.page = page - self.per_page = per_page - self.cursor = cursor - self.total_count = self.cursor.count() - self.active_id = None - - if jump_to_id: - cursor = copy.copy(self.cursor) - - for (doc, increment) in izip(cursor, count(0)): - if doc['_id'] == jump_to_id: - self.page = 1 + int(floor(increment / self.per_page)) - - self.active_id = jump_to_id - break - - def __call__(self): - """ - Returns slice of objects for the requested page - """ - return self.cursor.skip( - (self.page - 1) * self.per_page).limit(self.per_page) - - @property - def pages(self): - return int(ceil(self.total_count / float(self.per_page))) - - @property - def has_prev(self): - return self.page > 1 - - @property - def has_next(self): - return self.page < self.pages - - def iter_pages(self, left_edge=2, left_current=2, - right_current=5, right_edge=2): - last = 0 - for num in xrange(1, self.pages + 1): - if num <= left_edge or \ - (num > self.page - left_current - 1 and \ - num < self.page + right_current) or \ - num > self.pages - right_edge: - if last + 1 != num: - yield None - yield num - last = num - - def get_page_url_explicit(self, base_url, get_params, page_no): - """Get a page url by adding a page= parameter to the base url - """ - new_get_params = copy.copy(get_params or {}) - new_get_params['page'] = page_no - return "%s?%s" % ( - base_url, urllib.urlencode(new_get_params)) - - def get_page_url(self, request, page_no): - """Get a new page url based of the request, and the new page number. - - This is a nice wrapper around get_page_url_explicit() - """ - return self.get_page_url_explicit( - request.path_info, request.GET, page_no) - - -def gridify_list(this_list, num_cols=5): - """ - Generates a list of lists where each sub-list's length depends on - the number of columns in the list - """ - grid = [] - - # Figure out how many rows we should have - num_rows = int(ceil(float(len(this_list)) / num_cols)) - - for row_num in range(num_rows): - slice_min = row_num * num_cols - slice_max = (row_num + 1) * num_cols - - row = this_list[slice_min:slice_max] - - grid.append(row) - - return grid - - -def gridify_cursor(this_cursor, num_cols=5): - """ - Generates a list of lists where each sub-list's length depends on - the number of columns in the list - """ - return gridify_list(list(this_cursor), num_cols) - - -def render_404(request): - """ - Render a 404. - """ - return render_to_response( - request, 'mediagoblin/404.html', {}, status=400) - - -def delete_media_files(media): - """ - Delete all files associated with a MediaEntry - - Arguments: - - media: A MediaEntry document - """ - for listpath in media['media_files'].itervalues(): - mg_globals.public_store.delete_file( - listpath) - - for attachment in media['attachment_files']: - mg_globals.public_store.delete_file( - attachment['filepath']) diff --git a/mediagoblin/views.py b/mediagoblin/views.py index afa6ac91..ecf5b723 100644 --- a/mediagoblin/views.py +++ b/mediagoblin/views.py @@ -15,7 +15,8 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. from mediagoblin import mg_globals -from mediagoblin.util import render_to_response, Pagination +from mediagoblin.tools.pagination import Pagination +from mediagoblin.tools.response import render_to_response from mediagoblin.db.util import DESCENDING from mediagoblin.decorators import uses_pagination |