From 93bdab9daad3ae431afd41a2efaefae05a555d88 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Fri, 23 Sep 2011 02:35:57 +0200 Subject: Multimedia support - Commiting from a not yet finished state - Details below * DONE Initially testing with arista ** DONE Video display templates *** TODO Multi-browser support ** TODO Video thumbnails ** TODO Link to original video ** TODO Video cropping Also contains a lot of "debug" print's --- mediagoblin/db/migrations.py | 8 + mediagoblin/init/celery/__init__.py | 5 + mediagoblin/media_types/__init__.py | 70 ++++++ mediagoblin/media_types/image/__init__.py | 28 +++ mediagoblin/media_types/image/processing.py | 207 ++++++++++++++++ mediagoblin/media_types/video/__init__.py | 26 +++ mediagoblin/media_types/video/processing.py | 260 +++++++++++++++++++++ mediagoblin/storage/cloudfiles.py | 10 +- mediagoblin/submit/views.py | 13 +- .../mediagoblin/media_displays/image.html | 1 + .../mediagoblin/media_displays/video.html | 8 + .../templates/mediagoblin/user_pages/media.html | 32 +-- mediagoblin/user_pages/views.py | 6 +- 13 files changed, 650 insertions(+), 24 deletions(-) create mode 100644 mediagoblin/media_types/__init__.py create mode 100644 mediagoblin/media_types/image/__init__.py create mode 100644 mediagoblin/media_types/image/processing.py create mode 100644 mediagoblin/media_types/video/__init__.py create mode 100644 mediagoblin/media_types/video/processing.py create mode 100644 mediagoblin/templates/mediagoblin/media_displays/image.html create mode 100644 mediagoblin/templates/mediagoblin/media_displays/video.html diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 755f49c5..01df7208 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -107,3 +107,11 @@ def user_add_forgot_password_token_and_expires(database): {'fp_token_expire': {'$exists': False}}, {'$set': {'fp_token_expire': None}}, multi=True) + + +@RegisterMigration(7) +def media_type_image_to_multimedia_type_image(database): + database['media_entries'].update( + {'media_type': 'image'}, + {'$set': {'media_type': 'mediagoblin.media_types.image'}}, + multi=True) diff --git a/mediagoblin/init/celery/__init__.py b/mediagoblin/init/celery/__init__.py index c58b1305..05c54b05 100644 --- a/mediagoblin/init/celery/__init__.py +++ b/mediagoblin/init/celery/__init__.py @@ -17,8 +17,13 @@ import os import sys +from mediagoblin.media_types import get_media_types + MANDATORY_CELERY_IMPORTS = ['mediagoblin.process_media'] +MANDATORY_CELERY_IMPORTS = [i for i in get_media_types()] + +print(MANDATORY_CELERY_IMPORTS) DEFAULT_SETTINGS_MODULE = 'mediagoblin.init.celery.dummy_settings_module' diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py new file mode 100644 index 00000000..67dab418 --- /dev/null +++ b/mediagoblin/media_types/__init__.py @@ -0,0 +1,70 @@ +# 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 . + +import os +import sys + +class FileTypeNotSupported(Exception): + pass + +class InvalidFileType(Exception): + pass + +MEDIA_TYPES = [ + 'mediagoblin.media_types.image', + 'mediagoblin.media_types.video'] + + +def get_media_types(): + for media_type in MEDIA_TYPES: + yield media_type + + +def get_media_managers(): + for media_type in get_media_types(): + ''' + FIXME + __import__ returns the lowest-level module. If the plugin is located + outside the conventional plugin module tree, it will not be loaded + properly because of the [...]ugin.media_types. + + We need this if we want to support a separate site-specific plugin + folder. + ''' + try: + __import__(media_type) + except ImportError as e: + raise Exception('ERROR: Could not import {0}: {1}'.format(media_type, e)) + + yield media_type, sys.modules[media_type].MEDIA_MANAGER + +def get_media_manager(_media_type = None): + for media_type, manager in get_media_managers(): + if media_type in _media_type: + return manager + + +def get_media_type_and_manager(filename): + for media_type, manager in get_media_managers(): + if filename.find('.') > 0: + ext = os.path.splitext(filename)[1].lower() + else: + raise InvalidFileType( + 'Could not find any file extension in "{0}"'.format( + filename)) + + if ext[1:] in manager['accepted_extensions']: + return media_type, manager diff --git a/mediagoblin/media_types/image/__init__.py b/mediagoblin/media_types/image/__init__.py new file mode 100644 index 00000000..0cd0383f --- /dev/null +++ b/mediagoblin/media_types/image/__init__.py @@ -0,0 +1,28 @@ +# 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 . + +from mediagoblin.media_types.image.processing import process_media + + +MEDIA_MANAGER = { + "human_readable": "Image", + "processor": process_media, # alternately a string, + # 'mediagoblin.media_types.image.processing'? + "display_template": "mediagoblin/media_displays/image.html", + "default_thumb": "images/media_thumbs/image.jpg", + "accepted_extensions": ["jpg", "jpeg", "png", "gif", "tiff"], + "accepted_mimetypes": [ + "image/jpeg", "image/png", "image/gif", "image/tiff"]} diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py new file mode 100644 index 00000000..2c4ad2b1 --- /dev/null +++ b/mediagoblin/media_types/image/processing.py @@ -0,0 +1,207 @@ +# 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 . + +import Image + +from celery.task import Task +from celery import registry + +from mediagoblin.db.util import ObjectId +from mediagoblin import mg_globals as mgg + +from mediagoblin.util import lazy_pass_to_ugettext as _ + +THUMB_SIZE = 180, 180 +MEDIUM_SIZE = 640, 640 + + +def create_pub_filepath(entry, filename): + return mgg.public_store.get_unique_filepath( + ['media_entries', + unicode(entry['_id']), + filename]) + + +class BaseProcessingFail(Exception): + """ + Base exception that all other processing failure messages should + subclass from. + + You shouldn't call this itself; instead you should subclass it + and provid the exception_path and general_message applicable to + this error. + """ + general_message = u'' + + @property + def exception_path(self): + return u"%s:%s" % ( + self.__class__.__module__, self.__class__.__name__) + + def __init__(self, **metadata): + self.metadata = metadata or {} + + +class BadMediaFail(BaseProcessingFail): + """ + Error that should be raised when an inappropriate file was given + for the media type specified. + """ + general_message = _(u'Invalid file given for media type.') + + +################################ +# Media processing initial steps +################################ + +class ProcessMedia(Task): + """ + Pass this entry off for processing. + """ + def run(self, media_id): + """ + Pass the media entry off to the appropriate processing function + (for now just process_image...) + """ + entry = mgg.database.MediaEntry.one( + {'_id': ObjectId(media_id)}) + + # Try to process, and handle expected errors. + try: + process_image(entry) + except BaseProcessingFail, exc: + mark_entry_failed(entry[u'_id'], exc) + return + + entry['state'] = u'processed' + entry.save() + + def on_failure(self, exc, task_id, args, kwargs, einfo): + """ + If the processing failed we should mark that in the database. + + Assuming that the exception raised is a subclass of BaseProcessingFail, + we can use that to get more information about the failure and store that + for conveying information to users about the failure, etc. + """ + entry_id = args[0] + mark_entry_failed(entry_id, exc) + + +process_media = registry.tasks[ProcessMedia.name] + + +def mark_entry_failed(entry_id, exc): + """ + Mark a media entry as having failed in its conversion. + + Uses the exception that was raised to mark more information. If the + exception is a derivative of BaseProcessingFail then we can store extra + information that can be useful for users telling them why their media failed + to process. + + Args: + - entry_id: The id of the media entry + + """ + # Was this a BaseProcessingFail? In other words, was this a + # type of error that we know how to handle? + if isinstance(exc, BaseProcessingFail): + # Looks like yes, so record information about that failure and any + # metadata the user might have supplied. + mgg.database['media_entries'].update( + {'_id': entry_id}, + {'$set': {u'state': u'failed', + u'fail_error': exc.exception_path, + u'fail_metadata': exc.metadata}}) + else: + # Looks like no, so just mark it as failed and don't record a + # failure_error (we'll assume it wasn't handled) and don't record + # metadata (in fact overwrite it if somehow it had previous info + # here) + mgg.database['media_entries'].update( + {'_id': entry_id}, + {'$set': {u'state': u'failed', + u'fail_error': None, + u'fail_metadata': {}}}) + + +def process_image(entry): + """ + Code to process an image + """ + workbench = mgg.workbench_manager.create_workbench() + + queued_filepath = entry['queued_media_file'] + queued_filename = workbench.localized_file( + mgg.queue_store, queued_filepath, + 'source') + + 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_file = mgg.public_store.get_file(thumb_filepath, 'w') + + with thumb_file: + thumb.save(thumb_file, "JPEG", quality=90) + + # 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 + # entry. + medium = Image.open(queued_filename) + medium_processed = False + + 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_file = mgg.public_store.get_file(medium_filepath, 'w') + + with medium_file: + medium.save(medium_file, "JPEG", quality=90) + medium_processed = True + + # we have to re-read because unlike PIL, not everything reads + # things in string representation :) + queued_file = file(queued_filename, 'rb') + + with queued_file: + original_filepath = create_pub_filepath(entry, queued_filepath[-1]) + + with mgg.public_store.get_file(original_filepath, 'wb') as original_file: + original_file.write(queued_file.read()) + + mgg.queue_store.delete_file(queued_filepath) + entry['queued_media_file'] = [] + media_files_dict = entry.setdefault('media_files', {}) + media_files_dict['thumb'] = thumb_filepath + media_files_dict['original'] = original_filepath + if medium_processed: + media_files_dict['medium'] = medium_filepath + + # clean up workbench + workbench.destroy_self() diff --git a/mediagoblin/media_types/video/__init__.py b/mediagoblin/media_types/video/__init__.py new file mode 100644 index 00000000..2a36623e --- /dev/null +++ b/mediagoblin/media_types/video/__init__.py @@ -0,0 +1,26 @@ +# 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 . + +from mediagoblin.media_types.video.processing import process_media + + +MEDIA_MANAGER = { + "human_readable": "Video", + "processor": process_media, # alternately a string, + # 'mediagoblin.media_types.image.processing'? + "display_template": "mediagoblin/media_displays/video.html", + "default_thumb": "images/media_thumbs/video.jpg", + "accepted_extensions": ["mp4", "mov", "webm", "avi", "3gp", "3gpp"]} diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py new file mode 100644 index 00000000..94784836 --- /dev/null +++ b/mediagoblin/media_types/video/processing.py @@ -0,0 +1,260 @@ +# 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 . + +import Image +import tempfile + +from celery.task import Task +from celery import registry + +from mediagoblin.db.util import ObjectId +from mediagoblin import mg_globals as mgg + +from mediagoblin.util import lazy_pass_to_ugettext as _ + +import gobject + +import gst +import arista + +from arista.transcoder import TranscoderOptions + +THUMB_SIZE = 180, 180 +MEDIUM_SIZE = 640, 640 +ARISTA_DEVICE_KEY = 'web' + + +loop = None + + +def process_video(entry): + """ + Code to process a video + """ + info = {} + workbench = mgg.workbench_manager.create_workbench() + + queued_filepath = entry['queued_media_file'] + queued_filename = workbench.localized_file( + mgg.queue_store, queued_filepath, + 'source') + + arista.init() + + devices = arista.presets.get() + device = devices[ARISTA_DEVICE_KEY] + + queue = arista.queue.TranscodeQueue() + + info['tmp_file'] = tmp_file = tempfile.NamedTemporaryFile() + + info['medium_filepath'] = medium_filepath = create_pub_filepath(entry, 'video.webm') + + output = tmp_file.name + + uri = 'file://' + queued_filename + + preset = device.presets[device.default] + + opts = TranscoderOptions(uri, preset, output) + + queue.append(opts) + + info['entry'] = entry + + queue.connect("entry-start", entry_start, info) +# queue.connect("entry-pass-setup", entry_pass_setup, options) + queue.connect("entry-error", entry_error, info) + queue.connect("entry-complete", entry_complete, info) + + info['loop'] = loop = gobject.MainLoop() + + loop.run() + + # we have to re-read because unlike PIL, not everything reads + # things in string representation :) + queued_file = file(queued_filename, 'rb') + + with queued_file: + original_filepath = create_pub_filepath(entry, queued_filepath[-1]) + + with mgg.public_store.get_file(original_filepath, 'wb') as original_file: + original_file.write(queued_file.read()) + + mgg.queue_store.delete_file(queued_filepath) + entry['queued_media_file'] = [] + media_files_dict = entry.setdefault('media_files', {}) + media_files_dict['original'] = original_filepath + + # clean up workbench + workbench.destroy_self() + + +def create_pub_filepath(entry, filename): + return mgg.public_store.get_unique_filepath( + ['media_entries', + unicode(entry['_id']), + filename]) + + +class BaseProcessingFail(Exception): + """ + Base exception that all other processing failure messages should + subclass from. + + You shouldn't call this itself; instead you should subclass it + and provid the exception_path and general_message applicable to + this error. + """ + general_message = u'' + + @property + def exception_path(self): + return u"%s:%s" % ( + self.__class__.__module__, self.__class__.__name__) + + def __init__(self, **metadata): + self.metadata = metadata or {} + + +class BadMediaFail(BaseProcessingFail): + """ + Error that should be raised when an inappropriate file was given + for the media type specified. + """ + general_message = _(u'Invalid file given for media type.') + + +################################ +# Media processing initial steps +################################ + +class ProcessMedia(Task): + """ + Pass this entry off for processing. + """ + def run(self, media_id): + """ + Pass the media entry off to the appropriate processing function + (for now just process_image...) + """ + entry = mgg.database.MediaEntry.one( + {'_id': ObjectId(media_id)}) + + # Try to process, and handle expected errors. + try: + process_video(entry) + except BaseProcessingFail, exc: + mark_entry_failed(entry[u'_id'], exc) + return + + entry['state'] = u'processed' + entry.save() + + def on_failure(self, exc, task_id, args, kwargs, einfo): + """ + If the processing failed we should mark that in the database. + + Assuming that the exception raised is a subclass of BaseProcessingFail, + we can use that to get more information about the failure and store that + for conveying information to users about the failure, etc. + """ + entry_id = args[0] + mark_entry_failed(entry_id, exc) + + +process_media = registry.tasks[ProcessMedia.name] + + +def mark_entry_failed(entry_id, exc): + """ + Mark a media entry as having failed in its conversion. + + Uses the exception that was raised to mark more information. If the + exception is a derivative of BaseProcessingFail then we can store extra + information that can be useful for users telling them why their media failed + to process. + + Args: + - entry_id: The id of the media entry + + """ + # Was this a BaseProcessingFail? In other words, was this a + # type of error that we know how to handle? + if isinstance(exc, BaseProcessingFail): + # Looks like yes, so record information about that failure and any + # metadata the user might have supplied. + mgg.database['media_entries'].update( + {'_id': entry_id}, + {'$set': {u'state': u'failed', + u'fail_error': exc.exception_path, + u'fail_metadata': exc.metadata}}) + else: + # Looks like no, so just mark it as failed and don't record a + # failure_error (we'll assume it wasn't handled) and don't record + # metadata (in fact overwrite it if somehow it had previous info + # here) + mgg.database['media_entries'].update( + {'_id': entry_id}, + {'$set': {u'state': u'failed', + u'fail_error': None, + u'fail_metadata': {}}}) + + +def entry_start(queue, entry, options): + print(queue, entry, options) + +def entry_complete(queue, entry, info): + entry.transcoder.stop() + gobject.idle_add(info['loop'].quit) + + with info['tmp_file'] as tmp_file: + mgg.public_store.get_file(info['medium_filepath'], 'wb').write( + tmp_file.read()) + info['entry']['media_files']['medium'] = info['medium_filepath'] + + print('\n=== DONE! ===\n') + + print(queue, entry, info) + +def entry_error(queue, entry, options): + print(queue, entry, options) + +def signal_handler(signum, frame): + """ + Handle Ctr-C gracefully and shut down the transcoder. + """ + global interrupted + print + print _("Interrupt caught. Cleaning up... (Ctrl-C to force exit)") + interrupted = True + signal.signal(signal.SIGINT, signal.SIG_DFL) + +def check_interrupted(): + """ + Check whether we have been interrupted by Ctrl-C and stop the + transcoder. + """ + if interrupted: + try: + source = transcoder.pipe.get_by_name("source") + source.send_event(gst.event_new_eos()) + except: + # Something pretty bad happened... just exit! + gobject.idle_add(loop.quit) + + return False + return True diff --git a/mediagoblin/storage/cloudfiles.py b/mediagoblin/storage/cloudfiles.py index b1dd9450..85d52242 100644 --- a/mediagoblin/storage/cloudfiles.py +++ b/mediagoblin/storage/cloudfiles.py @@ -97,8 +97,14 @@ class CloudFilesStorage(StorageInterface): def delete_file(self, filepath): # TODO: Also delete unused directories if empty (safely, with # checks to avoid race conditions). - self.container.delete_object( - self._resolve_filepath(filepath)) + try: + self.container.delete_object( + self._resolve_filepath(filepath)) + except cloudfiles.container.ResponseError: + pass + finally: + pass + def file_url(self, filepath): return '/'.join([ diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index e24d78f3..78f52160 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -28,8 +28,9 @@ from mediagoblin.util import ( from mediagoblin.util import pass_to_ugettext as _ 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 +from mediagoblin.process_media import mark_entry_failed from mediagoblin.messages import add_message, SUCCESS +from mediagoblin.media_types import get_media_type_and_manager @require_active_login @@ -45,15 +46,15 @@ def submit_start(request): and request.POST['file'].file): submit_form.file.errors.append( _(u'You must provide a file.')) - elif not security.check_filetype(request.POST['file']): - submit_form.file.errors.append( - _(u"The file doesn't seem to be an image!")) else: filename = request.POST['file'].filename + media_type, media_manager = get_media_type_and_manager(filename) + # create entry and save in database entry = request.db.MediaEntry() entry['_id'] = ObjectId() + entry['media_type'] = unicode(media_type) entry['title'] = ( unicode(request.POST['title']) or unicode(splitext(filename)[0])) @@ -62,7 +63,6 @@ def submit_start(request): entry['description_html'] = cleaned_markdown_conversion( entry['description']) - entry['media_type'] = u'image' # heh entry['uploader'] = request.user['_id'] # Process the user's folksonomy "tags" @@ -72,6 +72,7 @@ def submit_start(request): # Generate a slug from the title entry.generate_slug() + # Now store generate the queueing related filename queue_filepath = request.app.queue_store.get_unique_filepath( ['media_entries', @@ -103,7 +104,7 @@ def submit_start(request): # (... don't change entry after this point to avoid race # conditions with changes to the document via processing code) try: - process_media.apply_async( + media_manager['processor'].apply_async( [unicode(entry['_id'])], {}, task_id=task_id) except BaseException as exc: diff --git a/mediagoblin/templates/mediagoblin/media_displays/image.html b/mediagoblin/templates/mediagoblin/media_displays/image.html new file mode 100644 index 00000000..ad60fa94 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/media_displays/image.html @@ -0,0 +1 @@ +{% extends 'mediagoblin/user_pages/media.html' %} diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html new file mode 100644 index 00000000..37586924 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/media_displays/video.html @@ -0,0 +1,8 @@ +{% extends 'mediagoblin/user_pages/media.html' %} +{% block mediagoblin_media %} + +{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 442bef6d..82a48e7c 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -24,24 +24,26 @@ {% if media %}
- {% set display_media = request.app.public_store.file_url( - media.get_display_media(media.media_files)) %} - - {# if there's a medium file size, that means the medium size - # isn't the original... so link to the original! - #} - {% if media['media_files'].has_key('medium') %} - + {% block mediagoblin_media %} + {% set display_media = request.app.public_store.file_url( + media.get_display_media(media.media_files)) %} + + {# if there's a medium file size, that means the medium size + # isn't the original... so link to the original! + #} + {% if media['media_files'].has_key('medium') %} + + Image for {{ media.title }} + + {% else %} Image for {{ media.title }} - - {% else %} - Image for {{ media.title }} - {% endif %} + {% endif %} + {% endblock %}

diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 6a82d718..5458c694 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -29,6 +29,8 @@ from mediagoblin.decorators import (uses_pagination, get_user_media_entry, from werkzeug.contrib.atom import AtomFeed +from mediagoblin.media_types import get_media_manager + @uses_pagination def user_home(request, page): @@ -113,9 +115,11 @@ def media_home(request, media, page, **kwargs): comment_form = user_forms.MediaCommentForm(request.POST) + media_template_name = get_media_manager(media['media_type'])['display_template'] + return render_to_response( request, - 'mediagoblin/user_pages/media.html', + media_template_name, {'media': media, 'comments': comments, 'pagination': pagination, -- cgit v1.2.3 From 1f255101f54579760f2238d70dd3aa0b3cd4ba92 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Sat, 24 Sep 2011 02:21:46 +0200 Subject: Multimedia support - Refractored video processing. --- mediagoblin/media_types/__init__.py | 1 + .../media_types/video/presets/web-advanced.json | 505 +++++++++++ mediagoblin/media_types/video/presets/web-flv.png | Bin 0 -> 2234 bytes mediagoblin/media_types/video/presets/web-webm.svg | 259 ++++++ mediagoblin/media_types/video/presets/web.svg | 982 +++++++++++++++++++++ mediagoblin/media_types/video/processing.py | 186 ++-- mediagoblin/static/images/media_thumbs/video.jpg | Bin 0 -> 7278 bytes .../mediagoblin/media_displays/video.html | 8 + 8 files changed, 1875 insertions(+), 66 deletions(-) create mode 100644 mediagoblin/media_types/video/presets/web-advanced.json create mode 100644 mediagoblin/media_types/video/presets/web-flv.png create mode 100644 mediagoblin/media_types/video/presets/web-webm.svg create mode 100644 mediagoblin/media_types/video/presets/web.svg create mode 100644 mediagoblin/static/images/media_thumbs/video.jpg diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index 67dab418..6a368cda 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -51,6 +51,7 @@ def get_media_managers(): yield media_type, sys.modules[media_type].MEDIA_MANAGER + def get_media_manager(_media_type = None): for media_type, manager in get_media_managers(): if media_type in _media_type: diff --git a/mediagoblin/media_types/video/presets/web-advanced.json b/mediagoblin/media_types/video/presets/web-advanced.json new file mode 100644 index 00000000..ce1d22ff --- /dev/null +++ b/mediagoblin/media_types/video/presets/web-advanced.json @@ -0,0 +1,505 @@ +{ + "make": "Generic", + "model": "Web Browser (Advanced)", + "description": "Media for World Wide Web", + "version": "0.1", + "author": { + "name": "Dionisio E Alonso", + "email": "dealonso@gmail.com" + }, + "icon": "file://web.svg", + "default": "WebM 480p", + "presets": [ + { + "name": "H.264 720p", + "extension": "mp4", + "container": "qtmux", + "vcodec": { + "name": "x264enc", + "container": "qtmux", + "width": [ + 960, 1280 + ], + "height": [ + 720, 720 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "qtmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + { + "name": "WebM 720p", + "extension": "webm", + "container": "webmmux", + "icon": "file://web-webm.svg", + "vcodec": { + "name": "vp8enc", + "container": "webmmux", + "width": [ + 960, 1280 + ], + "height": [ + 720, 720 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "quality=5.75 threads=%(threads)s speed=2" + ] + }, + "acodec": { + "name": "vorbisenc", + "container": "webmmux", + "width": [ + 8, 32 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "quality=0.3" + ] + } + }, + { + "name": "Flash Video 720p", + "extension": "flv", + "icon": "file://web-flv.png", + "container": "flvmux", + "vcodec": { + "name": "x264enc", + "container": "flvmux", + "width": [ + 960, 1280 + ], + "height": [ + 720, 720 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "flvmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + + { + "name": "H.264 576p", + "extension": "mp4", + "container": "qtmux", + "vcodec": { + "name": "x264enc", + "container": "qtmux", + "width": [ + 768, 1024 + ], + "height": [ + 576, 576 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "qtmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + { + "name": "WebM 576p", + "extension": "webm", + "container": "webmmux", + "icon": "file://web-webm.svg", + "vcodec": { + "name": "vp8enc", + "container": "webmmux", + "width": [ + 768, 1024 + ], + "height": [ + 576, 576 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "quality=5.75 threads=%(threads)s speed=2" + ] + }, + "acodec": { + "name": "vorbisenc", + "container": "webmmux", + "width": [ + 8, 32 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "quality=0.3" + ] + } + }, + { + "name": "Flash Video 576p", + "extension": "flv", + "icon": "file://web-flv.png", + "container": "flvmux", + "vcodec": { + "name": "x264enc", + "container": "flvmux", + "width": [ + 768, 1024 + ], + "height": [ + 576, 576 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "flvmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + + { + "name": "H.264 480p", + "extension": "mp4", + "container": "qtmux", + "vcodec": { + "name": "x264enc", + "container": "qtmux", + "width": [ + 640, 854 + ], + "height": [ + 480, 480 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "qtmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + { + "name": "WebM 480p", + "extension": "webm", + "container": "webmmux", + "icon": "file://web-webm.svg", + "vcodec": { + "name": "vp8enc", + "container": "webmmux", + "width": [ + 640, 854 + ], + "height": [ + 480, 480 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "quality=5.75 threads=%(threads)s speed=2" + ] + }, + "acodec": { + "name": "vorbisenc", + "container": "webmmux", + "width": [ + 8, 32 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "quality=0.3" + ] + } + }, + { + "name": "Flash Video 480p", + "extension": "flv", + "icon": "file://web-flv.png", + "container": "flvmux", + "vcodec": { + "name": "x264enc", + "container": "flvmux", + "width": [ + 640, 854 + ], + "height": [ + 480, 480 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "flvmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + + { + "name": "H.264 360p", + "extension": "mp4", + "container": "qtmux", + "vcodec": { + "name": "x264enc", + "container": "qtmux", + "width": [ + 480, 640 + ], + "height": [ + 360, 360 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "qtmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + { + "name": "WebM 360p", + "extension": "webm", + "container": "webmmux", + "icon": "file://web-webm.svg", + "vcodec": { + "name": "vp8enc", + "container": "webmmux", + "width": [ + 480, 640 + ], + "height": [ + 360, 360 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "quality=5.75 threads=%(threads)s speed=2" + ] + }, + "acodec": { + "name": "vorbisenc", + "container": "webmmux", + "width": [ + 8, 32 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "quality=0.3" + ] + } + }, + { + "name": "Flash Video 360p", + "extension": "flv", + "icon": "file://web-flv.png", + "container": "flvmux", + "vcodec": { + "name": "x264enc", + "container": "flvmux", + "width": [ + 480, 640 + ], + "height": [ + 360, 360 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "flvmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + } + ] +} diff --git a/mediagoblin/media_types/video/presets/web-flv.png b/mediagoblin/media_types/video/presets/web-flv.png new file mode 100644 index 00000000..b75699f4 Binary files /dev/null and b/mediagoblin/media_types/video/presets/web-flv.png differ diff --git a/mediagoblin/media_types/video/presets/web-webm.svg b/mediagoblin/media_types/video/presets/web-webm.svg new file mode 100644 index 00000000..4e5b3e97 --- /dev/null +++ b/mediagoblin/media_types/video/presets/web-webm.svg @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mediagoblin/media_types/video/presets/web.svg b/mediagoblin/media_types/video/presets/web.svg new file mode 100644 index 00000000..c0c68244 --- /dev/null +++ b/mediagoblin/media_types/video/presets/web.svg @@ -0,0 +1,982 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Globe + + + Jakub Steiner + + + + + Tuomas Kuosmanen + + + + http://jimmac.musichall.cz + + + globe + international + web + www + internet + network + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index 94784836..4cae1fd8 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -16,6 +16,7 @@ import Image import tempfile +import pkg_resources from celery.task import Task from celery import registry @@ -25,10 +26,14 @@ from mediagoblin import mg_globals as mgg from mediagoblin.util import lazy_pass_to_ugettext as _ +import mediagoblin.media_types.video + import gobject +gobject.threads_init() import gst import arista +import logging from arista.transcoder import TranscoderOptions @@ -38,12 +43,17 @@ ARISTA_DEVICE_KEY = 'web' loop = None +logger = logging.getLogger(__name__) +logging.basicConfig() +logger.setLevel(logging.DEBUG) def process_video(entry): """ Code to process a video """ + global loop + loop = None info = {} workbench = mgg.workbench_manager.create_workbench() @@ -54,8 +64,11 @@ def process_video(entry): arista.init() - devices = arista.presets.get() - device = devices[ARISTA_DEVICE_KEY] + + web_advanced_preset = pkg_resources.resource_filename( + __name__, + 'presets/web-advanced.json') + device = arista.presets.load(web_advanced_preset) queue = arista.queue.TranscodeQueue() @@ -69,38 +82,127 @@ def process_video(entry): preset = device.presets[device.default] + logger.debug('preset: {0}'.format(preset)) + opts = TranscoderOptions(uri, preset, output) queue.append(opts) info['entry'] = entry - queue.connect("entry-start", entry_start, info) -# queue.connect("entry-pass-setup", entry_pass_setup, options) - queue.connect("entry-error", entry_error, info) - queue.connect("entry-complete", entry_complete, info) + queue.connect("entry-start", _transcoding_start, info) + queue.connect("entry-pass-setup", _transcoding_pass_setup, info) + queue.connect("entry-error", _transcoding_error, info) + queue.connect("entry-complete", _transcoding_complete, info) info['loop'] = loop = gobject.MainLoop() + info['queued_filename'] = queued_filename + info['queued_filepath'] = queued_filepath + info['workbench'] = workbench + + logger.debug('info: {0}'.format(info)) loop.run() + + ''' + try: + #thumb = Image.open(mediagoblin.media_types.video.MEDIA_MANAGER['default_thumb']) + 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_file = mgg.public_store.get_file(thumb_filepath, 'w') + + with thumb_file: + thumb.save(thumb_file, "JPEG", quality=90) + ''' - # we have to re-read because unlike PIL, not everything reads - # things in string representation :) - queued_file = file(queued_filename, 'rb') +def __close_processing(queue, qentry, info, error=False): + ''' + Update MediaEntry, move files, handle errors + ''' + if not error: + qentry.transcoder.stop() + gobject.idle_add(info['loop'].quit) + info['loop'].quit() - with queued_file: - original_filepath = create_pub_filepath(entry, queued_filepath[-1]) + print('\n-> Saving video...\n') - with mgg.public_store.get_file(original_filepath, 'wb') as original_file: - original_file.write(queued_file.read()) + with info['tmp_file'] as tmp_file: + mgg.public_store.get_file(info['medium_filepath'], 'wb').write( + tmp_file.read()) + info['entry']['media_files']['medium'] = info['medium_filepath'] - mgg.queue_store.delete_file(queued_filepath) - entry['queued_media_file'] = [] - media_files_dict = entry.setdefault('media_files', {}) - media_files_dict['original'] = original_filepath + print('\n=== DONE! ===\n') + + # we have to re-read because unlike PIL, not everything reads + # things in string representation :) + queued_file = file(info['queued_filename'], 'rb') + + with queued_file: + original_filepath = create_pub_filepath(info['entry'], info['queued_filepath'][-1]) + + with mgg.public_store.get_file(original_filepath, 'wb') as original_file: + original_file.write(queued_file.read()) + + mgg.queue_store.delete_file(info['queued_filepath']) + info['entry']['queued_media_file'] = [] + media_files_dict = info['entry'].setdefault('media_files', {}) + media_files_dict['original'] = original_filepath + # media_files_dict['thumb'] = thumb_filepath + + info['entry']['state'] = u'processed' + info['entry'].save() + + else: + qentry.transcoder.stop() + gobject.idle_add(info['loop'].quit) + info['loop'].quit() + info['entry']['state'] = u'failed' + info['entry'].save() # clean up workbench - workbench.destroy_self() + info['workbench'].destroy_self() + + +def _transcoding_start(queue, qentry, info): + logger.info('-> Starting transcoding') + logger.debug(queue, qentry, info) + +def _transcoding_complete(*args): + __close_processing(*args) + print(args) + +def _transcoding_error(*args): + logger.info('-> Error') + __close_processing(*args, error=True) + logger.debug(*args) + +def _transcoding_pass_setup(queue, qentry, options): + logger.info('-> Pass setup') + logger.debug(queue, qentry, options) + + +def check_interrupted(): + """ + Check whether we have been interrupted by Ctrl-C and stop the + transcoder. + """ + if interrupted: + try: + source = transcoder.pipe.get_by_name("source") + source.send_event(gst.event_new_eos()) + except: + # Something pretty bad happened... just exit! + gobject.idle_add(loop.quit) + + return False + return True def create_pub_filepath(entry, filename): @@ -161,9 +263,6 @@ class ProcessMedia(Task): mark_entry_failed(entry[u'_id'], exc) return - entry['state'] = u'processed' - entry.save() - def on_failure(self, exc, task_id, args, kwargs, einfo): """ If the processing failed we should mark that in the database. @@ -213,48 +312,3 @@ def mark_entry_failed(entry_id, exc): u'fail_error': None, u'fail_metadata': {}}}) - -def entry_start(queue, entry, options): - print(queue, entry, options) - -def entry_complete(queue, entry, info): - entry.transcoder.stop() - gobject.idle_add(info['loop'].quit) - - with info['tmp_file'] as tmp_file: - mgg.public_store.get_file(info['medium_filepath'], 'wb').write( - tmp_file.read()) - info['entry']['media_files']['medium'] = info['medium_filepath'] - - print('\n=== DONE! ===\n') - - print(queue, entry, info) - -def entry_error(queue, entry, options): - print(queue, entry, options) - -def signal_handler(signum, frame): - """ - Handle Ctr-C gracefully and shut down the transcoder. - """ - global interrupted - print - print _("Interrupt caught. Cleaning up... (Ctrl-C to force exit)") - interrupted = True - signal.signal(signal.SIGINT, signal.SIG_DFL) - -def check_interrupted(): - """ - Check whether we have been interrupted by Ctrl-C and stop the - transcoder. - """ - if interrupted: - try: - source = transcoder.pipe.get_by_name("source") - source.send_event(gst.event_new_eos()) - except: - # Something pretty bad happened... just exit! - gobject.idle_add(loop.quit) - - return False - return True diff --git a/mediagoblin/static/images/media_thumbs/video.jpg b/mediagoblin/static/images/media_thumbs/video.jpg new file mode 100644 index 00000000..841dc796 Binary files /dev/null and b/mediagoblin/static/images/media_thumbs/video.jpg differ diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html index 37586924..22b19240 100644 --- a/mediagoblin/templates/mediagoblin/media_displays/video.html +++ b/mediagoblin/templates/mediagoblin/media_displays/video.html @@ -5,4 +5,12 @@ media['media_files']['medium']) }}" type='video/webm; codecs="vp8, vorbis"' /> + {% if 'original' in media.media_files %} + + {%- trans -%} + Original + {%- endtrans -%} + + {% endif %} {% endblock %} -- cgit v1.2.3 From 81291bbb896d04fee66b9482f479b3fc6e6e07f5 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Wed, 28 Sep 2011 21:00:33 +0200 Subject: Added arista to install requires --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 06626926..7417fb97 100644 --- a/setup.py +++ b/setup.py @@ -61,6 +61,7 @@ setup( 'ConfigObj', 'Markdown', 'python-cloudfiles', + 'arista', ## For now we're expecting that users will install this from ## their package managers. # 'lxml', -- cgit v1.2.3 From 62be795e9141f951a92d5c44a974db9875df197d Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Thu, 29 Sep 2011 00:57:07 +0200 Subject: Renamed video.presets => video.devices --- .../media_types/video/devices/web-advanced.json | 505 +++++++++++ mediagoblin/media_types/video/devices/web-flv.png | Bin 0 -> 2234 bytes mediagoblin/media_types/video/devices/web-webm.svg | 259 ++++++ mediagoblin/media_types/video/devices/web.svg | 982 +++++++++++++++++++++ .../media_types/video/presets/web-advanced.json | 505 ----------- mediagoblin/media_types/video/presets/web-flv.png | Bin 2234 -> 0 bytes mediagoblin/media_types/video/presets/web-webm.svg | 259 ------ mediagoblin/media_types/video/presets/web.svg | 982 --------------------- 8 files changed, 1746 insertions(+), 1746 deletions(-) create mode 100644 mediagoblin/media_types/video/devices/web-advanced.json create mode 100644 mediagoblin/media_types/video/devices/web-flv.png create mode 100644 mediagoblin/media_types/video/devices/web-webm.svg create mode 100644 mediagoblin/media_types/video/devices/web.svg delete mode 100644 mediagoblin/media_types/video/presets/web-advanced.json delete mode 100644 mediagoblin/media_types/video/presets/web-flv.png delete mode 100644 mediagoblin/media_types/video/presets/web-webm.svg delete mode 100644 mediagoblin/media_types/video/presets/web.svg diff --git a/mediagoblin/media_types/video/devices/web-advanced.json b/mediagoblin/media_types/video/devices/web-advanced.json new file mode 100644 index 00000000..ce1d22ff --- /dev/null +++ b/mediagoblin/media_types/video/devices/web-advanced.json @@ -0,0 +1,505 @@ +{ + "make": "Generic", + "model": "Web Browser (Advanced)", + "description": "Media for World Wide Web", + "version": "0.1", + "author": { + "name": "Dionisio E Alonso", + "email": "dealonso@gmail.com" + }, + "icon": "file://web.svg", + "default": "WebM 480p", + "presets": [ + { + "name": "H.264 720p", + "extension": "mp4", + "container": "qtmux", + "vcodec": { + "name": "x264enc", + "container": "qtmux", + "width": [ + 960, 1280 + ], + "height": [ + 720, 720 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "qtmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + { + "name": "WebM 720p", + "extension": "webm", + "container": "webmmux", + "icon": "file://web-webm.svg", + "vcodec": { + "name": "vp8enc", + "container": "webmmux", + "width": [ + 960, 1280 + ], + "height": [ + 720, 720 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "quality=5.75 threads=%(threads)s speed=2" + ] + }, + "acodec": { + "name": "vorbisenc", + "container": "webmmux", + "width": [ + 8, 32 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "quality=0.3" + ] + } + }, + { + "name": "Flash Video 720p", + "extension": "flv", + "icon": "file://web-flv.png", + "container": "flvmux", + "vcodec": { + "name": "x264enc", + "container": "flvmux", + "width": [ + 960, 1280 + ], + "height": [ + 720, 720 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "flvmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + + { + "name": "H.264 576p", + "extension": "mp4", + "container": "qtmux", + "vcodec": { + "name": "x264enc", + "container": "qtmux", + "width": [ + 768, 1024 + ], + "height": [ + 576, 576 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "qtmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + { + "name": "WebM 576p", + "extension": "webm", + "container": "webmmux", + "icon": "file://web-webm.svg", + "vcodec": { + "name": "vp8enc", + "container": "webmmux", + "width": [ + 768, 1024 + ], + "height": [ + 576, 576 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "quality=5.75 threads=%(threads)s speed=2" + ] + }, + "acodec": { + "name": "vorbisenc", + "container": "webmmux", + "width": [ + 8, 32 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "quality=0.3" + ] + } + }, + { + "name": "Flash Video 576p", + "extension": "flv", + "icon": "file://web-flv.png", + "container": "flvmux", + "vcodec": { + "name": "x264enc", + "container": "flvmux", + "width": [ + 768, 1024 + ], + "height": [ + 576, 576 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "flvmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + + { + "name": "H.264 480p", + "extension": "mp4", + "container": "qtmux", + "vcodec": { + "name": "x264enc", + "container": "qtmux", + "width": [ + 640, 854 + ], + "height": [ + 480, 480 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "qtmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + { + "name": "WebM 480p", + "extension": "webm", + "container": "webmmux", + "icon": "file://web-webm.svg", + "vcodec": { + "name": "vp8enc", + "container": "webmmux", + "width": [ + 640, 854 + ], + "height": [ + 480, 480 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "quality=5.75 threads=%(threads)s speed=2" + ] + }, + "acodec": { + "name": "vorbisenc", + "container": "webmmux", + "width": [ + 8, 32 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "quality=0.3" + ] + } + }, + { + "name": "Flash Video 480p", + "extension": "flv", + "icon": "file://web-flv.png", + "container": "flvmux", + "vcodec": { + "name": "x264enc", + "container": "flvmux", + "width": [ + 640, 854 + ], + "height": [ + 480, 480 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "flvmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + + { + "name": "H.264 360p", + "extension": "mp4", + "container": "qtmux", + "vcodec": { + "name": "x264enc", + "container": "qtmux", + "width": [ + 480, 640 + ], + "height": [ + 360, 360 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "qtmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + }, + { + "name": "WebM 360p", + "extension": "webm", + "container": "webmmux", + "icon": "file://web-webm.svg", + "vcodec": { + "name": "vp8enc", + "container": "webmmux", + "width": [ + 480, 640 + ], + "height": [ + 360, 360 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "quality=5.75 threads=%(threads)s speed=2" + ] + }, + "acodec": { + "name": "vorbisenc", + "container": "webmmux", + "width": [ + 8, 32 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "quality=0.3" + ] + } + }, + { + "name": "Flash Video 360p", + "extension": "flv", + "icon": "file://web-flv.png", + "container": "flvmux", + "vcodec": { + "name": "x264enc", + "container": "flvmux", + "width": [ + 480, 640 + ], + "height": [ + 360, 360 + ], + "rate": [ + 1, 30 + ], + "passes": [ + "pass=qual quantizer=23 subme=6 cabac=0 threads=0" + ] + }, + "acodec": { + "name": "faac", + "container": "flvmux", + "width": [ + 8, 24 + ], + "depth": [ + 8, 24 + ], + "rate": [ + 8000, 96000 + ], + "channels": [ + 1, 2 + ], + "passes": [ + "bitrate=131072 profile=LC" + ] + } + } + ] +} diff --git a/mediagoblin/media_types/video/devices/web-flv.png b/mediagoblin/media_types/video/devices/web-flv.png new file mode 100644 index 00000000..b75699f4 Binary files /dev/null and b/mediagoblin/media_types/video/devices/web-flv.png differ diff --git a/mediagoblin/media_types/video/devices/web-webm.svg b/mediagoblin/media_types/video/devices/web-webm.svg new file mode 100644 index 00000000..4e5b3e97 --- /dev/null +++ b/mediagoblin/media_types/video/devices/web-webm.svg @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mediagoblin/media_types/video/devices/web.svg b/mediagoblin/media_types/video/devices/web.svg new file mode 100644 index 00000000..c0c68244 --- /dev/null +++ b/mediagoblin/media_types/video/devices/web.svg @@ -0,0 +1,982 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Globe + + + Jakub Steiner + + + + + Tuomas Kuosmanen + + + + http://jimmac.musichall.cz + + + globe + international + web + www + internet + network + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mediagoblin/media_types/video/presets/web-advanced.json b/mediagoblin/media_types/video/presets/web-advanced.json deleted file mode 100644 index ce1d22ff..00000000 --- a/mediagoblin/media_types/video/presets/web-advanced.json +++ /dev/null @@ -1,505 +0,0 @@ -{ - "make": "Generic", - "model": "Web Browser (Advanced)", - "description": "Media for World Wide Web", - "version": "0.1", - "author": { - "name": "Dionisio E Alonso", - "email": "dealonso@gmail.com" - }, - "icon": "file://web.svg", - "default": "WebM 480p", - "presets": [ - { - "name": "H.264 720p", - "extension": "mp4", - "container": "qtmux", - "vcodec": { - "name": "x264enc", - "container": "qtmux", - "width": [ - 960, 1280 - ], - "height": [ - 720, 720 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "pass=qual quantizer=23 subme=6 cabac=0 threads=0" - ] - }, - "acodec": { - "name": "faac", - "container": "qtmux", - "width": [ - 8, 24 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "bitrate=131072 profile=LC" - ] - } - }, - { - "name": "WebM 720p", - "extension": "webm", - "container": "webmmux", - "icon": "file://web-webm.svg", - "vcodec": { - "name": "vp8enc", - "container": "webmmux", - "width": [ - 960, 1280 - ], - "height": [ - 720, 720 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "quality=5.75 threads=%(threads)s speed=2" - ] - }, - "acodec": { - "name": "vorbisenc", - "container": "webmmux", - "width": [ - 8, 32 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "quality=0.3" - ] - } - }, - { - "name": "Flash Video 720p", - "extension": "flv", - "icon": "file://web-flv.png", - "container": "flvmux", - "vcodec": { - "name": "x264enc", - "container": "flvmux", - "width": [ - 960, 1280 - ], - "height": [ - 720, 720 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "pass=qual quantizer=23 subme=6 cabac=0 threads=0" - ] - }, - "acodec": { - "name": "faac", - "container": "flvmux", - "width": [ - 8, 24 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "bitrate=131072 profile=LC" - ] - } - }, - - { - "name": "H.264 576p", - "extension": "mp4", - "container": "qtmux", - "vcodec": { - "name": "x264enc", - "container": "qtmux", - "width": [ - 768, 1024 - ], - "height": [ - 576, 576 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "pass=qual quantizer=23 subme=6 cabac=0 threads=0" - ] - }, - "acodec": { - "name": "faac", - "container": "qtmux", - "width": [ - 8, 24 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "bitrate=131072 profile=LC" - ] - } - }, - { - "name": "WebM 576p", - "extension": "webm", - "container": "webmmux", - "icon": "file://web-webm.svg", - "vcodec": { - "name": "vp8enc", - "container": "webmmux", - "width": [ - 768, 1024 - ], - "height": [ - 576, 576 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "quality=5.75 threads=%(threads)s speed=2" - ] - }, - "acodec": { - "name": "vorbisenc", - "container": "webmmux", - "width": [ - 8, 32 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "quality=0.3" - ] - } - }, - { - "name": "Flash Video 576p", - "extension": "flv", - "icon": "file://web-flv.png", - "container": "flvmux", - "vcodec": { - "name": "x264enc", - "container": "flvmux", - "width": [ - 768, 1024 - ], - "height": [ - 576, 576 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "pass=qual quantizer=23 subme=6 cabac=0 threads=0" - ] - }, - "acodec": { - "name": "faac", - "container": "flvmux", - "width": [ - 8, 24 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "bitrate=131072 profile=LC" - ] - } - }, - - { - "name": "H.264 480p", - "extension": "mp4", - "container": "qtmux", - "vcodec": { - "name": "x264enc", - "container": "qtmux", - "width": [ - 640, 854 - ], - "height": [ - 480, 480 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "pass=qual quantizer=23 subme=6 cabac=0 threads=0" - ] - }, - "acodec": { - "name": "faac", - "container": "qtmux", - "width": [ - 8, 24 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "bitrate=131072 profile=LC" - ] - } - }, - { - "name": "WebM 480p", - "extension": "webm", - "container": "webmmux", - "icon": "file://web-webm.svg", - "vcodec": { - "name": "vp8enc", - "container": "webmmux", - "width": [ - 640, 854 - ], - "height": [ - 480, 480 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "quality=5.75 threads=%(threads)s speed=2" - ] - }, - "acodec": { - "name": "vorbisenc", - "container": "webmmux", - "width": [ - 8, 32 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "quality=0.3" - ] - } - }, - { - "name": "Flash Video 480p", - "extension": "flv", - "icon": "file://web-flv.png", - "container": "flvmux", - "vcodec": { - "name": "x264enc", - "container": "flvmux", - "width": [ - 640, 854 - ], - "height": [ - 480, 480 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "pass=qual quantizer=23 subme=6 cabac=0 threads=0" - ] - }, - "acodec": { - "name": "faac", - "container": "flvmux", - "width": [ - 8, 24 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "bitrate=131072 profile=LC" - ] - } - }, - - { - "name": "H.264 360p", - "extension": "mp4", - "container": "qtmux", - "vcodec": { - "name": "x264enc", - "container": "qtmux", - "width": [ - 480, 640 - ], - "height": [ - 360, 360 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "pass=qual quantizer=23 subme=6 cabac=0 threads=0" - ] - }, - "acodec": { - "name": "faac", - "container": "qtmux", - "width": [ - 8, 24 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "bitrate=131072 profile=LC" - ] - } - }, - { - "name": "WebM 360p", - "extension": "webm", - "container": "webmmux", - "icon": "file://web-webm.svg", - "vcodec": { - "name": "vp8enc", - "container": "webmmux", - "width": [ - 480, 640 - ], - "height": [ - 360, 360 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "quality=5.75 threads=%(threads)s speed=2" - ] - }, - "acodec": { - "name": "vorbisenc", - "container": "webmmux", - "width": [ - 8, 32 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "quality=0.3" - ] - } - }, - { - "name": "Flash Video 360p", - "extension": "flv", - "icon": "file://web-flv.png", - "container": "flvmux", - "vcodec": { - "name": "x264enc", - "container": "flvmux", - "width": [ - 480, 640 - ], - "height": [ - 360, 360 - ], - "rate": [ - 1, 30 - ], - "passes": [ - "pass=qual quantizer=23 subme=6 cabac=0 threads=0" - ] - }, - "acodec": { - "name": "faac", - "container": "flvmux", - "width": [ - 8, 24 - ], - "depth": [ - 8, 24 - ], - "rate": [ - 8000, 96000 - ], - "channels": [ - 1, 2 - ], - "passes": [ - "bitrate=131072 profile=LC" - ] - } - } - ] -} diff --git a/mediagoblin/media_types/video/presets/web-flv.png b/mediagoblin/media_types/video/presets/web-flv.png deleted file mode 100644 index b75699f4..00000000 Binary files a/mediagoblin/media_types/video/presets/web-flv.png and /dev/null differ diff --git a/mediagoblin/media_types/video/presets/web-webm.svg b/mediagoblin/media_types/video/presets/web-webm.svg deleted file mode 100644 index 4e5b3e97..00000000 --- a/mediagoblin/media_types/video/presets/web-webm.svg +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/mediagoblin/media_types/video/presets/web.svg b/mediagoblin/media_types/video/presets/web.svg deleted file mode 100644 index c0c68244..00000000 --- a/mediagoblin/media_types/video/presets/web.svg +++ /dev/null @@ -1,982 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - Globe - - - Jakub Steiner - - - - - Tuomas Kuosmanen - - - - http://jimmac.musichall.cz - - - globe - international - web - www - internet - network - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- cgit v1.2.3 From 243c3843bd574129caa7663e25d1a843b2d2dd30 Mon Sep 17 00:00:00 2001 From: Nathan Yergler Date: Sat, 1 Oct 2011 15:10:02 -0700 Subject: Whitespace and formatting cleanup. * Removed trailing whitespace * Line length < 80 where possible * Honor conventions on number of blank lines * Honor conventions about spaces around :, = --- mediagoblin/app.py | 3 +-- mediagoblin/auth/forms.py | 8 +++---- mediagoblin/auth/lib.py | 3 ++- mediagoblin/auth/routing.py | 3 ++- mediagoblin/auth/views.py | 3 +-- mediagoblin/db/__init__.py | 2 +- mediagoblin/db/indexes.py | 5 ++-- mediagoblin/db/migrations.py | 2 +- mediagoblin/db/models.py | 35 +++++++++++++-------------- mediagoblin/db/open.py | 2 +- mediagoblin/db/util.py | 5 ++-- mediagoblin/decorators.py | 2 +- mediagoblin/edit/__init__.py | 2 -- mediagoblin/edit/views.py | 2 +- mediagoblin/gmg_commands/__init__.py | 3 +-- mediagoblin/gmg_commands/import_export.py | 7 +++--- mediagoblin/gmg_commands/migrate.py | 4 ++-- mediagoblin/gmg_commands/users.py | 7 +++--- mediagoblin/init/__init__.py | 18 ++++++++------ mediagoblin/init/celery/__init__.py | 2 +- mediagoblin/init/celery/from_celery.py | 2 +- mediagoblin/init/config.py | 2 +- mediagoblin/listings/routing.py | 1 - mediagoblin/listings/views.py | 3 ++- mediagoblin/messages.py | 2 ++ mediagoblin/middleware/noop.py | 1 + mediagoblin/process_media/__init__.py | 18 +++++++------- mediagoblin/process_media/errors.py | 9 +++---- mediagoblin/storage/cloudfiles.py | 1 + mediagoblin/submit/__init__.py | 2 -- mediagoblin/submit/security.py | 2 +- mediagoblin/submit/views.py | 16 +++++++------ mediagoblin/user_pages/__init__.py | 2 -- mediagoblin/user_pages/views.py | 13 +++++++---- mediagoblin/util.py | 39 ++++++++++++++++++------------- mediagoblin/views.py | 1 + mediagoblin/workbench.py | 4 +++- setup.py | 12 +++++----- 38 files changed, 135 insertions(+), 113 deletions(-) diff --git a/mediagoblin/app.py b/mediagoblin/app.py index dd5f0b89..9bbccf24 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -91,7 +91,7 @@ class MediaGoblinApp(object): # object. ####################################################### - setup_globals(app = self) + setup_globals(app=self) # Workbench *currently* only used by celery, so this only # matters in always eager mode :) @@ -101,7 +101,6 @@ class MediaGoblinApp(object): self.middleware = [util.import_component(m)(self) for m in middleware.ENABLED_MIDDLEWARE] - def __call__(self, environ, start_response): request = Request(environ) diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py index 6339b4a3..aadb5888 100644 --- a/mediagoblin/auth/forms.py +++ b/mediagoblin/auth/forms.py @@ -59,9 +59,10 @@ class ForgotPassForm(wtforms.Form): 'Username or email', [wtforms.validators.Required()]) - def validate_username(form,field): - if not (re.match(r'^\w+$',field.data) or - re.match(r'^.+@[^.].*\.[a-z]{2,10}$',field.data, re.IGNORECASE)): + def validate_username(form, field): + if not (re.match(r'^\w+$', field.data) or + re.match(r'^.+@[^.].*\.[a-z]{2,10}$', field.data, + re.IGNORECASE)): raise wtforms.ValidationError(u'Incorrect input') @@ -82,4 +83,3 @@ class ChangePassForm(wtforms.Form): token = wtforms.HiddenField( '', [wtforms.validators.Required()]) - diff --git a/mediagoblin/auth/lib.py b/mediagoblin/auth/lib.py index d7d351a5..0ecccbb5 100644 --- a/mediagoblin/auth/lib.py +++ b/mediagoblin/auth/lib.py @@ -93,6 +93,7 @@ EMAIL_VERIFICATION_TEMPLATE = ( u"http://{host}{uri}?" u"userid={userid}&token={verification_key}") + def send_verification_email(user, request): """ Send the verification email to users to activate their accounts. @@ -127,6 +128,7 @@ EMAIL_FP_VERIFICATION_TEMPLATE = ( u"http://{host}{uri}?" u"userid={userid}&token={fp_verification_key}") + def send_fp_verification_email(user, request): """ Send the verification email to users to change their password. @@ -150,4 +152,3 @@ def send_fp_verification_email(user, request): [user['email']], 'GNU MediaGoblin - Change forgotten password!', rendered_email) - diff --git a/mediagoblin/auth/routing.py b/mediagoblin/auth/routing.py index 912d89fa..365ccfaa 100644 --- a/mediagoblin/auth/routing.py +++ b/mediagoblin/auth/routing.py @@ -33,7 +33,8 @@ auth_routes = [ controller='mediagoblin.views:simple_template_render'), Route('mediagoblin.auth.forgot_password', '/forgot_password/', controller='mediagoblin.auth.views:forgot_password'), - Route('mediagoblin.auth.verify_forgot_password', '/forgot_password/verify/', + Route('mediagoblin.auth.verify_forgot_password', + '/forgot_password/verify/', controller='mediagoblin.auth.views:verify_forgot_password'), Route('mediagoblin.auth.fp_changed_success', '/forgot_password/changed_success/', diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index f67f0588..afcfcf1e 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -233,8 +233,7 @@ def forgot_password(request): request, 'mediagoblin.user_pages.user_home', user=user['username']) - - # do not reveal whether or not there is a matching user, just move along + # do not reveal whether or not there is a matching user return redirect(request, 'mediagoblin.auth.fp_email_sent') return render_to_response( diff --git a/mediagoblin/db/__init__.py b/mediagoblin/db/__init__.py index c5124b1a..27e8a90f 100644 --- a/mediagoblin/db/__init__.py +++ b/mediagoblin/db/__init__.py @@ -23,7 +23,7 @@ Database Abstraction/Wrapper Layer pymongo. Read beow for why, but note that nobody is actually doing this and there's no proof that we'll ever support more than MongoDB... it would be a huge amount of work to do so. - + If you really want to prove that possible, jump on IRC and talk to us about making such a branch. In the meanwhile, it doesn't hurt to have things as they are... if it ever makes it hard for us to diff --git a/mediagoblin/db/indexes.py b/mediagoblin/db/indexes.py index 75394a31..1dd73f2b 100644 --- a/mediagoblin/db/indexes.py +++ b/mediagoblin/db/indexes.py @@ -93,8 +93,9 @@ MEDIAENTRY_INDEXES = { ('created', DESCENDING)]}, 'state_uploader_tags_created': { - # Indexing on processed?, media uploader, associated tags, and timestamp - # Used for showing media items matching a tag search, most recent first. + # Indexing on processed?, media uploader, associated tags, and + # timestamp Used for showing media items matching a tag + # search, most recent first. 'index': [('state', ASCENDING), ('uploader', ASCENDING), ('tags.slug', DESCENDING), diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index 755f49c5..28bb62fc 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.py @@ -87,7 +87,7 @@ def mediaentry_add_fail_error_and_metadata(database): {'fail_error': {'$exists': False}}, {'$set': {'fail_error': None}}, multi=True) - + collection.update( {'fail_metadata': {'$exists': False}}, {'$set': {'fail_metadata': {}}}, diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index bbddada6..42db3f83 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -14,7 +14,8 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import datetime, uuid +import datetime +import uuid from mongokit import Document @@ -69,17 +70,17 @@ class User(Document): 'username': unicode, 'email': unicode, 'created': datetime.datetime, - 'plugin_data': dict, # plugins can dump stuff here. + 'plugin_data': dict, # plugins can dump stuff here. 'pw_hash': unicode, 'email_verified': bool, 'status': unicode, 'verification_key': unicode, 'is_admin': bool, - 'url' : unicode, - 'bio' : unicode, # May contain markdown - 'bio_html': unicode, # May contain plaintext, or HTML - 'fp_verification_key': unicode, # forgotten password verification key - 'fp_token_expire': datetime.datetime + 'url': unicode, + 'bio': unicode, # May contain markdown + 'bio_html': unicode, # May contain plaintext, or HTML + 'fp_verification_key': unicode, # forgotten password verification key + 'fp_token_expire': datetime.datetime, } required_fields = ['username', 'created', 'pw_hash', 'email'] @@ -174,8 +175,8 @@ class MediaEntry(Document): critical to this piece of media but may be usefully relevant to people viewing the work. (currently unused.) - - fail_error: path to the exception raised - - fail_metadata: + - fail_error: path to the exception raised + - fail_metadata: """ __collection__ = 'media_entries' @@ -184,11 +185,11 @@ class MediaEntry(Document): 'title': unicode, 'slug': unicode, 'created': datetime.datetime, - 'description': unicode, # May contain markdown/up - 'description_html': unicode, # May contain plaintext, or HTML + 'description': unicode, # May contain markdown/up + 'description_html': unicode, # May contain plaintext, or HTML 'media_type': unicode, - 'media_data': dict, # extra data relevant to this media_type - 'plugin_data': dict, # plugins can dump stuff here. + 'media_data': dict, # extra data relevant to this media_type + 'plugin_data': dict, # plugins can dump stuff here. 'tags': [dict], 'state': unicode, @@ -220,7 +221,8 @@ class MediaEntry(Document): return self.db.MediaComment.find({ 'media_entry': self['_id']}).sort('created', DESCENDING) - def get_display_media(self, media_map, fetch_order=DISPLAY_IMAGE_FETCHING_ORDER): + def get_display_media(self, media_map, + fetch_order=DISPLAY_IMAGE_FETCHING_ORDER): """ Find the best media for display. @@ -273,7 +275,7 @@ class MediaEntry(Document): """ Provide a url to the previous entry from this user, if there is one """ - cursor = self.db.MediaEntry.find({'_id' : {"$gt": self['_id']}, + cursor = self.db.MediaEntry.find({'_id': {"$gt": self['_id']}, 'uploader': self['uploader'], 'state': 'processed'}).sort( '_id', ASCENDING).limit(1) @@ -286,7 +288,7 @@ class MediaEntry(Document): """ Provide a url to the next entry from this user, if there is one """ - cursor = self.db.MediaEntry.find({'_id' : {"$lt": self['_id']}, + cursor = self.db.MediaEntry.find({'_id': {"$lt": self['_id']}, 'uploader': self['uploader'], 'state': 'processed'}).sort( '_id', DESCENDING).limit(1) @@ -353,4 +355,3 @@ def register_models(connection): Register all models in REGISTER_MODELS with this connection. """ connection.register(REGISTER_MODELS) - diff --git a/mediagoblin/db/open.py b/mediagoblin/db/open.py index e73b6258..e677ba12 100644 --- a/mediagoblin/db/open.py +++ b/mediagoblin/db/open.py @@ -29,7 +29,7 @@ def connect_database_from_config(app_config, use_pymongo=False): port = app_config.get('db_port') if port: port = asint(port) - + if use_pymongo: connection = pymongo.Connection( app_config.get('db_host'), port) diff --git a/mediagoblin/db/util.py b/mediagoblin/db/util.py index 84a6cbce..38f0233f 100644 --- a/mediagoblin/db/util.py +++ b/mediagoblin/db/util.py @@ -118,11 +118,12 @@ def remove_deprecated_indexes(database, deprecated_indexes=DEPRECATED_INDEXES): ################# # The default migration registry... -# +# # Don't set this yourself! RegisterMigration will automatically fill # this with stuff via decorating methods in migrations.py -class MissingCurrentMigration(Exception): pass +class MissingCurrentMigration(Exception): + pass MIGRATIONS = {} diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index 7d5978fc..204ac47a 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -119,6 +119,7 @@ def get_user_media_entry(controller): return _make_safe(wrapper, controller) + def get_media_entry_by_id(controller): """ Pass in a MediaEntry based off of a url component @@ -138,4 +139,3 @@ def get_media_entry_by_id(controller): return controller(request, media=media, *args, **kwargs) return _make_safe(wrapper, controller) - diff --git a/mediagoblin/edit/__init__.py b/mediagoblin/edit/__init__.py index 576bd0f5..ba347c69 100644 --- a/mediagoblin/edit/__init__.py +++ b/mediagoblin/edit/__init__.py @@ -13,5 +13,3 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . - - diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 15edfdd6..d15461c0 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -119,7 +119,7 @@ def edit_attachments(request, media): name=request.POST['attachment_name'] \ or request.POST['attachment_file'].filename, filepath=attachment_public_filepath, - created=datetime.utcnow() + created=datetime.utcnow(), )) media.save() diff --git a/mediagoblin/gmg_commands/__init__.py b/mediagoblin/gmg_commands/__init__.py index 0071c65b..b3f69ccc 100644 --- a/mediagoblin/gmg_commands/__init__.py +++ b/mediagoblin/gmg_commands/__init__.py @@ -28,7 +28,7 @@ SUBCOMMAND_MAP = { 'setup': 'mediagoblin.gmg_commands.migrate:migrate_parser_setup', 'func': 'mediagoblin.gmg_commands.migrate:migrate', 'help': 'Apply all unapplied bulk migrations to the database'}, - 'adduser':{ + 'adduser': { 'setup': 'mediagoblin.gmg_commands.users:adduser_parser_setup', 'func': 'mediagoblin.gmg_commands.users:adduser', 'help': 'Creates an user'}, @@ -80,4 +80,3 @@ def main_cli(): if __name__ == '__main__': main_cli() - diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index 05edbfc8..962e545c 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -91,7 +91,7 @@ def _import_database(db, args): args.mongorestore_path, '-d', db.name, os.path.join(args._cache_path['database'], db.name)]) - + p.wait() _log.info('...Database imported') @@ -229,7 +229,8 @@ def env_export(args): ''' if args.cache_path: if os.path.exists(args.cache_path): - _log.error('The cache directory must not exist before you run this script') + _log.error('The cache directory must not exist ' + 'before you run this script') _log.error('Cache directory: {0}'.format(args.cache_path)) return False @@ -245,7 +246,7 @@ def env_export(args): globa_config, app_config = setup_global_and_app_config(args.conf_file) setup_storage() - + connection, db = setup_connection_and_db_from_config( app_config, use_pymongo=True) diff --git a/mediagoblin/gmg_commands/migrate.py b/mediagoblin/gmg_commands/migrate.py index 1a597188..e6dd6f78 100644 --- a/mediagoblin/gmg_commands/migrate.py +++ b/mediagoblin/gmg_commands/migrate.py @@ -55,13 +55,13 @@ def migrate(args): for collection, index_name in removed_indexes: print "Removed index '%s' in collection '%s'" % ( index_name, collection) - + # Migrate print "\n== Applying migrations... ==" migration_manager.migrate_new( pre_callback=_print_started_migration, post_callback=_print_finished_migration) - + # Add new indexes print "\n== Adding new indexes... ==" new_indexes = db_util.add_new_indexes(db) diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py index 5421907d..3fda0e32 100644 --- a/mediagoblin/gmg_commands/users.py +++ b/mediagoblin/gmg_commands/users.py @@ -41,7 +41,7 @@ def adduser(args): db = mg_globals.database users_with_username = \ db.User.find({ - 'username': args.username.lower() + 'username': args.username.lower(), }).count() if users_with_username: @@ -74,7 +74,7 @@ def makeadmin(args): db = mg_globals.database - user = db.User.one({'username':unicode(args.username.lower())}) + user = db.User.one({'username': unicode(args.username.lower())}) if user: user['is_admin'] = True user.save() @@ -100,11 +100,10 @@ def changepw(args): db = mg_globals.database - user = db.User.one({'username':unicode(args.username.lower())}) + user = db.User.one({'username': unicode(args.username.lower())}) if user: user['pw_hash'] = auth_lib.bcrypt_gen_password_hash(args.password) user.save() print 'Password successfully changed' else: print 'The user doesn\'t exist' - diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index b7f52595..f21e2fdd 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -29,8 +29,12 @@ from mediagoblin.workbench import WorkbenchManager from mediagoblin.storage import storage_system_from_config -class Error(Exception): pass -class ImproperlyConfigured(Error): pass +class Error(Exception): + pass + + +class ImproperlyConfigured(Error): + pass def setup_global_and_app_config(config_path): @@ -76,8 +80,8 @@ def setup_database(): "in fact they appear to be from the future?!") setup_globals( - db_connection = connection, - database = db) + db_connection=connection, + database=db) return connection, db @@ -126,8 +130,8 @@ def setup_storage(): queue_store = storage_system_from_config(global_config[key_long]) setup_globals( - public_store = public_store, - queue_store = queue_store) + public_store=public_store, + queue_store=queue_store) return public_store, queue_store @@ -137,7 +141,7 @@ def setup_workbench(): workbench_manager = WorkbenchManager(app_config['workbench_path']) - setup_globals(workbench_manager = workbench_manager) + setup_globals(workbench_manager=workbench_manager) def setup_beaker_cache(): diff --git a/mediagoblin/init/celery/__init__.py b/mediagoblin/init/celery/__init__.py index c58b1305..21ce1d39 100644 --- a/mediagoblin/init/celery/__init__.py +++ b/mediagoblin/init/celery/__init__.py @@ -84,6 +84,6 @@ def setup_celery_from_config(app_config, global_config, for key, value in celery_settings.iteritems(): setattr(this_module, key, value) - + if set_environ: os.environ['CELERY_CONFIG_MODULE'] = settings_module diff --git a/mediagoblin/init/celery/from_celery.py b/mediagoblin/init/celery/from_celery.py index 3e5adb98..05669b67 100644 --- a/mediagoblin/init/celery/from_celery.py +++ b/mediagoblin/init/celery/from_celery.py @@ -44,7 +44,7 @@ def setup_self(check_environ_for_conf=True, module_name=OUR_MODULENAME, if not os.path.exists(mgoblin_conf_file): raise IOError( "MEDIAGOBLIN_CONFIG not set or file does not exist") - + # By setting the environment variable here we should ensure that # this is the module that gets set up. os.environ['CELERY_CONFIG_MODULE'] = module_name diff --git a/mediagoblin/init/config.py b/mediagoblin/init/config.py index 029a0956..ae232e91 100644 --- a/mediagoblin/init/config.py +++ b/mediagoblin/init/config.py @@ -73,7 +73,7 @@ def read_mediagoblin_config(config_path, config_spec=CONFIG_SPEC_PATH): # For now the validator just works with the default functions, # but in the future if we want to add additional validation/configuration # functions we'd add them to validator.functions here. - # + # # See also: # http://www.voidspace.org.uk/python/validate.html#adding-functions validator = Validator() diff --git a/mediagoblin/listings/routing.py b/mediagoblin/listings/routing.py index b72bd015..234f2595 100644 --- a/mediagoblin/listings/routing.py +++ b/mediagoblin/listings/routing.py @@ -25,4 +25,3 @@ tag_routes = [ Route('mediagoblin.listings.tag_atom_feed', "/{tag}/atom/", controller="mediagoblin.listings.views:tag_atom_feed"), ] - diff --git a/mediagoblin/listings/views.py b/mediagoblin/listings/views.py index b3384eb4..2d61ee9b 100644 --- a/mediagoblin/listings/views.py +++ b/mediagoblin/listings/views.py @@ -46,7 +46,7 @@ def tag_listing(request, page): {u'state': u'processed', u'tags.slug': tag_slug}) cursor = cursor.sort('created', DESCENDING) - + pagination = Pagination(page, cursor) media_entries = pagination() @@ -63,6 +63,7 @@ def tag_listing(request, page): ATOM_DEFAULT_NR_OF_UPDATED_ITEMS = 15 + def tag_atom_feed(request): """ generates the atom feed with the tag images diff --git a/mediagoblin/messages.py b/mediagoblin/messages.py index dc82fbf6..054d46c0 100644 --- a/mediagoblin/messages.py +++ b/mediagoblin/messages.py @@ -20,11 +20,13 @@ SUCCESS = 'success' WARNING = 'warning' ERROR = 'error' + def add_message(request, level, text): messages = request.session.setdefault('messages', []) messages.append({'level': level, 'text': text}) request.session.save() + def fetch_messages(request, clear_from_session=True): messages = request.session.get('messages') if messages and clear_from_session: diff --git a/mediagoblin/middleware/noop.py b/mediagoblin/middleware/noop.py index 28380232..820b5d9e 100644 --- a/mediagoblin/middleware/noop.py +++ b/mediagoblin/middleware/noop.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . + class NoOpMiddleware(object): def __init__(self, mg_app): diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 2b9eed6e..9a7d5c39 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -65,9 +65,10 @@ class ProcessMedia(Task): """ If the processing failed we should mark that in the database. - Assuming that the exception raised is a subclass of BaseProcessingFail, - we can use that to get more information about the failure and store that - for conveying information to users about the failure, etc. + Assuming that the exception raised is a subclass of + BaseProcessingFail, we can use that to get more information + about the failure and store that for conveying information to + users about the failure, etc. """ entry_id = args[0] mark_entry_failed(entry_id, exc) @@ -80,10 +81,10 @@ def mark_entry_failed(entry_id, exc): """ Mark a media entry as having failed in its conversion. - Uses the exception that was raised to mark more information. If the - exception is a derivative of BaseProcessingFail then we can store extra - information that can be useful for users telling them why their media failed - to process. + Uses the exception that was raised to mark more information. If + the exception is a derivative of BaseProcessingFail then we can + store extra information that can be useful for users telling them + why their media failed to process. Args: - entry_id: The id of the media entry @@ -164,7 +165,8 @@ def process_image(entry): with queued_file: original_filepath = create_pub_filepath(entry, queued_filepath[-1]) - with mgg.public_store.get_file(original_filepath, 'wb') as original_file: + with mgg.public_store.get_file(original_filepath, 'wb') \ + as original_file: original_file.write(queued_file.read()) mgg.queue_store.delete_file(queued_filepath) diff --git a/mediagoblin/process_media/errors.py b/mediagoblin/process_media/errors.py index 156f0a01..cb236154 100644 --- a/mediagoblin/process_media/errors.py +++ b/mediagoblin/process_media/errors.py @@ -16,17 +16,18 @@ from mediagoblin.util import lazy_pass_to_ugettext as _ + class BaseProcessingFail(Exception): """ Base exception that all other processing failure messages should subclass from. - + You shouldn't call this itself; instead you should subclass it and provid the exception_path and general_message applicable to this error. """ general_message = u'' - + @property def exception_path(self): return u"%s:%s" % ( @@ -34,8 +35,8 @@ class BaseProcessingFail(Exception): def __init__(self, **metadata): self.metadata = metadata or {} - - + + class BadMediaFail(BaseProcessingFail): """ Error that should be raised when an inappropriate file was given diff --git a/mediagoblin/storage/cloudfiles.py b/mediagoblin/storage/cloudfiles.py index b1dd9450..0d3cc3df 100644 --- a/mediagoblin/storage/cloudfiles.py +++ b/mediagoblin/storage/cloudfiles.py @@ -27,6 +27,7 @@ from mediagoblin.storage import StorageInterface, clean_listy_filepath import cloudfiles import mimetypes + class CloudFilesStorage(StorageInterface): ''' OpenStack/Rackspace Cloud's Swift/CloudFiles support diff --git a/mediagoblin/submit/__init__.py b/mediagoblin/submit/__init__.py index 576bd0f5..ba347c69 100644 --- a/mediagoblin/submit/__init__.py +++ b/mediagoblin/submit/__init__.py @@ -13,5 +13,3 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . - - diff --git a/mediagoblin/submit/security.py b/mediagoblin/submit/security.py index 9d62a36e..6708baf7 100644 --- a/mediagoblin/submit/security.py +++ b/mediagoblin/submit/security.py @@ -16,9 +16,9 @@ from mimetypes import guess_type - ALLOWED = ['image/jpeg', 'image/png', 'image/tiff', 'image/gif'] + def check_filetype(posted_file): if not guess_type(posted_file.filename)[0] in ALLOWED: return False diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index e24d78f3..22a13b6d 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -61,8 +61,8 @@ def submit_start(request): entry['description'] = unicode(request.POST.get('description')) entry['description_html'] = cleaned_markdown_conversion( entry['description']) - - entry['media_type'] = u'image' # heh + + entry['media_type'] = u'image' # heh entry['uploader'] = request.user['_id'] # Process the user's folksonomy "tags" @@ -90,8 +90,10 @@ def submit_start(request): # We generate this ourselves so we know what the taks id is for # retrieval later. - # (If we got it off the task's auto-generation, there'd be a risk of - # a race condition when we'd save after sending off the task) + + # (If we got it off the task's auto-generation, there'd be + # a risk of a race condition when we'd save after sending + # off the task) task_id = unicode(uuid.uuid4()) entry['queued_task_id'] = task_id @@ -113,8 +115,8 @@ def submit_start(request): # expect a lot of users to run things in this way we have to # capture stuff here. # - # ... not completely the diaper pattern because the exception is - # re-raised :) + # ... not completely the diaper pattern because the + # exception is re-raised :) mark_entry_failed(entry[u'_id'], exc) # re-raise the exception raise @@ -122,7 +124,7 @@ def submit_start(request): add_message(request, SUCCESS, _('Woohoo! Submitted!')) return redirect(request, "mediagoblin.user_pages.user_home", - user = request.user['username']) + user=request.user['username']) return render_to_response( request, diff --git a/mediagoblin/user_pages/__init__.py b/mediagoblin/user_pages/__init__.py index 576bd0f5..ba347c69 100644 --- a/mediagoblin/user_pages/__init__.py +++ b/mediagoblin/user_pages/__init__.py @@ -13,5 +13,3 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . - - diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 6a82d718..e6ba6b79 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -53,7 +53,7 @@ def user_home(request, page): #if no data is available, return NotFound if media_entries == None: return render_404(request) - + user_gallery_url = request.urlgen( 'mediagoblin.user_pages.user_gallery', user=user['username']) @@ -66,6 +66,7 @@ def user_home(request, page): 'media_entries': media_entries, 'pagination': pagination}) + @uses_pagination def user_gallery(request, page): """'Gallery' of a User()""" @@ -85,7 +86,7 @@ def user_gallery(request, page): #if no data is available, return NotFound if media_entries == None: return render_404(request) - + return render_to_response( request, 'mediagoblin/user_pages/gallery.html', @@ -95,6 +96,7 @@ def user_gallery(request, page): MEDIA_COMMENTS_PER_PAGE = 50 + @get_user_media_entry @uses_pagination def media_home(request, media, page, **kwargs): @@ -142,8 +144,8 @@ def media_post_comment(request): 'Comment posted!') return redirect(request, 'mediagoblin.user_pages.media_home', - media = request.matchdict['media'], - user = request.matchdict['user']) + media=request.matchdict['media'], + user=request.matchdict['user']) @get_user_media_entry @@ -184,6 +186,7 @@ def media_confirm_delete(request, media): ATOM_DEFAULT_NR_OF_UPDATED_ITEMS = 15 + def atom_feed(request): """ generates the atom feed with the newest images @@ -204,7 +207,7 @@ def atom_feed(request): feed = AtomFeed(request.matchdict['user'], feed_url=request.url, url=request.host_url) - + for entry in cursor: feed.add(entry.get('title'), entry.get('description_html'), diff --git a/mediagoblin/util.py b/mediagoblin/util.py index 7ff3ec7f..4132b497 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -45,6 +45,8 @@ 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 @@ -78,7 +80,7 @@ SETUP_JINJA_ENVS = {} def get_jinja_env(template_loader, locale): """ - Set up the Jinja environment, + Set up the Jinja environment, (In the future we may have another system for providing theming; for now this is good enough.) @@ -147,7 +149,7 @@ def render_to_response(request, template, context, status=200): 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') @@ -197,6 +199,7 @@ def import_component(import_string): _punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+') + def slugify(text, delim=u'-'): """ Generates an ASCII-only slug. Taken from http://flask.pocoo.org/snippets/5/ @@ -213,7 +216,7 @@ def slugify(text, delim=u'-'): ### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # We have two "test inboxes" here: -# +# # EMAIL_TEST_INBOX: # ---------------- # If you're writing test views, you'll probably want to check this. @@ -233,7 +236,7 @@ def slugify(text, delim=u'-'): # ***IMPORTANT!*** # ---------------- # Before running tests that call functions which send email, you should -# always call _clear_test_inboxes() to "wipe" the inboxes clean. +# always call _clear_test_inboxes() to "wipe" the inboxes clean. EMAIL_TEST_INBOX = [] EMAIL_TEST_MBOX_INBOX = [] @@ -253,6 +256,7 @@ class FakeMhost(object): 'to': to_addrs, 'message': message}) + def _clear_test_inboxes(): global EMAIL_TEST_INBOX global EMAIL_TEST_MBOX_INBOX @@ -263,6 +267,7 @@ def _clear_test_inboxes(): ### ### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + def send_email(from_addr, to_addrs, subject, message_body): """ Simple email sending wrapper, use this so we can capture messages @@ -418,7 +423,7 @@ def convert_to_tag_list_of_dicts(tag_string): # Split the tag string into a list of tags for tag in stripped_tag_string.split( - mg_globals.app_config['tags_delimiter']): + 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]: @@ -437,12 +442,13 @@ def media_tags_as_string(media_entry_tags): 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]) + [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. @@ -460,6 +466,7 @@ def tag_length_validator(form, field): 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. @@ -474,6 +481,7 @@ def cleaned_markdown_conversion(text): SETUP_GETTEXTS = {} + def setup_gettext(locale): """ Setup the gettext instance based on this locale @@ -558,6 +566,7 @@ def fake_ugettext_passthrough(string): PAGINATION_DEFAULT_PER_PAGE = 30 + class Pagination(object): """ Pagination class for mongodb queries. @@ -574,9 +583,9 @@ class Pagination(object): 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. + - 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 @@ -594,7 +603,6 @@ class Pagination(object): self.active_id = jump_to_id break - def __call__(self): """ Returns slice of objects for the requested page @@ -628,20 +636,18 @@ class Pagination(object): 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 - """ + """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. + """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) @@ -682,6 +688,7 @@ def render_404(request): return render_to_response( request, 'mediagoblin/404.html', {}, status=400) + def delete_media_files(media): """ Delete all files associated with a MediaEntry diff --git a/mediagoblin/views.py b/mediagoblin/views.py index 96687f96..afa6ac91 100644 --- a/mediagoblin/views.py +++ b/mediagoblin/views.py @@ -19,6 +19,7 @@ from mediagoblin.util import render_to_response, Pagination from mediagoblin.db.util import DESCENDING from mediagoblin.decorators import uses_pagination + @uses_pagination def root_view(request, page): cursor = request.db.MediaEntry.find( diff --git a/mediagoblin/workbench.py b/mediagoblin/workbench.py index 722f8e27..60a79f47 100644 --- a/mediagoblin/workbench.py +++ b/mediagoblin/workbench.py @@ -42,8 +42,10 @@ class Workbench(object): def __unicode__(self): return unicode(self.dir) + def __str__(self): return str(self.dir) + def __repr__(self): return repr(self.dir) @@ -140,7 +142,7 @@ class WorkbenchManager(object): self.base_workbench_dir = os.path.abspath(base_workbench_dir) if not os.path.exists(self.base_workbench_dir): os.makedirs(self.base_workbench_dir) - + def create_workbench(self): """ Create and return the path to a new workbench (directory). diff --git a/setup.py b/setup.py index 06626926..11c8fe6c 100644 --- a/setup.py +++ b/setup.py @@ -29,16 +29,17 @@ def get_version(): if mo: return mo.group(1) else: - raise RuntimeError("Unable to find version string in %s." % VERSIONFILE) + raise RuntimeError("Unable to find version string in %s." % + VERSIONFILE) setup( - name = "mediagoblin", - version = get_version(), + name="mediagoblin", + version=get_version(), packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), zip_safe=False, # scripts and dependencies - install_requires = [ + install_requires=[ 'setuptools', 'PasteScript', 'beaker', @@ -66,7 +67,7 @@ setup( # 'lxml', ], test_suite='nose.collector', - entry_points = """\ + entry_points="""\ [console_scripts] gmg = mediagoblin.gmg_commands:main_cli pybabel = mediagoblin.babel.messages.frontend:main @@ -83,7 +84,6 @@ setup( [babel.extractors] jinja2 = jinja2.ext:babel_extract """, - license='AGPLv3', author='Free Software Foundation and contributors', author_email='cwebber@gnu.org', -- cgit v1.2.3 From 285ffeddf3542201b83072d3be544c85e9c487c2 Mon Sep 17 00:00:00 2001 From: Nathan Yergler Date: Sat, 1 Oct 2011 15:10:41 -0700 Subject: has_key is deprecated, converting uses to use "in" operator. --- mediagoblin/auth/views.py | 4 ++-- mediagoblin/db/util.py | 2 +- mediagoblin/gmg_commands/__init__.py | 2 +- mediagoblin/init/__init__.py | 4 ++-- mediagoblin/init/celery/__init__.py | 10 +++++----- mediagoblin/staticdirect.py | 6 +++--- mediagoblin/submit/views.py | 2 +- mediagoblin/util.py | 16 ++++++++-------- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index afcfcf1e..adf2c315 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -146,7 +146,7 @@ def verify_email(request): you are lucky :) """ # If we don't have userid and token parameters, we can't do anything; 404 - if not request.GET.has_key('userid') or not request.GET.has_key('token'): + if not 'userid' in request.GET or not 'token' in request.GET: return render_404(request) user = request.db.User.find_one( @@ -307,6 +307,6 @@ def _process_for_token(request): formdata = { 'vars': formdata_vars, 'has_userid_and_token': - formdata_vars.has_key('userid') and formdata_vars.has_key('token')} + 'userid' in formdata_vars and 'token' in formdata_vars} return formdata diff --git a/mediagoblin/db/util.py b/mediagoblin/db/util.py index 38f0233f..52e97f6d 100644 --- a/mediagoblin/db/util.py +++ b/mediagoblin/db/util.py @@ -148,7 +148,7 @@ class RegisterMigration(object): """ def __init__(self, migration_number, migration_registry=MIGRATIONS): assert migration_number > 0, "Migration number must be > 0!" - assert not migration_registry.has_key(migration_number), \ + assert migration_number not in migration_registry, \ "Duplicate migration numbers detected! That's not allowed!" self.migration_number = migration_number diff --git a/mediagoblin/gmg_commands/__init__.py b/mediagoblin/gmg_commands/__init__.py index b3f69ccc..3250c246 100644 --- a/mediagoblin/gmg_commands/__init__.py +++ b/mediagoblin/gmg_commands/__init__.py @@ -61,7 +61,7 @@ def main_cli(): subparsers = parser.add_subparsers(help='sub-command help') for command_name, command_struct in SUBCOMMAND_MAP.iteritems(): - if command_struct.has_key('help'): + if 'help' in command_struct: subparser = subparsers.add_parser( command_name, help=command_struct['help']) else: diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index f21e2fdd..08a0618d 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -103,10 +103,10 @@ def get_jinja_loader(user_template_path=None): def get_staticdirector(app_config): - if app_config.has_key('direct_remote_path'): + if 'direct_remote_path' in app_config: return staticdirect.RemoteStaticDirect( app_config['direct_remote_path'].strip()) - elif app_config.has_key('direct_remote_paths'): + elif 'direct_remote_paths' in app_config: direct_remote_path_lines = app_config[ 'direct_remote_paths'].strip().splitlines() return staticdirect.MultiRemoteStaticDirect( diff --git a/mediagoblin/init/celery/__init__.py b/mediagoblin/init/celery/__init__.py index 21ce1d39..f7ef9f39 100644 --- a/mediagoblin/init/celery/__init__.py +++ b/mediagoblin/init/celery/__init__.py @@ -40,25 +40,25 @@ def setup_celery_from_config(app_config, global_config, - set_environ: if set, this will CELERY_CONFIG_MODULE to the settings_module """ - if global_config.has_key('celery'): + if 'celery' in global_config: celery_conf = global_config['celery'] else: celery_conf = {} - + celery_settings = {} # set up mongodb stuff celery_settings['CELERY_RESULT_BACKEND'] = 'mongodb' - if not celery_settings.has_key('BROKER_BACKEND'): + if 'BROKER_BACKEND' not in celery_settings: celery_settings['BROKER_BACKEND'] = 'mongodb' celery_mongo_settings = {} - if app_config.has_key('db_host'): + if 'db_host' in app_config: celery_mongo_settings['host'] = app_config['db_host'] if celery_settings['BROKER_BACKEND'] == 'mongodb': celery_settings['BROKER_HOST'] = app_config['db_host'] - if app_config.has_key('db_port'): + if 'db_port' in app_config: celery_mongo_settings['port'] = app_config['db_port'] if celery_settings['BROKER_BACKEND'] == 'mongodb': celery_settings['BROKER_PORT'] = app_config['db_port'] diff --git a/mediagoblin/staticdirect.py b/mediagoblin/staticdirect.py index 58175881..c6d2b374 100644 --- a/mediagoblin/staticdirect.py +++ b/mediagoblin/staticdirect.py @@ -21,24 +21,24 @@ import urlparse # Staticdirect infrastructure. # Borrowed largely from cc.engine # by Chris Webber & Creative Commons -# +# # This needs documentation! #################################### import pkg_resources import urlparse + class StaticDirect(object): def __init__(self): self.cache = {} def __call__(self, filepath): - if self.cache.has_key(filepath): + if filepath in self.cache: return self.cache[filepath] static_direction = self.cache[filepath] = self.get(filepath) return static_direction - def get(self, filepath): # should be implemented by the individual staticdirector diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 22a13b6d..d450ca21 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -40,7 +40,7 @@ def submit_start(request): submit_form = submit_forms.SubmitStartForm(request.POST) if request.method == 'POST' and submit_form.validate(): - if not (request.POST.has_key('file') + if not ('file' in request.POST and isinstance(request.POST['file'], FieldStorage) and request.POST['file'].file): submit_form.file.errors.append( diff --git a/mediagoblin/util.py b/mediagoblin/util.py index 4132b497..d6ce5930 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -89,7 +89,7 @@ def get_jinja_env(template_loader, locale): # If we have a jinja environment set up with this locale, just # return that one. - if SETUP_JINJA_ENVS.has_key(locale): + if locale in SETUP_JINJA_ENVS: return SETUP_JINJA_ENVS[locale] template_env = jinja2.Environment( @@ -166,7 +166,7 @@ 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'): + if not 'user_id' in request.session: request.user = None return @@ -356,7 +356,7 @@ def get_locale_from_request(request): """ request_form = request.GET or request.POST - if request_form.has_key('lang'): + if 'lang' in request_form: return locale_to_lower_upper(request_form['lang']) accept_lang_matches = request.accept_language.best_matches() @@ -364,9 +364,9 @@ def get_locale_from_request(request): # Your routing can explicitly specify a target language matchdict = request.matchdict or {} - if matchdict.has_key('locale'): + if 'locale' in matchdict: target_lang = matchdict['locale'] - elif request.session.has_key('target_lang'): + elif 'target_lang' in request.session: target_lang = request.session['target_lang'] # Pull the first acceptable language elif accept_lang_matches: @@ -393,9 +393,9 @@ HTML_CLEANER = Cleaner( 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 + remove_unknown_tags=False, # can't be used with allow_tags safe_attrs_only=True, - add_nofollow=True, # for now + add_nofollow=True, # for now host_whitelist=(), whitelist_tags=set([])) @@ -492,7 +492,7 @@ def setup_gettext(locale): # TODO: fallback nicely on translations from pt_PT to pt if not # available, etc. - if SETUP_GETTEXTS.has_key(locale): + if locale in SETUP_GETTEXTS: this_gettext = SETUP_GETTEXTS[locale] else: this_gettext = gettext.translation( -- cgit v1.2.3 From 84a7e7706c8b1239f8fd52c604afbb10c776ac04 Mon Sep 17 00:00:00 2001 From: Aaron Williamson Date: Sat, 1 Oct 2011 19:49:56 -0400 Subject: Display and error and redirect to login page if unauthenticated user tries to access resend_verification. --- mediagoblin/auth/views.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index b6f38fec..d91a1f25 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -21,7 +21,7 @@ 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 render_to_response, redirect, render_404, setup_user_in_request from mediagoblin.util import pass_to_ugettext as _ from mediagoblin.db.util import ObjectId, InvalidId from mediagoblin.auth import lib as auth_lib @@ -195,9 +195,18 @@ def resend_activation(request): Resend the activation email. """ + + if not request.GET.has_key('userid') or not request.GET.has_key('token'): + messages.add_message( + request, + messages.ERROR, + _('You must be logged in so we know who to send the email to!')) + + return redirect(request, "/auth/login") + request.user[u'verification_key'] = unicode(uuid.uuid4()) request.user.save() - + email_debug_message(request) send_verification_email(request.user, request) -- cgit v1.2.3 From f1360855319612a9af3c03ae4ca04fef6660f6b0 Mon Sep 17 00:00:00 2001 From: Aaron Williamson Date: Sat, 1 Oct 2011 19:52:12 -0400 Subject: Regenerated English .po file to include new string. --- mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po index 16a235a2..3c176a14 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-10-01 19:51-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,33 +41,37 @@ 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:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:216 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:228 +#: mediagoblin/auth/views.py:257 msgid "" "Could not send password recovery email as your username is inactive or " "your account's email address has not been verified." -- cgit v1.2.3 From 3b74ce94ff90e0bd5b214891becb62a6fc503434 Mon Sep 17 00:00:00 2001 From: Aaron Williamson Date: Mon, 3 Oct 2011 19:59:28 -0400 Subject: Check request.user to determine if user is logged in. --- mediagoblin/auth/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index d91a1f25..fdc5aec8 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -196,7 +196,7 @@ def resend_activation(request): Resend the activation email. """ - if not request.GET.has_key('userid') or not request.GET.has_key('token'): + if request.user is None: messages.add_message( request, messages.ERROR, -- cgit v1.2.3 From 7903a14f986b5bf37a45d5ec3b156c21a1cada72 Mon Sep 17 00:00:00 2001 From: Aaron Williamson Date: Mon, 3 Oct 2011 20:25:11 -0400 Subject: Make sure user isn't already verified before resending verification. --- mediagoblin/auth/views.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 798fae25..dc4c540b 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -196,6 +196,14 @@ def resend_activation(request): Resend the activation email. """ + if request.user["email_verified"]: + messages.add_message( + request, + messages.ERROR, + _("You've already verified your email address!")) + + return redirect(request, "mediagoblin.user_pages.user_home", user=request.user['username']) + if request.user is None: messages.add_message( request, -- cgit v1.2.3 From 2fe6991660cd1a20f9117b0cdc88431085eb7490 Mon Sep 17 00:00:00 2001 From: Aaron Williamson Date: Mon, 3 Oct 2011 20:28:48 -0400 Subject: Reverse order of sanity checks: check email_verified after making sure there's a user in the request. --- mediagoblin/auth/views.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index dc4c540b..d8c441ef 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -196,21 +196,21 @@ def resend_activation(request): Resend the activation email. """ - if request.user["email_verified"]: + if request.user is None: messages.add_message( request, messages.ERROR, - _("You've already verified your email address!")) + _('You must be logged in so we know who to send the email to!')) - return redirect(request, "mediagoblin.user_pages.user_home", user=request.user['username']) + return redirect(request, "/auth/login") - if request.user is None: + if request.user["email_verified"]: messages.add_message( request, messages.ERROR, - _('You must be logged in so we know who to send the email to!')) + _("You've already verified your email address!")) - return redirect(request, "/auth/login") + return redirect(request, "mediagoblin.user_pages.user_home", user=request.user['username']) request.user[u'verification_key'] = unicode(uuid.uuid4()) request.user.save() -- cgit v1.2.3 From 2a8c1b058b43cfcdeb06f711bbf44af9432af410 Mon Sep 17 00:00:00 2001 From: Aaron Williamson Date: Mon, 3 Oct 2011 21:07:16 -0400 Subject: Update english translation file. --- mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po | 60 ++++++++++++++------------ 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po index 3c176a14..ce62e582 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-10-01 19:51-0400\n" +"POT-Creation-Date: 2011-10-03 21:06-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -67,53 +67,57 @@ msgstr "" msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:216 +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:257 +#: mediagoblin/auth/views.py:265 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 "" @@ -129,15 +133,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 "" @@ -176,8 +180,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 "" @@ -249,11 +253,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 "" @@ -279,23 +283,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 "" @@ -303,7 +307,7 @@ msgstr "" msgid "Create an account!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:30 +#: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" msgstr "" @@ -346,7 +350,7 @@ msgstr "" msgid "Submit yer media" msgstr "" -#: mediagoblin/templates/mediagoblin/submit/start.html:29 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 msgid "Submit" msgstr "" @@ -484,7 +488,7 @@ msgstr "" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:175 +#: mediagoblin/user_pages/views.py:176 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" -- cgit v1.2.3 From 26729e0277f883d489157160ab6f0f3fd9d35b47 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Wed, 5 Oct 2011 22:58:42 +0200 Subject: Multimedia refractoring, and added video thumbnail support --- mediagoblin/media_types/__init__.py | 3 + mediagoblin/media_types/video/processing.py | 168 ++++++++++++++------------- mediagoblin/media_types/video/transcoders.py | 113 ++++++++++++++++++ mediagoblin/views.py | 8 +- mediagoblin/workbench.py | 5 +- setup.py | 1 + 6 files changed, 213 insertions(+), 85 deletions(-) create mode 100644 mediagoblin/media_types/video/transcoders.py diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index 6a368cda..49d3ab9d 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -17,6 +17,9 @@ import os import sys +from mediagoblin.util import lazy_pass_to_ugettext as _ + + class FileTypeNotSupported(Exception): pass diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index 4cae1fd8..a7dbcf67 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -17,16 +17,17 @@ import Image import tempfile import pkg_resources +import os from celery.task import Task from celery import registry from mediagoblin.db.util import ObjectId from mediagoblin import mg_globals as mgg - from mediagoblin.util import lazy_pass_to_ugettext as _ - -import mediagoblin.media_types.video +from mediagoblin.process_media.errors import BaseProcessingFail, BadMediaFail +from mediagoblin.process_media import mark_entry_failed +from . import transcoders import gobject gobject.threads_init() @@ -39,10 +40,12 @@ from arista.transcoder import TranscoderOptions THUMB_SIZE = 180, 180 MEDIUM_SIZE = 640, 640 -ARISTA_DEVICE_KEY = 'web' +ARISTA_DEVICE = 'devices/web-advanced.json' +ARISTA_PRESET = None + +loop = None # Is this even used? -loop = None logger = logging.getLogger(__name__) logging.basicConfig() logger.setLevel(logging.DEBUG) @@ -51,10 +54,20 @@ logger.setLevel(logging.DEBUG) def process_video(entry): """ Code to process a video + + Much of this code is derived from the arista-transcoder script in + the arista PyPI package and changed to match the needs of + MediaGoblin + + This function sets up the arista video encoder in some kind of new thread + and attaches callbacks to that child process, hopefully, the + entry-complete callback will be called when the video is done. """ - global loop - loop = None + + ''' Empty dict, will store data which will be passed to the callback + functions ''' info = {} + workbench = mgg.workbench_manager.create_workbench() queued_filepath = entry['queued_media_file'] @@ -62,29 +75,36 @@ def process_video(entry): mgg.queue_store, queued_filepath, 'source') + ''' Initialize arista ''' arista.init() + ''' Loads a preset file which specifies the format of the output video''' + device = arista.presets.load( + pkg_resources.resource_filename( + __name__, + ARISTA_DEVICE)) - web_advanced_preset = pkg_resources.resource_filename( - __name__, - 'presets/web-advanced.json') - device = arista.presets.load(web_advanced_preset) - + # FIXME: Is this needed since we only transcode one video? queue = arista.queue.TranscodeQueue() - - info['tmp_file'] = tmp_file = tempfile.NamedTemporaryFile() - info['medium_filepath'] = medium_filepath = create_pub_filepath(entry, 'video.webm') + info['tmp_file'] = tempfile.NamedTemporaryFile(delete=False) - output = tmp_file.name + info['medium_filepath'] = create_pub_filepath( + entry, 'video.webm') - uri = 'file://' + queued_filename + info['thumb_filepath'] = create_pub_filepath( + entry, 'thumbnail.jpg') - preset = device.presets[device.default] + # With the web-advanced.json device preset, this will select + # 480p WebM w/ OGG Vorbis + preset = device.presets[ARISTA_PRESET or device.default] logger.debug('preset: {0}'.format(preset)) - opts = TranscoderOptions(uri, preset, output) + opts = TranscoderOptions( + 'file://' + queued_filename, # Arista did it this way, IIRC + preset, + info['tmp_file'].name) queue.append(opts) @@ -95,68 +115,78 @@ def process_video(entry): queue.connect("entry-error", _transcoding_error, info) queue.connect("entry-complete", _transcoding_complete, info) - info['loop'] = loop = gobject.MainLoop() + # Add data to the info dict, making it available to the callbacks + info['loop'] = gobject.MainLoop() info['queued_filename'] = queued_filename info['queued_filepath'] = queued_filepath info['workbench'] = workbench + info['preset'] = preset + + info['loop'].run() logger.debug('info: {0}'.format(info)) - loop.run() - - ''' - try: - #thumb = Image.open(mediagoblin.media_types.video.MEDIA_MANAGER['default_thumb']) - 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") +def __create_thumbnail(info): + thumbnail = tempfile.NamedTemporaryFile() - thumb_filepath = create_pub_filepath(entry, 'thumbnail.jpg') - thumb_file = mgg.public_store.get_file(thumb_filepath, 'w') + logger.info('thumbnailing...') + transcoders.VideoThumbnailer(info['tmp_file'].name, thumbnail.name) + logger.debug('Done thumbnailing') - with thumb_file: - thumb.save(thumb_file, "JPEG", quality=90) - ''' + os.remove(info['tmp_file'].name) + + mgg.public_store.get_file(info['thumb_filepath'], 'wb').write( + thumbnail.read()) -def __close_processing(queue, qentry, info, error=False): + info['entry']['media_files']['thumb'] = info['thumb_filepath'] + info['entry'].save() + + +def __close_processing(queue, qentry, info, **kwargs): ''' - Update MediaEntry, move files, handle errors + Updates MediaEntry, moves files, handles errors ''' - if not error: + if not kwargs.get('error'): + logger.info('Transcoding successful') + qentry.transcoder.stop() gobject.idle_add(info['loop'].quit) - info['loop'].quit() + info['loop'].quit() # Do I have to do this again? - print('\n-> Saving video...\n') + logger.info('Saving files...') + # Write the transcoded media to the storage system with info['tmp_file'] as tmp_file: mgg.public_store.get_file(info['medium_filepath'], 'wb').write( tmp_file.read()) info['entry']['media_files']['medium'] = info['medium_filepath'] - print('\n=== DONE! ===\n') - # we have to re-read because unlike PIL, not everything reads # things in string representation :) queued_file = file(info['queued_filename'], 'rb') with queued_file: - original_filepath = create_pub_filepath(info['entry'], info['queued_filepath'][-1]) + original_filepath = create_pub_filepath( + info['entry'], + info['queued_filepath'][-1]) - with mgg.public_store.get_file(original_filepath, 'wb') as original_file: + with mgg.public_store.get_file(original_filepath, 'wb') as \ + original_file: original_file.write(queued_file.read()) mgg.queue_store.delete_file(info['queued_filepath']) + + + logger.debug('...Done') + info['entry']['queued_media_file'] = [] media_files_dict = info['entry'].setdefault('media_files', {}) media_files_dict['original'] = original_filepath - # media_files_dict['thumb'] = thumb_filepath info['entry']['state'] = u'processed' + info['entry']['media_data'][u'preset'] = info['preset'].name + __create_thumbnail(info) info['entry'].save() else: @@ -174,17 +204,20 @@ def _transcoding_start(queue, qentry, info): logger.info('-> Starting transcoding') logger.debug(queue, qentry, info) + def _transcoding_complete(*args): __close_processing(*args) print(args) -def _transcoding_error(*args): - logger.info('-> Error') - __close_processing(*args, error=True) - logger.debug(*args) + +def _transcoding_error(queue, qentry, info): + logger.info('Error') + __close_processing(queue, qentry, info, error=True) + logger.debug(queue, quentry, info) + def _transcoding_pass_setup(queue, qentry, options): - logger.info('-> Pass setup') + logger.info('Pass setup') logger.debug(queue, qentry, options) @@ -200,10 +233,10 @@ def check_interrupted(): except: # Something pretty bad happened... just exit! gobject.idle_add(loop.quit) - + return False return True - + def create_pub_filepath(entry, filename): return mgg.public_store.get_unique_filepath( @@ -212,34 +245,6 @@ def create_pub_filepath(entry, filename): filename]) -class BaseProcessingFail(Exception): - """ - Base exception that all other processing failure messages should - subclass from. - - You shouldn't call this itself; instead you should subclass it - and provid the exception_path and general_message applicable to - this error. - """ - general_message = u'' - - @property - def exception_path(self): - return u"%s:%s" % ( - self.__class__.__module__, self.__class__.__name__) - - def __init__(self, **metadata): - self.metadata = metadata or {} - - -class BadMediaFail(BaseProcessingFail): - """ - Error that should be raised when an inappropriate file was given - for the media type specified. - """ - general_message = _(u'Invalid file given for media type.') - - ################################ # Media processing initial steps ################################ @@ -311,4 +316,3 @@ def mark_entry_failed(entry_id, exc): {'$set': {u'state': u'failed', u'fail_error': None, u'fail_metadata': {}}}) - diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py new file mode 100644 index 00000000..06bfd3cc --- /dev/null +++ b/mediagoblin/media_types/video/transcoders.py @@ -0,0 +1,113 @@ +# 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 . + +import sys +import logging + +_log = logging.getLogger(__name__) +logging.basicConfig() +_log.setLevel(logging.INFO) + +try: + import gobject +except: + _log.error('Could not import gobject') + +try: + import pygst + pygst.require('0.10') + import gst +except: + _log.error('pygst could not be imported') + +class VideoThumbnailer: + def __init__(self, src, dst): + self._set_up_pass(src, dst) + + self.loop = gobject.MainLoop() + self.loop.run() + + def _set_up_pass(self, src, dst): + self.pipeline = gst.Pipeline('TranscodingPipeline') + + _log.debug('Pipeline: {0}'.format(self.pipeline)) + + self.filesrc = gst.element_factory_make('filesrc', 'filesrc') + self.filesrc.set_property('location', src) + self.pipeline.add(self.filesrc) + + self.decoder = gst.element_factory_make('decodebin2', 'decoder') + + self.decoder.connect('new-decoded-pad', self._on_dynamic_pad) + self.pipeline.add(self.decoder) + + self.ffmpegcolorspace = gst.element_factory_make('ffmpegcolorspace', 'ffmpegcolorspace') + self.pipeline.add(self.ffmpegcolorspace) + + self.videoscale = gst.element_factory_make('videoscale', 'videoscale') + self.pipeline.add(self.videoscale) + + self.capsfilter = gst.element_factory_make('capsfilter', 'capsfilter') + self.capsfilter.set_property('caps', gst.caps_from_string('video/x-raw-rgb, width=180, height=100')) + self.pipeline.add(self.capsfilter) + + self.jpegenc = gst.element_factory_make('jpegenc', 'jpegenc') + self.pipeline.add(self.jpegenc) + + self.filesink = gst.element_factory_make('filesink', 'filesink') + self.filesink.set_property('location', dst) + self.pipeline.add(self.filesink) + + # Link all the elements together + self.filesrc.link(self.decoder) + self.ffmpegcolorspace.link(self.videoscale) + self.videoscale.link(self.capsfilter) + self.capsfilter.link(self.jpegenc) + self.jpegenc.link(self.filesink) + + bus = self.pipeline.get_bus() + bus.add_signal_watch() + bus.connect('message', self._on_message) + + self.pipeline.set_state(gst.STATE_PLAYING) + + + def _on_message(self, bus, message): + _log.info((bus, message)) + + t = message.type + + if t == gst.MESSAGE_EOS: + self.__shutdown() + + def _on_dynamic_pad(self, dbin, pad, islast): + ''' + Callback called when ``decodebin2`` has a pad that we can connect to + ''' + pad.link( + self.ffmpegcolorspace.get_pad('sink')) + + def __shutdown(self): + _log.debug(self.loop) + + self.pipeline.set_state(gst.STATE_NULL) + + gobject.idle_add(self.loop.quit) + + +if __name__ == '__main__': + VideoThumbnailer('/home/joar/Dropbox/Public/blender/fluid-box.mp4', '/tmp/dest.jpg') + VideoThumbnailer('/home/joar/Dropbox/iPhone/Video 2011-10-05 21 58 03.mov', '/tmp/dest2.jpg') diff --git a/mediagoblin/views.py b/mediagoblin/views.py index 96687f96..c2e3e80a 100644 --- a/mediagoblin/views.py +++ b/mediagoblin/views.py @@ -14,10 +14,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import sys + from mediagoblin import mg_globals from mediagoblin.util import render_to_response, Pagination from mediagoblin.db.util import DESCENDING from mediagoblin.decorators import uses_pagination +from mediagoblin import media_types + @uses_pagination def root_view(request, page): @@ -26,12 +30,12 @@ def root_view(request, page): pagination = Pagination(page, cursor) media_entries = pagination() - return render_to_response( request, 'mediagoblin/root.html', {'media_entries': media_entries, 'allow_registration': mg_globals.app_config["allow_registration"], - 'pagination': pagination}) + 'pagination': pagination, + 'sys': sys}) def simple_template_render(request): diff --git a/mediagoblin/workbench.py b/mediagoblin/workbench.py index 722f8e27..b5e8eac5 100644 --- a/mediagoblin/workbench.py +++ b/mediagoblin/workbench.py @@ -45,7 +45,10 @@ class Workbench(object): def __str__(self): return str(self.dir) def __repr__(self): - return repr(self.dir) + try: + return str(self) + except AttributeError: + return 'None' def joinpath(self, *args): return os.path.join(self.dir, *args) diff --git a/setup.py b/setup.py index 7417fb97..4ceb4674 100644 --- a/setup.py +++ b/setup.py @@ -66,6 +66,7 @@ setup( ## their package managers. # 'lxml', ], + requires=['gst'], test_suite='nose.collector', entry_points = """\ [console_scripts] -- cgit v1.2.3 From 3528b47d1e731267e57c376da9ad602949e29b22 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Wed, 5 Oct 2011 23:26:50 +0200 Subject: Added parameter to transcoding_error --- mediagoblin/media_types/video/processing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index a7dbcf67..a088468b 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -210,10 +210,10 @@ def _transcoding_complete(*args): print(args) -def _transcoding_error(queue, qentry, info): +def _transcoding_error(queue, qentry, info, *args): logger.info('Error') __close_processing(queue, qentry, info, error=True) - logger.debug(queue, quentry, info) + logger.debug(queue, quentry, info, *args) def _transcoding_pass_setup(queue, qentry, options): -- cgit v1.2.3 From 89d764cd7073939f93d2a7c1ae8d0f2c7c2a1be8 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Thu, 6 Oct 2011 00:00:09 +0200 Subject: Fixed incorrect logger.[...] calls - Added FIXME about thumb size --- mediagoblin/media_types/video/processing.py | 10 +++++----- mediagoblin/media_types/video/transcoders.py | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index a088468b..d7a48caa 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -202,23 +202,23 @@ def __close_processing(queue, qentry, info, **kwargs): def _transcoding_start(queue, qentry, info): logger.info('-> Starting transcoding') - logger.debug(queue, qentry, info) + logger.debug((queue, qentry, info)) def _transcoding_complete(*args): __close_processing(*args) - print(args) + logger.debug(*args) -def _transcoding_error(queue, qentry, info, *args): +def _transcoding_error(queue, qentry, arg, info): logger.info('Error') __close_processing(queue, qentry, info, error=True) - logger.debug(queue, quentry, info, *args) + logger.debug((queue, quentry, info, arg)) def _transcoding_pass_setup(queue, qentry, options): logger.info('Pass setup') - logger.debug(queue, qentry, options) + logger.debug((queue, qentry, options)) def check_interrupted(): diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index 06bfd3cc..1134bc66 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -33,6 +33,7 @@ try: except: _log.error('pygst could not be imported') + class VideoThumbnailer: def __init__(self, src, dst): self._set_up_pass(src, dst) @@ -61,6 +62,7 @@ class VideoThumbnailer: self.pipeline.add(self.videoscale) self.capsfilter = gst.element_factory_make('capsfilter', 'capsfilter') + # FIXME: videoscale doesn't care about original ratios self.capsfilter.set_property('caps', gst.caps_from_string('video/x-raw-rgb, width=180, height=100')) self.pipeline.add(self.capsfilter) -- cgit v1.2.3 From a249b6d3a2e50a1cabd76a240ee391d9e54b1fbf Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Tue, 11 Oct 2011 04:57:17 +0200 Subject: - Refractored the video thumbnailer - Started work on video transcoder Not done, by far! - Bug fix in video.processing error handling --- mediagoblin/media_types/video/processing.py | 1 - mediagoblin/media_types/video/transcoders.py | 322 +++++++++++++++++++++++++-- 2 files changed, 303 insertions(+), 20 deletions(-) diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index d7a48caa..52047ae4 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -213,7 +213,6 @@ def _transcoding_complete(*args): def _transcoding_error(queue, qentry, arg, info): logger.info('Error') __close_processing(queue, qentry, info, error=True) - logger.debug((queue, quentry, info, arg)) def _transcoding_pass_setup(queue, qentry, options): diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index 1134bc66..d305d5fc 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -14,15 +14,18 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from __future__ import division import sys import logging + _log = logging.getLogger(__name__) logging.basicConfig() -_log.setLevel(logging.INFO) +_log.setLevel(logging.DEBUG) try: import gobject + gobject.threads_init() except: _log.error('Could not import gobject') @@ -30,24 +33,83 @@ try: import pygst pygst.require('0.10') import gst + from gst.extend import discoverer except: _log.error('pygst could not be imported') class VideoThumbnailer: - def __init__(self, src, dst): - self._set_up_pass(src, dst) + ''' + Creates a video thumbnail + + - Sets up discoverer & transcoding pipeline. + Discoverer finds out information about the media file + - Launches gobject.MainLoop, this triggers the discoverer to start running + - Once the discoverer is done, it calls the __discovered callback function + - The __discovered callback function launches the transcoding process + - The _on_message callback is called from the transcoding process until it gets a + message of type gst.MESSAGE_EOS, then it calls __stop which shuts down the + gobject.MainLoop + ''' + def __init__(self, src, dst, **kwargs): + _log.info('Initializing VideoThumbnailer...') self.loop = gobject.MainLoop() + self.source_path = src + self.destination_path = dst + + self.destination_dimensions = kwargs.get('dimensions') or (180, 180) + + if not type(self.destination_dimensions) == tuple: + raise Exception('dimensions must be tuple: (width, height)') + + self._setup() + self._run() + + def _setup(self): + self._setup_pass() + self._setup_discover() + + def _run(self): + _log.info('Discovering...') + self.discoverer.discover() + _log.info('Done') + + _log.debug('Initializing MainLoop()') self.loop.run() - def _set_up_pass(self, src, dst): - self.pipeline = gst.Pipeline('TranscodingPipeline') + def _setup_discover(self): + self.discoverer = discoverer.Discoverer(self.source_path) + + # Connect self.__discovered to the 'discovered' event + self.discoverer.connect('discovered', self.__discovered) + + def __discovered(self, data, is_media): + ''' + Callback for media discoverer. + ''' + if not is_media: + self.__stop() + raise Exception('Could not discover {0}'.format(self.source_path)) + + _log.debug('__discovered, data: {0}'.format(data)) + + self.data = data - _log.debug('Pipeline: {0}'.format(self.pipeline)) + self._on_discovered() + + # Tell the transcoding pipeline to start running + self.pipeline.set_state(gst.STATE_PLAYING) + _log.info('Transcoding...') + + def _on_discovered(self): + self.__setup_capsfilter() + + def _setup_pass(self): + self.pipeline = gst.Pipeline('VideoThumbnailerPipeline') self.filesrc = gst.element_factory_make('filesrc', 'filesrc') - self.filesrc.set_property('location', src) + self.filesrc.set_property('location', self.source_path) self.pipeline.add(self.filesrc) self.decoder = gst.element_factory_make('decodebin2', 'decoder') @@ -59,18 +121,17 @@ class VideoThumbnailer: self.pipeline.add(self.ffmpegcolorspace) self.videoscale = gst.element_factory_make('videoscale', 'videoscale') + self.videoscale.set_property('method', 'bilinear') self.pipeline.add(self.videoscale) self.capsfilter = gst.element_factory_make('capsfilter', 'capsfilter') - # FIXME: videoscale doesn't care about original ratios - self.capsfilter.set_property('caps', gst.caps_from_string('video/x-raw-rgb, width=180, height=100')) self.pipeline.add(self.capsfilter) self.jpegenc = gst.element_factory_make('jpegenc', 'jpegenc') self.pipeline.add(self.jpegenc) self.filesink = gst.element_factory_make('filesink', 'filesink') - self.filesink.set_property('location', dst) + self.filesink.set_property('location', self.destination_path) self.pipeline.add(self.filesink) # Link all the elements together @@ -80,20 +141,50 @@ class VideoThumbnailer: self.capsfilter.link(self.jpegenc) self.jpegenc.link(self.filesink) - bus = self.pipeline.get_bus() - bus.add_signal_watch() - bus.connect('message', self._on_message) + self._setup_bus() - self.pipeline.set_state(gst.STATE_PLAYING) + def _setup_bus(self): + self.bus = self.pipeline.get_bus() + self.bus.add_signal_watch() + self.bus.connect('message', self._on_message) + + def __setup_capsfilter(self): + thumbsizes = self.calculate_resize() # Returns tuple with (width, height) + + self.capsfilter.set_property( + 'caps', + gst.caps_from_string('video/x-raw-rgb, width={width}, height={height}'.format( + width=thumbsizes[0], + height=thumbsizes[1] + ))) + def calculate_resize(self): + x_ratio = self.destination_dimensions[0] / self.data.videowidth + y_ratio = self.destination_dimensions[1] / self.data.videoheight + + if self.data.videoheight > self.data.videowidth: + # We're dealing with a portrait! + dimensions = ( + int(self.data.videowidth * y_ratio), + 180) + else: + dimensions = ( + 180, + int(self.data.videoheight * x_ratio)) + + return dimensions def _on_message(self, bus, message): - _log.info((bus, message)) + _log.debug((bus, message)) t = message.type if t == gst.MESSAGE_EOS: - self.__shutdown() + self.__stop() + _log.info('Done') + elif t == gst.MESSAGE_ERROR: + _log.error((bus, message)) + self.__stop() def _on_dynamic_pad(self, dbin, pad, islast): ''' @@ -102,7 +193,163 @@ class VideoThumbnailer: pad.link( self.ffmpegcolorspace.get_pad('sink')) - def __shutdown(self): + def __stop(self): + _log.debug(self.loop) + + self.pipeline.set_state(gst.STATE_NULL) + + gobject.idle_add(self.loop.quit) + + +class VideoTranscoder(): + ''' + Video transcoder + + TODO: + - Currently not working + ''' + def __init__(self, src, dst, **kwargs): + _log.info('Initializing VideoTranscoder...') + + self.loop = gobject.MainLoop() + self.source_path = src + self.destination_path = dst + + self.destination_dimensions = kwargs.get('dimensions') or (180, 180) + + if not type(self.destination_dimensions) == tuple: + raise Exception('dimensions must be tuple: (width, height)') + + self._setup() + self._run() + + def _setup(self): + self._setup_pass() + self._setup_discover() + + def _run(self): + _log.info('Discovering...') + self.discoverer.discover() + _log.info('Done') + + _log.debug('Initializing MainLoop()') + self.loop.run() + + def _setup_discover(self): + self.discoverer = discoverer.Discoverer(self.source_path) + + # Connect self.__discovered to the 'discovered' event + self.discoverer.connect('discovered', self.__discovered) + + def __discovered(self, data, is_media): + ''' + Callback for media discoverer. + ''' + if not is_media: + self.__stop() + raise Exception('Could not discover {0}'.format(self.source_path)) + + _log.debug('__discovered, data: {0}'.format(data)) + + self.data = data + + # Tell the transcoding pipeline to start running + self.pipeline.set_state(gst.STATE_PLAYING) + _log.info('Transcoding...') + + def _on_discovered(self): + self.__setup_capsfilter() + + def _setup_pass(self): + self.pipeline = gst.Pipeline('VideoTranscoderPipeline') + + self.filesrc = gst.element_factory_make('filesrc', 'filesrc') + self.filesrc.set_property('location', self.source_path) + self.pipeline.add(self.filesrc) + + self.decoder = gst.element_factory_make('decodebin2', 'decoder') + + self.decoder.connect('new-decoded-pad', self._on_dynamic_pad) + self.pipeline.add(self.decoder) + + self.ffmpegcolorspace = gst.element_factory_make('ffmpegcolorspace', 'ffmpegcolorspace') + self.pipeline.add(self.ffmpegcolorspace) + + self.videoscale = gst.element_factory_make('videoscale', 'videoscale') + self.videoscale.set_property('method', 'bilinear') + self.pipeline.add(self.videoscale) + + self.capsfilter = gst.element_factory_make('capsfilter', 'capsfilter') + self.pipeline.add(self.capsfilter) + + self.vp8enc = gst.element_factory_make('vp8enc', 'vp8enc') + self.vp8enc.set_property('quality', 6) + self.vp8enc.set_property('threads', 2) + self.vp8enc.set_property('speed', 2) + + self.webmmux = gst.element_factory_make('webmmux', 'webmmux') + self.pipeline.add(self.webmmux) + + self.filesink = gst.element_factory_make('filesink', 'filesink') + + self.filesrc.link(self.decoder) + self.ffmpegcolorspace.link(self.videoscale) + self.videoscale.link(self.capsfilter) + self.vp8enc.link(self.filesink) + + self._setup_bus() + + def _on_dynamic_pad(self, dbin, pad, islast): + ''' + Callback called when ``decodebin2`` has a pad that we can connect to + ''' + pad.link( + self.ffmpegcolorspace.get_pad('sink')) + + def _setup_bus(self): + self.bus = self.pipeline.get_bus() + self.bus.add_signal_watch() + self.bus.connect('message', self._on_message) + + def __setup_capsfilter(self): + thumbsizes = self.calculate_resize() # Returns tuple with (width, height) + + self.capsfilter.set_property( + 'caps', + gst.caps_from_string('video/x-raw-rgb, width={width}, height={height}'.format( + width=thumbsizes[0], + height=thumbsizes[1] + ))) + + def calculate_resize(self): + x_ratio = self.destination_dimensions[0] / self.data.videowidth + y_ratio = self.destination_dimensions[1] / self.data.videoheight + + if self.data.videoheight > self.data.videowidth: + # We're dealing with a portrait! + dimensions = ( + int(self.data.videowidth * y_ratio), + 180) + else: + dimensions = ( + 180, + int(self.data.videoheight * x_ratio)) + + return dimensions + + def _on_message(self, bus, message): + _log.debug((bus, message)) + + t = message.type + + if t == gst.MESSAGE_EOS: + self.__stop() + _log.info('Done') + elif t == gst.MESSAGE_ERROR: + _log.error((bus, message)) + self.__stop() + + def __stop(self): _log.debug(self.loop) self.pipeline.set_state(gst.STATE_NULL) @@ -111,5 +358,42 @@ class VideoThumbnailer: if __name__ == '__main__': - VideoThumbnailer('/home/joar/Dropbox/Public/blender/fluid-box.mp4', '/tmp/dest.jpg') - VideoThumbnailer('/home/joar/Dropbox/iPhone/Video 2011-10-05 21 58 03.mov', '/tmp/dest2.jpg') + from optparse import OptionParser + + parser = OptionParser( + usage='%prog [-v] -a [ video | thumbnail ] SRC DEST') + + parser.add_option('-a', '--action', + dest='action', + help='One of "video" or "thumbnail"') + + parser.add_option('-v', + dest='verbose', + action='store_true', + help='Output debug information') + + parser.add_option('-q', + dest='quiet', + action='store_true', + help='Dear program, please be quiet unless *error*') + + (options, args) = parser.parse_args() + + if options.verbose: + _log.setLevel(logging.DEBUG) + else: + _log.setLevel(logging.INFO) + + if options.quiet: + _log.setLevel(logging.ERROR) + + _log.debug(args) + + if not len(args) == 2: + parser.print_help() + sys.exit() + + if options.action == 'thumbnail': + VideoThumbnailer(*args) + elif options.action == 'video': + VideoTranscoder(*args) -- cgit v1.2.3 From a7ca2a72118f0e0e72bdc2a0547b80ae0d0a32ea Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Fri, 14 Oct 2011 03:15:50 +0200 Subject: import_export - Added some error handling We still want to be able to do an export if a file can't be read --- mediagoblin/gmg_commands/import_export.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index 05edbfc8..fefbdb4e 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -215,10 +215,12 @@ def _export_media(db, args): _log.info('Exporting {0} - {1}'.format( entry['title'], name)) - - mc_file = media_cache.get_file(path, mode='wb') - mc_file.write( - mg_globals.public_store.get_file(path, mode='rb').read()) + try: + mc_file = media_cache.get_file(path, mode='wb') + mc_file.write( + mg_globals.public_store.get_file(path, mode='rb').read()) + except e: + _log.error('Failed: {0}'.format(e)) _log.info('...Media exported') -- cgit v1.2.3 From e9c1b9381deb51f5b8b40580cea41a73eec65df7 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Fri, 14 Oct 2011 03:17:06 +0200 Subject: Video transcoding is now gstreamer directly instead of through arista --- mediagoblin/media_types/video/processing.py | 103 +++++++++---------- mediagoblin/media_types/video/transcoders.py | 113 +++++++++++++++------ .../mediagoblin/media_displays/video.html | 7 +- 3 files changed, 135 insertions(+), 88 deletions(-) diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index 52047ae4..09f8a0d9 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -14,10 +14,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import Image import tempfile import pkg_resources import os +import logging from celery.task import Task from celery import registry @@ -29,21 +29,9 @@ from mediagoblin.process_media.errors import BaseProcessingFail, BadMediaFail from mediagoblin.process_media import mark_entry_failed from . import transcoders -import gobject -gobject.threads_init() - -import gst -import arista -import logging - -from arista.transcoder import TranscoderOptions - THUMB_SIZE = 180, 180 MEDIUM_SIZE = 640, 640 -ARISTA_DEVICE = 'devices/web-advanced.json' -ARISTA_PRESET = None - loop = None # Is this even used? logger = logging.getLogger(__name__) @@ -63,11 +51,6 @@ def process_video(entry): and attaches callbacks to that child process, hopefully, the entry-complete callback will be called when the video is done. """ - - ''' Empty dict, will store data which will be passed to the callback - functions ''' - info = {} - workbench = mgg.workbench_manager.create_workbench() queued_filepath = entry['queued_media_file'] @@ -75,57 +58,65 @@ def process_video(entry): mgg.queue_store, queued_filepath, 'source') - ''' Initialize arista ''' - arista.init() + medium_filepath = create_pub_filepath( + entry, '640p.webm') - ''' Loads a preset file which specifies the format of the output video''' - device = arista.presets.load( - pkg_resources.resource_filename( - __name__, - ARISTA_DEVICE)) + thumbnail_filepath = create_pub_filepath( + entry, 'thumbnail.jpg') - # FIXME: Is this needed since we only transcode one video? - queue = arista.queue.TranscodeQueue() - info['tmp_file'] = tempfile.NamedTemporaryFile(delete=False) + # Create a temporary file for the video destination + tmp_dst = tempfile.NamedTemporaryFile() - info['medium_filepath'] = create_pub_filepath( - entry, 'video.webm') + with tmp_dst: + # Transcode queued file to a VP8/vorbis file that fits in a 640x640 square + transcoder = transcoders.VideoTranscoder(queued_filename, tmp_dst.name) - info['thumb_filepath'] = create_pub_filepath( - entry, 'thumbnail.jpg') + # Push transcoded video to public storage + mgg.public_store.get_file(medium_filepath, 'wb').write( + tmp_dst.read()) + + entry['media_files']['webm_640'] = medium_filepath + + # Save the width and height of the transcoded video + entry['media_data']['video'] = { + u'width': transcoder.dst_data.videowidth, + u'height': transcoder.dst_data.videoheight} - # With the web-advanced.json device preset, this will select - # 480p WebM w/ OGG Vorbis - preset = device.presets[ARISTA_PRESET or device.default] + # Create a temporary file for the video thumbnail + tmp_thumb = tempfile.NamedTemporaryFile() - logger.debug('preset: {0}'.format(preset)) + with tmp_thumb: + # Create a thumbnail.jpg that fits in a 180x180 square + transcoders.VideoThumbnailer(queued_filename, tmp_thumb.name) - opts = TranscoderOptions( - 'file://' + queued_filename, # Arista did it this way, IIRC - preset, - info['tmp_file'].name) + # Push the thumbnail to public storage + mgg.public_store.get_file(thumbnail_filepath, 'wb').write( + tmp_thumb.read()) - queue.append(opts) + entry['media_files']['thumb'] = thumbnail_filepath - info['entry'] = entry - queue.connect("entry-start", _transcoding_start, info) - queue.connect("entry-pass-setup", _transcoding_pass_setup, info) - queue.connect("entry-error", _transcoding_error, info) - queue.connect("entry-complete", _transcoding_complete, info) + # Push original file to public storage + queued_file = file(queued_filename, 'rb') - # Add data to the info dict, making it available to the callbacks - info['loop'] = gobject.MainLoop() - info['queued_filename'] = queued_filename - info['queued_filepath'] = queued_filepath - info['workbench'] = workbench - info['preset'] = preset + with queued_file: + original_filepath = create_pub_filepath( + entry, + queued_filepath[-1]) - info['loop'].run() + with mgg.public_store.get_file(original_filepath, 'wb') as \ + original_file: + original_file.write(queued_file.read()) - logger.debug('info: {0}'.format(info)) + entry['media_files']['original'] = original_filepath + mgg.queue_store.delete_file(queued_filepath) + + + # Save the MediaEntry + entry.save() + def __create_thumbnail(info): thumbnail = tempfile.NamedTemporaryFile() @@ -139,6 +130,7 @@ def __create_thumbnail(info): mgg.public_store.get_file(info['thumb_filepath'], 'wb').write( thumbnail.read()) + info['entry']['media_files']['thumb'] = info['thumb_filepath'] info['entry'].save() @@ -267,6 +259,9 @@ class ProcessMedia(Task): mark_entry_failed(entry[u'_id'], exc) return + entry['state'] = u'processed' + entry.save() + def on_failure(self, exc, task_id, args, kwargs, einfo): """ If the processing failed we should mark that in the database. diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index d305d5fc..8115bb38 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -17,7 +17,7 @@ from __future__ import division import sys import logging - +import pdb _log = logging.getLogger(__name__) logging.basicConfig() @@ -28,14 +28,17 @@ try: gobject.threads_init() except: _log.error('Could not import gobject') + raise Exception() try: import pygst pygst.require('0.10') import gst + from gst import pbutils from gst.extend import discoverer except: _log.error('pygst could not be imported') + raise Exception() class VideoThumbnailer: @@ -201,12 +204,14 @@ class VideoThumbnailer: gobject.idle_add(self.loop.quit) -class VideoTranscoder(): +class VideoTranscoder: ''' Video transcoder + Transcodes the SRC video file to a VP8 WebM video file at DST + TODO: - - Currently not working + - Audio pipeline ''' def __init__(self, src, dst, **kwargs): _log.info('Initializing VideoTranscoder...') @@ -215,7 +220,7 @@ class VideoTranscoder(): self.source_path = src self.destination_path = dst - self.destination_dimensions = kwargs.get('dimensions') or (180, 180) + self.destination_dimensions = kwargs.get('dimensions') or (640, 640) if not type(self.destination_dimensions) == tuple: raise Exception('dimensions must be tuple: (width, height)') @@ -253,12 +258,14 @@ class VideoTranscoder(): self.data = data + self._on_discovered() + # Tell the transcoding pipeline to start running self.pipeline.set_state(gst.STATE_PLAYING) _log.info('Transcoding...') def _on_discovered(self): - self.__setup_capsfilter() + self.__setup_videoscale_capsfilter() def _setup_pass(self): self.pipeline = gst.Pipeline('VideoTranscoderPipeline') @@ -276,7 +283,8 @@ class VideoTranscoder(): self.pipeline.add(self.ffmpegcolorspace) self.videoscale = gst.element_factory_make('videoscale', 'videoscale') - self.videoscale.set_property('method', 'bilinear') + self.videoscale.set_property('method', 2) # I'm not sure this works + self.videoscale.set_property('add-borders', 0) self.pipeline.add(self.videoscale) self.capsfilter = gst.element_factory_make('capsfilter', 'capsfilter') @@ -286,16 +294,36 @@ class VideoTranscoder(): self.vp8enc.set_property('quality', 6) self.vp8enc.set_property('threads', 2) self.vp8enc.set_property('speed', 2) + self.pipeline.add(self.vp8enc) + + + # Audio + self.audioconvert = gst.element_factory_make('audioconvert', 'audioconvert') + self.pipeline.add(self.audioconvert) + + self.vorbisenc = gst.element_factory_make('vorbisenc', 'vorbisenc') + self.vorbisenc.set_property('quality', 0.7) + self.pipeline.add(self.vorbisenc) + self.webmmux = gst.element_factory_make('webmmux', 'webmmux') self.pipeline.add(self.webmmux) self.filesink = gst.element_factory_make('filesink', 'filesink') + self.filesink.set_property('location', self.destination_path) + self.pipeline.add(self.filesink) self.filesrc.link(self.decoder) self.ffmpegcolorspace.link(self.videoscale) self.videoscale.link(self.capsfilter) - self.vp8enc.link(self.filesink) + self.capsfilter.link(self.vp8enc) + self.vp8enc.link(self.webmmux) + + # Audio + self.audioconvert.link(self.vorbisenc) + self.vorbisenc.link(self.webmmux) + + self.webmmux.link(self.filesink) self._setup_bus() @@ -303,39 +331,43 @@ class VideoTranscoder(): ''' Callback called when ``decodebin2`` has a pad that we can connect to ''' - pad.link( - self.ffmpegcolorspace.get_pad('sink')) + _log.debug('Linked {0}'.format(pad)) + + #pdb.set_trace() + + if self.ffmpegcolorspace.get_pad_template('sink')\ + .get_caps().intersect(pad.get_caps()).is_empty(): + pad.link( + self.audioconvert.get_pad('sink')) + else: + pad.link( + self.ffmpegcolorspace.get_pad('sink')) def _setup_bus(self): self.bus = self.pipeline.get_bus() self.bus.add_signal_watch() self.bus.connect('message', self._on_message) - def __setup_capsfilter(self): - thumbsizes = self.calculate_resize() # Returns tuple with (width, height) - - self.capsfilter.set_property( - 'caps', - gst.caps_from_string('video/x-raw-rgb, width={width}, height={height}'.format( - width=thumbsizes[0], - height=thumbsizes[1] - ))) - - def calculate_resize(self): - x_ratio = self.destination_dimensions[0] / self.data.videowidth - y_ratio = self.destination_dimensions[1] / self.data.videoheight + def __setup_videoscale_capsfilter(self): + caps = ['video/x-raw-yuv', 'pixel-aspect-ratio=1/1'] if self.data.videoheight > self.data.videowidth: - # We're dealing with a portrait! - dimensions = ( - int(self.data.videowidth * y_ratio), - 180) + # Whoa! We have ourselves a portrait video! + caps.append('height={0}'.format( + self.destination_dimensions[1])) else: - dimensions = ( - 180, - int(self.data.videoheight * x_ratio)) + # It's a landscape, phew, how normal. + caps.append('width={0}'.format( + self.destination_dimensions[0])) - return dimensions + self.capsfilter.set_property( + 'caps', + gst.caps_from_string( + ', '.join(caps))) + gst.DEBUG_BIN_TO_DOT_FILE ( + self.pipeline, + gst.DEBUG_GRAPH_SHOW_ALL, + 'supersimple-debug-graph') def _on_message(self, bus, message): _log.debug((bus, message)) @@ -343,12 +375,25 @@ class VideoTranscoder(): t = message.type if t == gst.MESSAGE_EOS: - self.__stop() + self._discover_dst_and_stop() _log.info('Done') elif t == gst.MESSAGE_ERROR: _log.error((bus, message)) self.__stop() + def _discover_dst_and_stop(self): + self.dst_discoverer = discoverer.Discoverer(self.destination_path) + + self.dst_discoverer.connect('discovered', self.__dst_discovered) + + self.dst_discoverer.discover() + + + def __dst_discovered(self, data, is_media): + self.dst_data = data + + self.__stop() + def __stop(self): _log.debug(self.loop) @@ -358,6 +403,9 @@ class VideoTranscoder(): if __name__ == '__main__': + import os + os.environ["GST_DEBUG_DUMP_DOT_DIR"] = "/tmp" + os.putenv('GST_DEBUG_DUMP_DOT_DIR', '/tmp') from optparse import OptionParser parser = OptionParser( @@ -396,4 +444,5 @@ if __name__ == '__main__': if options.action == 'thumbnail': VideoThumbnailer(*args) elif options.action == 'video': - VideoTranscoder(*args) + transcoder = VideoTranscoder(*args) + pdb.set_trace() diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html index 22b19240..bff9889a 100644 --- a/mediagoblin/templates/mediagoblin/media_displays/video.html +++ b/mediagoblin/templates/mediagoblin/media_displays/video.html @@ -1,16 +1,19 @@ {% extends 'mediagoblin/user_pages/media.html' %} {% block mediagoblin_media %} -

{% endif %} - {{ wtforms_util.render_divs(login_form) }} -
- -
- {% if next %} - - {% endif %} {% if allow_registration %}

- {% trans %}Don't have an account yet?{% endtrans %} -
- + {% trans %}Don't have an account yet?{% endtrans %} {%- trans %}Create one here!{% endtrans %}

+ {% endif %} + {{ wtforms_util.render_divs(login_form) }}

- {% trans %}Forgot your password?{% endtrans %} -
- {%- trans %}Change it!{% endtrans %} + {% trans %}Forgot your password?{% endtrans %}

+
+ +
+ {% if next %} + {% endif %} -- cgit v1.2.3 From 1b36a8e80c09307a2c4ddf8cc8bfe786a9d86f7d Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 4 Nov 2011 02:20:26 +0100 Subject: On second thought, let's use this title for forgot_password.html --- mediagoblin/templates/mediagoblin/auth/forgot_password.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/auth/forgot_password.html b/mediagoblin/templates/mediagoblin/auth/forgot_password.html index c7f01678..9b821426 100644 --- a/mediagoblin/templates/mediagoblin/auth/forgot_password.html +++ b/mediagoblin/templates/mediagoblin/auth/forgot_password.html @@ -24,7 +24,7 @@ method="POST" enctype="multipart/form-data"> {{ csrf_token }}
-

{% trans %}Forgot your password?{% endtrans %}

+

{% trans %}Recover password{% endtrans %}

{{ wtforms_util.render_divs(fp_form) }}
-- cgit v1.2.3 From 80c9a7ee51590923a3b9f7a07419679af4a368d8 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 4 Nov 2011 02:30:07 +0100 Subject: Small style changes to navigation buttons --- mediagoblin/static/css/base.css | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index b026a819..23a7e6c5 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -290,11 +290,14 @@ img.media_icon{ /* navigation */ .navigation_button{ - width: 139px; + width: 135px; display: block; float: left; text-align: center; - background-color: #222; + background-color: #1d1d1d; + border: 1px solid; + border-color: #2c2c2c #232323 #1a1a1a; + border-radius: 3px; text-decoration: none; padding: 12px 0pt; font-size: 2em; @@ -306,7 +309,7 @@ p.navigation_button{ } .navigation_left{ - margin-right: 2px; + margin-right: 6px; } /* messages */ -- cgit v1.2.3 From da76a8cbaa06ba63533f60051c66f08cd0e7baf4 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 4 Nov 2011 02:34:00 +0100 Subject: Tiny padding change to vertically center navigation button arrows --- mediagoblin/static/css/base.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 23a7e6c5..afd10207 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -299,7 +299,7 @@ img.media_icon{ 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 } -- cgit v1.2.3 From d871f4e0d107268fab9dc33c648b1a6f7a99a652 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 4 Nov 2011 08:23:28 -0500 Subject: Updating translations --- mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo | Bin 11089 -> 11119 bytes mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po | 14 +- mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo | Bin 11272 -> 11583 bytes mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po | 92 +++-- mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo | Bin 11051 -> 11067 bytes mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po | 8 +- mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo | Bin 13895 -> 13899 bytes mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po | 6 +- mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo | Bin 0 -> 10812 bytes mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po | 498 +++++++++++++++++++++++++ 10 files changed, 568 insertions(+), 50 deletions(-) create mode 100644 mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo create mode 100644 mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo index b65212eb..056e3eca 100644 Binary files a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index 5baab62e..5c4ef0d0 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po @@ -16,8 +16,8 @@ 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 \n" +"PO-Revision-Date: 2011-11-02 15:18+0000\n" +"Last-Translator: piratenpanda \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" @@ -259,7 +259,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:38 msgid "Excited to join us?" -msgstr "Neugierig dich uns anzuschliessen?" +msgstr "Neugierig dich uns anzuschließen?" #: mediagoblin/templates/mediagoblin/root.html:39 #, python-format @@ -292,8 +292,8 @@ msgstr "Dein Passwort wurde geändert. Versuche dich jetzt einzuloggen." 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 geschickt mit einer URL, " -"um dein Passwort zu ändern." +"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 @@ -539,11 +539,11 @@ msgstr "Ja, wirklich löschen" #: mediagoblin/user_pages/views.py:142 msgid "Empty comments are not allowed." -msgstr "" +msgstr "Leere Kommentare sind nicht erlaubt." #: mediagoblin/user_pages/views.py:148 msgid "Comment posted!" -msgstr "" +msgstr "Kommentar hinzugefügt!" #: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo index eaa18426..90e83303 100644 Binary files a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po index 16939306..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: +# , 2011. # , 2011. # , 2011. # , 2011. @@ -13,8 +14,8 @@ 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 \n" +"PO-Revision-Date: 2011-11-04 10:05+0000\n" +"Last-Translator: chesuidayeur \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,7 +43,7 @@ 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 @@ -82,6 +83,8 @@ 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:24 mediagoblin/submit/forms.py:27 msgid "Title" @@ -103,6 +106,8 @@ msgstr "La légende ne peut pas être laissée vide." 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:40 msgid "Bio" @@ -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,7 +143,7 @@ msgstr "Fichier" #: mediagoblin/submit/forms.py:30 msgid "Description of this work" -msgstr "" +msgstr "Descriptif pour ce travail" #: mediagoblin/submit/views.py:46 msgid "You must provide a file." @@ -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" @@ -199,12 +204,12 @@ msgid "" "Powered by MediaGoblin, a GNU project" msgstr "" -"Propulsé par MediaGoblin , un GNU de projet" +"Propulsé par MediaGoblin , un projet " +"GNU" #: 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 GNU project, " "after all.)" msgstr "" -"Logiciel libre. (Nous sommes une GNU projet, " +"Logiciel libre. (Nous sommes un projet GNU " "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" " Set up MediaGoblin on your own server" msgstr "" +"Créez gratuitement en compte\n" +" ou\n" +" Installez MediaGoblin sur votre propre serveur" #: mediagoblin/templates/mediagoblin/root.html:53 msgid "Most recent media" -msgstr "" +msgstr "Tout derniers media" #: 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: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,10 +313,19 @@ 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:30 msgid "Logging in failed!" -msgstr "Connexion a échoué!" +msgstr "La connexion a échoué!" #: mediagoblin/templates/mediagoblin/auth/login.html:43 msgid "Don't have an account yet?" @@ -317,11 +337,11 @@ msgstr "Créez-en un ici!" #: 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:52 msgid "Change it!" -msgstr "" +msgstr "Changez-le !" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" @@ -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,15 +544,15 @@ 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 "" +msgstr "Les commentaires vides ne sont pas autorisés." #: mediagoblin/user_pages/views.py:148 msgid "Comment posted!" -msgstr "" +msgstr "Votre commentaire a été posté !" #: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo index 6e9c8897..2ab9cf8b 100644 Binary files a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po index 2598f795..01fe5c48 100644 --- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po @@ -9,8 +9,8 @@ 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 \n" +"PO-Revision-Date: 2011-11-02 20:49+0000\n" +"Last-Translator: gap \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -529,11 +529,11 @@ msgstr "Sunt sigur că doresc să șterg" #: mediagoblin/user_pages/views.py:142 msgid "Empty comments are not allowed." -msgstr "" +msgstr "Comentariul trebuie să aibă un conținut." #: mediagoblin/user_pages/views.py:148 msgid "Comment posted!" -msgstr "" +msgstr "Comentariul a fost transmis." #: mediagoblin/user_pages/views.py:181 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo index 7cfc0b61..4b5481e0 100644 Binary files a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po index aacd5ec8..f4bfbd67 100644 --- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po @@ -9,8 +9,8 @@ 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 \n" +"PO-Revision-Date: 2011-11-04 11:13+0000\n" +"Last-Translator: aleksejrs \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -515,7 +515,7 @@ msgstr "Я уверен, что хочу удалить это" #: mediagoblin/user_pages/views.py:142 msgid "Empty comments are not allowed." -msgstr "" +msgstr "Empty comments are not allowed." #: mediagoblin/user_pages/views.py:148 msgid "Comment posted!" diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo new file mode 100644 index 00000000..b0d8d3fc Binary files /dev/null and b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo differ 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: +# వీవెన్ , 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 \n" +"Language-Team: LANGUAGE \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 MediaGoblin, a GNU 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 GNU 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. (You can help us improve this" +" software!)" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:38 +msgid "Excited to join us?" +msgstr "" + +#: mediagoblin/templates/mediagoblin/root.html:39 +#, python-format +msgid "" +"Create a free account\n" +" or\n" +" Set up MediaGoblin on your own server" +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 "%(username)s'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 log in 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 "" + + -- cgit v1.2.3 From 34b0874d9ad305f4c8d5e892a679bad2f33ed277 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 30 Oct 2011 20:51:55 +0100 Subject: Some docs for the TestingMiddleware To make the TestingMiddleware actually more useful in the future, start to document it. --- mediagoblin/middleware/testing.py | 25 +++++++++++++++++++++++++ mediagoblin/tests/tools.py | 2 ++ 2 files changed, 27 insertions(+) diff --git a/mediagoblin/middleware/testing.py b/mediagoblin/middleware/testing.py index 06714769..99322661 100644 --- a/mediagoblin/middleware/testing.py +++ b/mediagoblin/middleware/testing.py @@ -15,6 +15,23 @@ # along with this program. If not, see . 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 @@ -23,12 +40,20 @@ class TestingMiddleware(object): 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 diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py index e8558240..7f20f6e7 100644 --- a/mediagoblin/tests/tools.py +++ b/mediagoblin/tests/tools.py @@ -107,6 +107,8 @@ def get_test_app(dump_old_app=True): # 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) -- cgit v1.2.3 From 33d11e995d183f339597715472e4f6ecc81ba557 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 12 Nov 2011 13:21:41 +0100 Subject: Move TestingMiddleware to tests/tools.py This middleware isn't needed outside of the tests, so let's just put it there. --- mediagoblin/middleware/testing.py | 59 --------------------------------------- mediagoblin/tests/tools.py | 46 +++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 60 deletions(-) delete mode 100644 mediagoblin/middleware/testing.py diff --git a/mediagoblin/middleware/testing.py b/mediagoblin/middleware/testing.py deleted file mode 100644 index 99322661..00000000 --- a/mediagoblin/middleware/testing.py +++ /dev/null @@ -1,59 +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 . - -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 diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py index 7f20f6e7..420d9ba8 100644 --- a/mediagoblin/tests/tools.py +++ b/mediagoblin/tests/tools.py @@ -23,7 +23,6 @@ from webtest import TestApp from mediagoblin import mg_globals from mediagoblin.tools import testing -from mediagoblin.middleware.testing import TestingMiddleware 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 @@ -51,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': -- cgit v1.2.3 From daed11b81263c3841ae23f45ed1bf33aa2e92992 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 12 Nov 2011 14:26:35 +0100 Subject: 640: Configuration files should mention their _local versions Thanks go to Aleksej Serdjukov for bringing this up and providing the patch in the bug! --- mediagoblin.ini | 3 +++ paste.ini | 3 +++ 2 files changed, 6 insertions(+) diff --git a/mediagoblin.ini b/mediagoblin.ini index c22d12d7..728ab2f2 100644 --- a/mediagoblin.ini +++ b/mediagoblin.ini @@ -1,3 +1,6 @@ +# If you want to make changes to this file, first copy it to +# mediagoblin_local.ini, then make the changes there. + [mediagoblin] direct_remote_path = /mgoblin_static/ email_sender_address = "notice@mediagoblin.example.org" diff --git a/paste.ini b/paste.ini index 8866789c..c729e41d 100644 --- a/paste.ini +++ b/paste.ini @@ -1,3 +1,6 @@ +# If you want to make changes to this file, first copy it to +# paste_local.ini, then make the changes there. + [DEFAULT] # Set to true to enable web-based debugging messages and etc. debug = false -- cgit v1.2.3 From 8bb3eb185ab14e8e8f4fc7b3df9eac4e1438d030 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 12 Nov 2011 08:10:46 -0600 Subject: Probably should have MANIFEST.in checked in, for doing python sdists --- MANIFEST.in | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..b1f93dba --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,5 @@ +recursive-include mediagoblin/templates *.html +recursive-include mediagoblin/static *.js *.css *.png *.svg +recursive-include mediagoblin/tests *.ini +recursive-include docs *.rst *.html + -- cgit v1.2.3 From 0cf5b8ad2499a93fdba5ff1202fdc554208ec85f Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 12 Nov 2011 13:35:41 -0600 Subject: Don't force-convert resized images to JPEG. That's just not nice for those of us who like transparency! --- mediagoblin/process_media/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 2b9eed6e..85bdcbea 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -136,7 +136,7 @@ def process_image(entry): 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 @@ -154,7 +154,7 @@ def process_image(entry): 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 -- cgit v1.2.3 From d0504cfa875b0ac7340fb00a64fc8422faecdc9a Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 12 Nov 2011 15:12:39 -0600 Subject: Final step for non-force-conversion to jpeg --- mediagoblin/process_media/__init__.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 85bdcbea..f63fb2b0 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 . -import Image +import os +import Image from celery.task import Task from celery import registry @@ -122,17 +123,16 @@ 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: @@ -147,10 +147,7 @@ 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: -- cgit v1.2.3 From efd0a42ca1b81a2dd17aee1626060584a278020c Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 13 Nov 2011 19:51:11 +0100 Subject: Mark two strings for translation --- mediagoblin/edit/views.py | 2 +- mediagoblin/templates/mediagoblin/base.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index a6ddb553..17244831 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -170,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/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'] }} - (log out) + ({% trans %}log out{% endtrans %}) {% else %} {% trans %}Log in{% endtrans %} -- cgit v1.2.3 From b97ae0fd7da45c32897a4cb8437c04ddf04fdc95 Mon Sep 17 00:00:00 2001 From: Nathan Yergler Date: Sun, 13 Nov 2011 11:41:43 -0800 Subject: Issue 653: Don't throw exception if response has no vary header. --- mediagoblin/middleware/csrf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/middleware/csrf.py b/mediagoblin/middleware/csrf.py index 7a5e352e..6c977f21 100644 --- a/mediagoblin/middleware/csrf.py +++ b/mediagoblin/middleware/csrf.py @@ -98,7 +98,7 @@ class CsrfMiddleware(object): httponly=True) # update the Vary header - response.vary = (response.vary or []) + ['Cookie'] + response.vary = getattr(response, 'vary', []) + ['Cookie'] def _make_token(self, request): """Generate a new token to use for CSRF protection.""" -- cgit v1.2.3 From ad3f1233df672688c09ab923d8bb216a351db8cb Mon Sep 17 00:00:00 2001 From: Nathan Yergler Date: Sun, 13 Nov 2011 11:59:24 -0800 Subject: Issue 653: Handle the case where request.vary is None --- mediagoblin/middleware/csrf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/middleware/csrf.py b/mediagoblin/middleware/csrf.py index 6c977f21..d0601af8 100644 --- a/mediagoblin/middleware/csrf.py +++ b/mediagoblin/middleware/csrf.py @@ -98,7 +98,7 @@ class CsrfMiddleware(object): httponly=True) # update the Vary header - response.vary = getattr(response, 'vary', []) + ['Cookie'] + response.vary = (getattr(response, 'vary') or []) + ['Cookie'] def _make_token(self, request): """Generate a new token to use for CSRF protection.""" -- cgit v1.2.3 From d9ed3aeb402fc66de2a79d145b5a443c9e660c18 Mon Sep 17 00:00:00 2001 From: Nathan Yergler Date: Sun, 13 Nov 2011 12:07:09 -0800 Subject: Issue 653: This time for sure! --- mediagoblin/middleware/csrf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/middleware/csrf.py b/mediagoblin/middleware/csrf.py index d0601af8..8275c18e 100644 --- a/mediagoblin/middleware/csrf.py +++ b/mediagoblin/middleware/csrf.py @@ -98,7 +98,7 @@ class CsrfMiddleware(object): httponly=True) # update the Vary header - response.vary = (getattr(response, 'vary') or []) + ['Cookie'] + response.vary = (getattr(response, 'vary', None) or []) + ['Cookie'] def _make_token(self, request): """Generate a new token to use for CSRF protection.""" -- cgit v1.2.3 From 688f56c2dc579218b35263d0189e5d7c9ba9627f Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 13 Nov 2011 14:34:22 -0600 Subject: Improved title block on media page --- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 17beffb2..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 %}
-- cgit v1.2.3 From 017d6ca3501b157277fc01fb37df2dbbd9ed17ef Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 13 Nov 2011 14:38:40 -0600 Subject: Enhanced title for user profile page --- mediagoblin/templates/mediagoblin/user_pages/user.html | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 %} -- cgit v1.2.3 From 7fc25d27208ef9926e94eeba953160ffbe676942 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 13 Nov 2011 14:40:11 -0600 Subject: If the gallery view makes sure we have a user anyway, do we need this check? Seems like the classic annoying "SHOULD NEVER HAPPEN" else: statement :) --- .../templates/mediagoblin/user_pages/gallery.html | 39 ++++++++++------------ 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html index df931d9c..86105493 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html +++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html @@ -27,28 +27,23 @@ {% endblock mediagoblin_head %} {% block mediagoblin_content -%} - {% if user %} -

- {%- trans username=user.username, - user_url=request.urlgen( - 'mediagoblin.user_pages.user_home', - user=user.username) -%} - {{ username }}'s media - {%- endtrans %} -

+

+ {%- trans username=user.username, + user_url=request.urlgen( + 'mediagoblin.user_pages.user_home', + user=user.username) -%} + {{ username }}'s media + {%- endtrans %} +

- + -
- {% set feed_url = request.urlgen( - 'mediagoblin.user_pages.atom_feed', - user=user.username) %} - {% include "mediagoblin/utils/feed_link.html" %} -
- {% else %} - {# This *should* not occur as the view makes sure we pass in a user. #} -

{% trans %}Sorry, no such user found.{% endtrans %}

- {% endif %} +

+ {% set feed_url = request.urlgen( + 'mediagoblin.user_pages.atom_feed', + user=user.username) %} + {% include "mediagoblin/utils/feed_link.html" %} +
{% endblock %} -- cgit v1.2.3 From ab56689017daa985f3938af4710f3c76ad415bda Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 13 Nov 2011 14:42:03 -0600 Subject: Enhanced title on the user's main media gallery --- mediagoblin/templates/mediagoblin/user_pages/gallery.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html index 86105493..b066dd71 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html +++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html @@ -26,6 +26,12 @@ user=user.username) }}"> {% endblock mediagoblin_head %} +{% block title %} + {%- trans username=user.username -%} + {{ username }}'s media + {%- endtrans %} — {{ super() }} +{% endblock %} + {% block mediagoblin_content -%}

{%- trans username=user.username, -- cgit v1.2.3 From 4671fda345394dad9ca4278b1cf7b2cdf7d2b4ee Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 13 Nov 2011 14:48:51 -0600 Subject: Improving on tag page *and* adjusting translation for RTL reasons Basically moving the variable inside the translation to give translators more flexibility --- mediagoblin/templates/mediagoblin/listings/tag.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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"> -- cgit v1.2.3 From 2b7aa99d3c221e713a95b664491f35612f9023cc Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber <cwebber@dustycloud.org> Date: Sun, 13 Nov 2011 20:39:42 -0600 Subject: Only show "post a comment" link if comments already exist The purpose of the link is to help you jump past comments to the comment box, and so... Even with this new conditional, I'm not entirely sure I like that link ;) --- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 2441ec1b..1e495b98 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -62,7 +62,7 @@ {%- endtrans %} </p> <h3></h3> - {% if request.user %} + {% if request.user and comments.count() %} <p><a href="#comment_form">{% trans %}Post a comment{% endtrans %}</a></p> {% endif %} {% if comments %} -- cgit v1.2.3 From b33701b851ef7f848d8d7b47e3654552da32b485 Mon Sep 17 00:00:00 2001 From: Joar Wandborg <git@wandborg.com> Date: Tue, 15 Nov 2011 00:27:21 +0100 Subject: moved from videoscale => ffvideoscale *and* put queus before video and audio pipes --- mediagoblin/media_types/video/transcoders.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index 512c7cb6..3a30aedf 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -624,13 +624,16 @@ class VideoTranscoder: self.pipeline.add(self.decoder) # Video elements + self.videoqueue = gst.element_factory_make('queue', 'videoqueue') + self.pipeline.add(self.videoqueue) + self.ffmpegcolorspace = gst.element_factory_make( 'ffmpegcolorspace', 'ffmpegcolorspace') self.pipeline.add(self.ffmpegcolorspace) - self.videoscale = gst.element_factory_make('videoscale', 'videoscale') - self.videoscale.set_property('method', 2) # I'm not sure this works - self.videoscale.set_property('add-borders', 0) + self.videoscale = gst.element_factory_make('ffvideoscale', 'videoscale') + #self.videoscale.set_property('method', 2) # I'm not sure this works + #self.videoscale.set_property('add-borders', 0) self.pipeline.add(self.videoscale) self.capsfilter = gst.element_factory_make('capsfilter', 'capsfilter') @@ -642,6 +645,9 @@ class VideoTranscoder: self.pipeline.add(self.vp8enc) # Audio elements + self.audioqueue = gst.element_factory_make('queue', 'audioqueue') + self.pipeline.add(self.audioqueue) + self.audioconvert = gst.element_factory_make('audioconvert', 'audioconvert') self.pipeline.add(self.audioconvert) @@ -679,6 +685,7 @@ class VideoTranscoder: self.filesrc.link(self.decoder) # Link all the video elements in a link to webmux + self.videoqueue.link(self.ffmpegcolorspace) self.ffmpegcolorspace.link(self.videoscale) self.videoscale.link(self.capsfilter) #self.capsfilter.link(self.xvimagesink) @@ -688,6 +695,7 @@ class VideoTranscoder: if self.data.is_audio: # Link all the audio elements in a line to webmux #self.audioconvert.link(self.alsasink) + self.audioqueue.link(self.audioconvert) self.audioconvert.link(self.vorbisenc) self.vorbisenc.link(self.webmmux) @@ -707,10 +715,10 @@ class VideoTranscoder: if self.ffmpegcolorspace.get_pad_template('sink')\ .get_caps().intersect(pad.get_caps()).is_empty(): # It is NOT a video src pad. - pad.link(self.audioconvert.get_pad('sink')) + pad.link(self.audioqueue.get_pad('sink')) else: # It IS a video src pad. - pad.link(self.ffmpegcolorspace.get_pad('sink')) + pad.link(self.videoqueue.get_pad('sink')) def _setup_bus(self): self.bus = self.pipeline.get_bus() -- cgit v1.2.3 From a9c7af90408c3537f42763e63862a2ae44bcc368 Mon Sep 17 00:00:00 2001 From: Elrond <elrond+mediagoblin.org@samba-tng.org> Date: Tue, 15 Nov 2011 11:21:15 +0100 Subject: export: Handle Unicode titles better in logging log("ascii %s" % unicode_string) tries to convert unicode to ascii, which might fail. Better use log(u"unicode format %s" % unicode_string) and let the logging framework handle the conversion. This works much better and the exceptions still happening aren't stopping the main app. Also remove one useless import. --- mediagoblin/gmg_commands/import_export.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index a46219a0..30112969 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -16,7 +16,6 @@ from mediagoblin import mg_globals from mediagoblin.db.open import setup_connection_and_db_from_config -from mediagoblin.init.config import read_mediagoblin_config from mediagoblin.storage.filestorage import BasicFileStorage from mediagoblin.init import setup_storage, setup_global_and_app_config @@ -209,7 +208,7 @@ def _export_media(db, args): for entry in db.media_entries.find(): for name, path in entry['media_files'].items(): - _log.info('Exporting {0} - {1}'.format( + _log.info(u'Exporting {0} - {1}'.format( entry['title'], name)) -- cgit v1.2.3 From 7cbddc96a85410c14583b598312e40efe6051a44 Mon Sep 17 00:00:00 2001 From: Elrond <elrond+mediagoblin.org@samba-tng.org> Date: Mon, 14 Nov 2011 14:21:06 +0100 Subject: Enable mongokit's "Dot notation" mongokit documents can allow to use x.FIELD instead of x["FIELD"]. First it looks a lot more pythonic. Second it might allow us an easier migration path towards an sqlalchemy database backend. Docs: http://namlook.github.com/mongokit/tutorial.html#dot-notation --- mediagoblin/db/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index c010cb89..65c15917 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -63,6 +63,7 @@ class User(Document): - bio_html: biography of the user converted to proper HTML. """ __collection__ = 'users' + use_dot_notation = True structure = { 'username': unicode, @@ -177,6 +178,7 @@ class MediaEntry(Document): - fail_metadata: """ __collection__ = 'media_entries' + use_dot_notation = True structure = { 'uploader': ObjectId, @@ -321,6 +323,7 @@ class MediaComment(Document): """ __collection__ = 'media_comments' + use_dot_notation = True structure = { 'media_entry': ObjectId, -- cgit v1.2.3 From eabe6b678a98fd06d9cd8463935a3b842f41485c Mon Sep 17 00:00:00 2001 From: Elrond <elrond+mediagoblin.org@samba-tng.org> Date: Sun, 13 Nov 2011 19:25:06 +0100 Subject: Dot-Notation for "_id" Note: Migrations can't use "Dot Notation"! Migrations run on pymongo, not mongokit. So they can't use the "Dot Notation". This isn't really a big issue, as migrations are anyway quite mongo specific. --- mediagoblin/auth/lib.py | 4 ++-- mediagoblin/auth/views.py | 4 ++-- mediagoblin/db/models.py | 10 +++++----- mediagoblin/decorators.py | 6 +++--- mediagoblin/edit/lib.py | 2 +- mediagoblin/edit/views.py | 6 +++--- mediagoblin/process_media/__init__.py | 4 ++-- mediagoblin/submit/views.py | 10 +++++----- .../templates/mediagoblin/user_pages/media.html | 10 +++++----- mediagoblin/templates/mediagoblin/user_pages/user.html | 6 +++--- mediagoblin/tests/test_auth.py | 12 ++++++------ mediagoblin/tests/test_submission.py | 6 +++--- mediagoblin/tools/pagination.py | 2 +- mediagoblin/user_pages/views.py | 18 +++++++++--------- 14 files changed, 50 insertions(+), 50 deletions(-) diff --git a/mediagoblin/auth/lib.py b/mediagoblin/auth/lib.py index 653424cc..cf4a2b83 100644 --- a/mediagoblin/auth/lib.py +++ b/mediagoblin/auth/lib.py @@ -109,7 +109,7 @@ def send_verification_email(user, request): 'verification_url': EMAIL_VERIFICATION_TEMPLATE.format( host=request.host, uri=request.urlgen('mediagoblin.auth.verify_email'), - userid=unicode(user['_id']), + userid=unicode(user._id), verification_key=user['verification_key'])}) # TODO: There is no error handling in place @@ -144,7 +144,7 @@ def send_fp_verification_email(user, request): 'verification_url': EMAIL_FP_VERIFICATION_TEMPLATE.format( host=request.host, uri=request.urlgen('mediagoblin.auth.verify_forgot_password'), - userid=unicode(user['_id']), + userid=unicode(user._id), fp_verification_key=user['fp_verification_key'])}) # TODO: There is no error handling in place diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 8888d23c..8412b81c 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -87,7 +87,7 @@ def register(request): user.save(validate=True) # log the user in - request.session['user_id'] = unicode(user['_id']) + request.session['user_id'] = unicode(user._id) request.session.save() # send verification email @@ -122,7 +122,7 @@ def login(request): if user and user.check_login(request.POST['password']): # set up login in session - request.session['user_id'] = unicode(user['_id']) + request.session['user_id'] = unicode(user._id) request.session.save() if request.POST.get('next'): diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 65c15917..1c1bc2fd 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -219,7 +219,7 @@ class MediaEntry(Document): def get_comments(self): return self.db.MediaComment.find({ - 'media_entry': self['_id']}).sort('created', DESCENDING) + 'media_entry': self._id}).sort('created', DESCENDING) def get_display_media(self, media_map, fetch_order=common.DISPLAY_IMAGE_FETCHING_ORDER): @@ -250,7 +250,7 @@ class MediaEntry(Document): {'slug': self['slug']}) if duplicate: - self['slug'] = "%s-%s" % (self['_id'], self['slug']) + self['slug'] = "%s-%s" % (self._id, self['slug']) def url_for_self(self, urlgen): """ @@ -269,13 +269,13 @@ class MediaEntry(Document): return urlgen( 'mediagoblin.user_pages.media_home', user=uploader['username'], - media=unicode(self['_id'])) + media=unicode(self._id)) def url_to_prev(self, urlgen): """ Provide a url to the previous entry from this user, if there is one """ - cursor = self.db.MediaEntry.find({'_id': {"$gt": self['_id']}, + cursor = self.db.MediaEntry.find({'_id': {"$gt": self._id}, 'uploader': self['uploader'], 'state': 'processed'}).sort( '_id', ASCENDING).limit(1) @@ -288,7 +288,7 @@ class MediaEntry(Document): """ Provide a url to the next entry from this user, if there is one """ - cursor = self.db.MediaEntry.find({'_id': {"$lt": self['_id']}, + cursor = self.db.MediaEntry.find({'_id': {"$lt": self._id}, 'uploader': self['uploader'], 'state': 'processed'}).sort( '_id', DESCENDING).limit(1) diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index b247e229..8f7532ec 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -60,7 +60,7 @@ def user_may_delete_media(controller): uploader = request.db.MediaEntry.find_one( {'_id': ObjectId(request.matchdict['media'])}).uploader() if not (request.user['is_admin'] or - request.user['_id'] == uploader['_id']): + request.user._id == uploader._id): return exc.HTTPForbidden() return controller(request, *args, **kwargs) @@ -99,7 +99,7 @@ def get_user_media_entry(controller): media = request.db.MediaEntry.find_one( {'slug': request.matchdict['media'], 'state': 'processed', - 'uploader': user['_id']}) + 'uploader': user._id}) # no media via slug? Grab it via ObjectId if not media: @@ -107,7 +107,7 @@ def get_user_media_entry(controller): media = request.db.MediaEntry.find_one( {'_id': ObjectId(request.matchdict['media']), 'state': 'processed', - 'uploader': user['_id']}) + 'uploader': user._id}) except InvalidId: return render_404(request) diff --git a/mediagoblin/edit/lib.py b/mediagoblin/edit/lib.py index b722e9c1..458b704e 100644 --- a/mediagoblin/edit/lib.py +++ b/mediagoblin/edit/lib.py @@ -17,7 +17,7 @@ def may_edit_media(request, media): """Check, if the request's user may edit the media details""" - if media['uploader'] == request.user['_id']: + if media['uploader'] == request.user._id: return True if request.user['is_admin']: return True diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index f3ebebe8..5f781552 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -57,7 +57,7 @@ def edit_media(request, media): existing_user_slug_entries = request.db.MediaEntry.find( {'slug': request.POST['slug'], 'uploader': media['uploader'], - '_id': {'$ne': media['_id']}}).count() + '_id': {'$ne': media._id}}).count() if existing_user_slug_entries: form.slug.errors.append( @@ -78,7 +78,7 @@ def edit_media(request, media): location=media.url_for_self(request.urlgen)) if request.user['is_admin'] \ - and media['uploader'] != request.user['_id'] \ + and media['uploader'] != request.user._id \ and request.method != 'POST': messages.add_message( request, messages.WARNING, @@ -104,7 +104,7 @@ def edit_attachments(request, media): attachment_public_filepath \ = mg_globals.public_store.get_unique_filepath( - ['media_entries', unicode(media['_id']), 'attachment', + ['media_entries', unicode(media._id), 'attachment', secure_filename(request.POST['attachment_file'].filename)]) attachment_public_file = mg_globals.public_store.get_file( diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 3d6b418f..34d83e54 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -32,7 +32,7 @@ MEDIUM_SIZE = 640, 640 def create_pub_filepath(entry, filename): return mgg.public_store.get_unique_filepath( ['media_entries', - unicode(entry['_id']), + unicode(entry._id), filename]) @@ -56,7 +56,7 @@ class ProcessMedia(Task): try: process_image(entry) except BaseProcessingFail, exc: - mark_entry_failed(entry[u'_id'], exc) + mark_entry_failed(entry._id, exc) return entry['state'] = u'processed' diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 25f7d79d..bd63bd18 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -52,7 +52,7 @@ def submit_start(request): # create entry and save in database entry = request.db.MediaEntry() - entry['_id'] = ObjectId() + entry._id = ObjectId() entry['title'] = ( unicode(request.POST['title']) or unicode(splitext(filename)[0])) @@ -62,7 +62,7 @@ def submit_start(request): entry['description']) entry['media_type'] = u'image' # heh - entry['uploader'] = request.user['_id'] + entry['uploader'] = request.user._id # Process the user's folksonomy "tags" entry['tags'] = convert_to_tag_list_of_dicts( @@ -74,7 +74,7 @@ def submit_start(request): # Now store generate the queueing related filename queue_filepath = request.app.queue_store.get_unique_filepath( ['media_entries', - unicode(entry['_id']), + unicode(entry._id), secure_filename(filename)]) # queue appropriately @@ -105,7 +105,7 @@ def submit_start(request): # conditions with changes to the document via processing code) try: process_media.apply_async( - [unicode(entry['_id'])], {}, + [unicode(entry._id)], {}, task_id=task_id) except BaseException as exc: # The purpose of this section is because when running in "lazy" @@ -116,7 +116,7 @@ def submit_start(request): # # ... not completely the diaper pattern because the # exception is re-raised :) - mark_entry_failed(entry[u'_id'], exc) + mark_entry_failed(entry._id, exc) # re-raise the exception raise diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 1e495b98..4b02b684 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -69,10 +69,10 @@ {% for comment in comments %} {% set comment_author = comment.author() %} {% if pagination.active_id == comment._id %} - <div class="comment_wrapper comment_active" id="comment-{{ comment['_id'] }}"> + <div class="comment_wrapper comment_active" id="comment-{{ comment._id }}"> <a name="comment" id="comment"></a> {% else %} - <div class="comment_wrapper" id="comment-{{ comment['_id'] }}"> + <div class="comment_wrapper" id="comment-{{ comment._id }}"> {% endif %} <div class="comment_content">{% autoescape False %}{{ comment.content_html }} @@ -83,7 +83,7 @@ {{ comment_author['username'] }}</a> {% trans %}at{% endtrans %} <a href="{{ request.urlgen('mediagoblin.user_pages.media_home.view_comment', - comment = comment['_id'], + comment = comment._id, user = media.uploader().username, media = media._id) }}#comment"> {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }} @@ -114,7 +114,7 @@ <div class="grid_5 omega"> {% include "mediagoblin/utils/prev_next.html" %} - {% if media['uploader'] == request.user['_id'] or + {% if media['uploader'] == request.user._id or request.user['is_admin'] %} <h3>{% trans %}Actions{% endtrans %}</h3> <p> @@ -151,7 +151,7 @@ {% endif %} {% if app_config['allow_attachments'] - and (media['uploader'] == request.user['_id'] + and (media['uploader'] == request.user._id or request.user['is_admin']) %} <p> <a href="{{ request.urlgen('mediagoblin.edit.attachments', diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index d65da055..1de7f611 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -90,7 +90,7 @@ </h1> {% if not user['url'] and not user['profile'] %} - {% if request.user['_id'] == user['_id'] %} + {% if request.user._id == user._id %} <div class="grid_6 alpha empty_space"> <p> {% trans %}Here's a spot to tell others about yourself.{% endtrans %} @@ -113,7 +113,7 @@ {% else %} <div class="grid_6 alpha"> {% include "mediagoblin/utils/profile.html" %} - {% if request.user['_id'] == user['_id'] or request.user['is_admin'] %} + {% if request.user._id == user._id or request.user['is_admin'] %} <a href="{{ request.urlgen('mediagoblin.edit.profile') }}?username={{ user.username }}"> {%- trans %}Edit profile{% endtrans -%} @@ -140,7 +140,7 @@ {% include "mediagoblin/utils/feed_link.html" %} </div> {% else %} - {% if request.user['_id'] == user['_id'] %} + {% if request.user._id == user._id %} <div class="grid_10 omega empty_space"> <p> {% trans -%} diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index 40961eca..153c6e53 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -168,7 +168,7 @@ def test_register_views(test_app): ## Make sure user is logged in request = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/user_pages/user.html']['request'] - assert request.session['user_id'] == unicode(new_user['_id']) + assert request.session['user_id'] == unicode(new_user._id) ## Make sure we get email confirmation, and try verifying assert len(mail.EMAIL_TEST_INBOX) == 1 @@ -185,7 +185,7 @@ def test_register_views(test_app): ### user should have these same parameters assert parsed_get_params['userid'] == [ - unicode(new_user['_id'])] + unicode(new_user._id)] assert parsed_get_params['token'] == [ new_user['verification_key']] @@ -193,7 +193,7 @@ def test_register_views(test_app): template.clear_test_template_context() response = test_app.get( "/auth/verify_email/?userid=%s&token=total_bs" % unicode( - new_user['_id'])) + new_user._id)) response.follow() context = template.TEMPLATE_TEST_CONTEXT[ 'mediagoblin/user_pages/user.html'] @@ -269,7 +269,7 @@ def test_register_views(test_app): # user should have matching parameters new_user = mg_globals.database.User.find_one({'username': 'happygirl'}) - assert parsed_get_params['userid'] == [unicode(new_user['_id'])] + assert parsed_get_params['userid'] == [unicode(new_user._id)] assert parsed_get_params['token'] == [new_user['fp_verification_key']] ### The forgotten password token should be set to expire in ~ 10 days @@ -280,7 +280,7 @@ def test_register_views(test_app): template.clear_test_template_context() response = test_app.get( "/auth/forgot_password/verify/?userid=%s&token=total_bs" % unicode( - new_user['_id']), status=400) + new_user._id), status=400) assert response.status == '400 Bad Request' ## Try using an expired token to change password, shouldn't work @@ -412,7 +412,7 @@ def test_authentication_views(test_app): # Make sure user is in the session context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html'] session = context['request'].session - assert session['user_id'] == unicode(test_user['_id']) + assert session['user_id'] == unicode(test_user._id) # Successful logout # ----------------- diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py index 1c657e6c..dec7118b 100644 --- a/mediagoblin/tests/test_submission.py +++ b/mediagoblin/tests/test_submission.py @@ -177,7 +177,7 @@ class TestSubmission: request.urlgen('mediagoblin.user_pages.media_confirm_delete', # No work: user=media.uploader().username, user=self.test_user['username'], - media=media['_id']), + media=media._id), # no value means no confirm {}) @@ -197,7 +197,7 @@ class TestSubmission: request.urlgen('mediagoblin.user_pages.media_confirm_delete', # No work: user=media.uploader().username, user=self.test_user['username'], - media=media['_id']), + media=media._id), {'confirm': 'y'}) response.follow() @@ -208,7 +208,7 @@ class TestSubmission: # Does media entry still exist? assert_false( request.db.MediaEntry.find( - {'_id': media['_id']}).count()) + {'_id': media._id}).count()) def test_malicious_uploads(self): # Test non-suppoerted file with non-supported extension diff --git a/mediagoblin/tools/pagination.py b/mediagoblin/tools/pagination.py index bc20ec90..5ebc3c5a 100644 --- a/mediagoblin/tools/pagination.py +++ b/mediagoblin/tools/pagination.py @@ -53,7 +53,7 @@ class Pagination(object): cursor = copy.copy(self.cursor) for (doc, increment) in izip(cursor, count(0)): - if doc['_id'] == jump_to_id: + if doc._id == jump_to_id: self.page = 1 + int(floor(increment / self.per_page)) self.active_id = jump_to_id diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 2090d6fd..82865bb4 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -45,7 +45,7 @@ def user_home(request, page): {'user': user}) cursor = request.db.MediaEntry.find( - {'uploader': user['_id'], + {'uploader': user._id, 'state': 'processed'}).sort('created', DESCENDING) pagination = Pagination(page, cursor) @@ -78,7 +78,7 @@ def user_gallery(request, page): return render_404(request) cursor = request.db.MediaEntry.find( - {'uploader': user['_id'], + {'uploader': user._id, 'state': 'processed'}).sort('created', DESCENDING) pagination = Pagination(page, cursor) @@ -135,8 +135,8 @@ def media_post_comment(request, media): assert request.method == 'POST' comment = request.db.MediaComment() - comment['media_entry'] = media['_id'] - comment['author'] = request.user['_id'] + 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']) @@ -179,7 +179,7 @@ def media_confirm_delete(request, media): location=media.url_for_self(request.urlgen)) if ((request.user[u'is_admin'] and - request.user[u'_id'] != media.uploader()[u'_id'])): + request.user._id != media.uploader()._id)): messages.add_message( request, messages.WARNING, _("You are about to delete another user's media. " @@ -207,7 +207,7 @@ def atom_feed(request): return render_404(request) cursor = request.db.MediaEntry.find({ - 'uploader': user['_id'], + 'uploader': user._id, 'state': 'processed'}) \ .sort('created', DESCENDING) \ .limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS) @@ -251,7 +251,7 @@ def processing_panel(request): # # Make sure we have permission to access this user's panel. Only # admins and this user herself should be able to do so. - if not (user[u'_id'] == request.user[u'_id'] + if not (user._id == request.user._id or request.user.is_admin): # No? Let's simply redirect to this user's homepage then. return redirect( @@ -260,12 +260,12 @@ def processing_panel(request): # Get media entries which are in-processing processing_entries = request.db.MediaEntry.find( - {'uploader': user['_id'], + {'uploader': user._id, 'state': 'processing'}).sort('created', DESCENDING) # Get media entries which have failed to process failed_entries = request.db.MediaEntry.find( - {'uploader': user['_id'], + {'uploader': user._id, 'state': 'failed'}).sort('created', DESCENDING) # Render to response -- cgit v1.2.3 From 3618a9ac5112c657fd095a0f9cbd346921a4e800 Mon Sep 17 00:00:00 2001 From: Elrond <elrond+mediagoblin.org@samba-tng.org> Date: Mon, 14 Nov 2011 17:11:37 +0100 Subject: Dot-Notation: x._id = ObjectId() doesn't seem to work properly For whatever reason, this does not work as expected: entry._id = ObjectId() Need to go this way: entry['_id'] = ObjectId() --- mediagoblin/submit/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index bd63bd18..139b1d1d 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -52,7 +52,7 @@ def submit_start(request): # create entry and save in database entry = request.db.MediaEntry() - entry._id = ObjectId() + entry['_id'] = ObjectId() entry['title'] = ( unicode(request.POST['title']) or unicode(splitext(filename)[0])) -- cgit v1.2.3 From 64fd0462bdd821d5777d9697e67d951838f87de0 Mon Sep 17 00:00:00 2001 From: Joar Wandborg <git@wandborg.com> Date: Tue, 15 Nov 2011 22:43:05 +0100 Subject: Committing some futile attempts to make GStreamer transcode the audio properly. - Added CPU count detection - Added videorate - Added audiorate --- mediagoblin/media_types/video/transcoders.py | 45 +++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index 3a30aedf..de3701f6 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -29,6 +29,18 @@ _log = logging.getLogger(__name__) logging.basicConfig() _log.setLevel(logging.DEBUG) +CPU_COUNT = 2 +try: + import multiprocessing + try: + CPU_COUNT = multiprocessing.cpu_count() + except NotImplementedError: + _log.warning('multiprocessing.cpu_count not implemented') + pass +except ImportError: + _log.warning('Could not import multiprocessing, defaulting to 2 CPU cores') + pass + try: import gtk except: @@ -627,10 +639,13 @@ class VideoTranscoder: self.videoqueue = gst.element_factory_make('queue', 'videoqueue') self.pipeline.add(self.videoqueue) + self.videorate = gst.element_factory_make('videorate', 'videorate') + self.pipeline.add(self.videorate) + self.ffmpegcolorspace = gst.element_factory_make( 'ffmpegcolorspace', 'ffmpegcolorspace') self.pipeline.add(self.ffmpegcolorspace) - + self.videoscale = gst.element_factory_make('ffvideoscale', 'videoscale') #self.videoscale.set_property('method', 2) # I'm not sure this works #self.videoscale.set_property('add-borders', 0) @@ -648,11 +663,22 @@ class VideoTranscoder: self.audioqueue = gst.element_factory_make('queue', 'audioqueue') self.pipeline.add(self.audioqueue) + self.audiorate = gst.element_factory_make('audiorate', 'audiorate') + self.pipeline.add(self.audiorate) + self.audioconvert = gst.element_factory_make('audioconvert', 'audioconvert') self.pipeline.add(self.audioconvert) + self.audiocapsfilter = gst.element_factory_make('capsfilter', 'audiocapsfilter') + audiocaps = ['audio/x-raw-float'] + self.audiocapsfilter.set_property( + 'caps', + gst.caps_from_string( + ','.join(audiocaps))) + self.pipeline.add(self.audiocapsfilter) + self.vorbisenc = gst.element_factory_make('vorbisenc', 'vorbisenc') - self.vorbisenc.set_property('quality', 0.7) + self.vorbisenc.set_property('quality', 1) self.pipeline.add(self.vorbisenc) # WebMmux & filesink @@ -685,7 +711,8 @@ class VideoTranscoder: self.filesrc.link(self.decoder) # Link all the video elements in a link to webmux - self.videoqueue.link(self.ffmpegcolorspace) + self.videoqueue.link(self.videorate) + self.videorate.link(self.ffmpegcolorspace) self.ffmpegcolorspace.link(self.videoscale) self.videoscale.link(self.capsfilter) #self.capsfilter.link(self.xvimagesink) @@ -695,8 +722,12 @@ class VideoTranscoder: if self.data.is_audio: # Link all the audio elements in a line to webmux #self.audioconvert.link(self.alsasink) - self.audioqueue.link(self.audioconvert) - self.audioconvert.link(self.vorbisenc) + self.audioqueue.link(self.audiorate) + self.audiorate.link(self.audioconvert) + self.audioconvert.link(self.audiocapsfilter) + self.audiocapsfilter.link(self.vorbisenc) + #self.audiocapsfilter.link(self.level) + #self.level.link(self.vorbisenc) self.vorbisenc.link(self.webmmux) self.webmmux.link(self.progressreport) @@ -729,7 +760,7 @@ class VideoTranscoder: ''' Sets up the output format (width, height) for the video ''' - caps = ['video/x-raw-yuv', 'pixel-aspect-ratio=1/1'] + caps = ['video/x-raw-yuv', 'pixel-aspect-ratio=1/1', 'framerate=30/1'] if self.data.videoheight > self.data.videowidth: # Whoa! We have ourselves a portrait video! @@ -743,7 +774,7 @@ class VideoTranscoder: self.capsfilter.set_property( 'caps', gst.caps_from_string( - ', '.join(caps))) + ','.join(caps))) def _on_message(self, bus, message): _log.debug((bus, message, message.type)) -- cgit v1.2.3 From 359781f075f22c6ea677e28756c8046b2f405e63 Mon Sep 17 00:00:00 2001 From: Joar Wandborg <git@wandborg.com> Date: Wed, 16 Nov 2011 14:20:27 +0100 Subject: Fixed video transcoding - Added audiorate with tolerance 80 million - Removed deprecated thumbnailer --- mediagoblin/media_types/video/transcoders.py | 213 +-------------------------- 1 file changed, 1 insertion(+), 212 deletions(-) diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index de3701f6..f6a2eb21 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -340,218 +340,6 @@ class VideoThumbnailer: self.loop.quit() -class DeprecatedVideoThumbnailer: - ''' - Creates a video thumbnail - - - Sets up discoverer & transcoding pipeline. - Discoverer finds out information about the media file - - Launches gobject.MainLoop, this triggers the discoverer to start running - - Once the discoverer is done, it calls the __discovered callback function - - The __discovered callback function launches the transcoding process - - The _on_message callback is called from the transcoding process until it - gets a message of type gst.MESSAGE_EOS, then it calls __stop which shuts - down the gobject.MainLoop - ''' - - WADSWORTH_CONSTANT = 30 # percent - - def __init__(self, src, dst, **kwargs): - _log.info('Initializing VideoThumbnailer...') - - self.loop = gobject.MainLoop() - - self.source_path = src - self.destination_path = dst - - self.destination_dimensions = kwargs.get('dimensions') or (180, 180) - - if not type(self.destination_dimensions) == tuple: - raise Exception('dimensions must be tuple: (width, height)') - - self._setup() - self._run() - - def _setup(self): - self._setup_pipeline() - self._setup_discover() - - def _run(self): - _log.info('Discovering...') - self.discoverer.discover() - _log.info('Done') - - _log.debug('Initializing MainLoop()') - self.loop.run() - - def _setup_discover(self): - self.discoverer = discoverer.Discoverer(self.source_path) - - # Connect self.__discovered to the 'discovered' event - self.discoverer.connect('discovered', self.__discovered) - - def __discovered(self, data, is_media): - ''' - Callback for media discoverer. - ''' - if not is_media: - self.__stop() - raise Exception('Could not discover {0}'.format(self.source_path)) - - _log.debug('__discovered, data: {0}'.format(data)) - - self.data = data - - # Run any tasks that depend on the info from the discovery - self._on_discovered() - - # Tell the transcoding pipeline to start running - _log.info('Transcoding...') - - def _on_discovered(self): - self.__setup_capsfilter() - - def _setup_pipeline(self): - # Create a new pipeline - self.pipeline = gst.Pipeline('VideoThumbnailerPipeline') - - # Create the elements in the pipeline - self.filesrc = gst.element_factory_make('filesrc', 'filesrc') - self.filesrc.set_property('location', self.source_path) - self.pipeline.add(self.filesrc) - - self.decoder = gst.element_factory_make('decodebin2', 'decoder') - self.decoder.connect('new-decoded-pad', self._on_dynamic_pad) - self.pipeline.add(self.decoder) - - self.ffmpegcolorspace = gst.element_factory_make( - 'ffmpegcolorspace', 'ffmpegcolorspace') - self.pipeline.add(self.ffmpegcolorspace) - - self.videoscale = gst.element_factory_make('videoscale', 'videoscale') - self.videoscale.set_property('method', 'bilinear') - self.pipeline.add(self.videoscale) - - self.capsfilter = gst.element_factory_make('capsfilter', 'capsfilter') - self.pipeline.add(self.capsfilter) - - self.jpegenc = gst.element_factory_make('jpegenc', 'jpegenc') - self.pipeline.add(self.jpegenc) - - #self.filesink = gst.element_factory_make('filesink', 'filesink') - #self.filesink.set_property('location', self.destination_path) - #self.pipeline.add(self.filesink) - - self.appsink = gst.element_factory_make('appsink', 'appsink') - self.appsink.set_property('emit-signals', True) - self.appsink.connect('new-preroll', self.__on_sink_preroll) - self.pipeline.add(self.appsink) - - self.progressreport = gst.element_factory_make( - 'progressreport', 'progressreport') - self.progressreport.set_property('update-freq', 1) - self.pipeline.add(self.progressreport) - - self.identity = gst.element_factory_make('identity', 'id') - self.pipeline.add(self.identity) - - # Link all the elements together - self.filesrc.link(self.decoder) - self.ffmpegcolorspace.link(self.videoscale) - self.videoscale.link(self.capsfilter) - self.capsfilter.link(self.jpegenc) - self.jpegenc.link(self.progressreport) - self.progressreport.link(self.identity) - #self.identity.link(self.filesink) - self.identity.link(self.appsink) - - self.pipeline.set_state(gst.STATE_PAUSED) - - self._setup_bus() - - def __on_sink_preroll(self, sink): - _log.debug('SINK PREROLL!!!!') - - def _on_dynamic_pad(self, dbin, pad, islast): - ''' - Callback called when ``decodebin2`` has a pad that we can connect to - ''' - # Intersect the capabilities of the video sink and the pad src - # Then check if they have no common capabilities. - if not self.ffmpegcolorspace.get_pad_template('sink')\ - .get_caps().intersect(pad.get_caps()).is_empty(): - # It IS a video src pad. - pad.link(self.ffmpegcolorspace.get_pad('sink')) - gst.DEBUG_BIN_TO_DOT_FILE( - self.pipeline, - gst.DEBUG_GRAPH_SHOW_ALL, - 'ss') - - def _setup_bus(self): - self.bus = self.pipeline.get_bus() - self.bus.add_signal_watch() - self.bus.connect('message', self._on_message) - - def __setup_capsfilter(self): - caps = ['video/x-raw-rgb', 'pixel-aspect-ratio=1/1'] - - if self.data.videoheight > self.data.videowidth: - # Whoa! We have ourselves a portrait video! - caps.append('height={0}'.format( - self.destination_dimensions[1])) - else: - # It's a landscape, phew, how normal. - caps.append('width={0}'.format( - self.destination_dimensions[0])) - - self.capsfilter.set_property( - 'caps', - gst.caps_from_string( - ', '.join(caps))) - - def __find_wadsworth(self): - if self.decoder.seek_simple( - gst.FORMAT_PERCENT, - gst.SEEK_FLAG_NONE, - 0 * 10000): - _log.info('Found wadsworth') - #pdb.set_trace() - #self.pipeline.set_state(gst.STATE_PLAYING) - self.__get_buffer() - self.__stop() - else: - pdb.set_trace() - - def __get_buffer(self): - buffer = self.appsink.emit('pull-preroll') - open(self.destination_path, 'wb').write(buffer) - - def _on_message(self, bus, message): - t = message.type - - _log.debug(( - t == gst.MESSAGE_ASYNC_DONE, - bus, - message)) - - if t == gst.MESSAGE_EOS: - self.__stop() - _log.info('Got EOS') - elif t == gst.MESSAGE_ASYNC_DONE: - #pdb.set_trace() - self.__find_wadsworth() - elif t == gst.MESSAGE_ERROR: - _log.error((bus, message)) - self.__stop() - - def __stop(self): - _log.debug(self.loop) - - self.pipeline.set_state(gst.STATE_NULL) - - gobject.idle_add(self.loop.quit) - - class VideoTranscoder: ''' Video transcoder @@ -664,6 +452,7 @@ class VideoTranscoder: self.pipeline.add(self.audioqueue) self.audiorate = gst.element_factory_make('audiorate', 'audiorate') + self.audiorate.set_property('tolerance', 80000000) self.pipeline.add(self.audiorate) self.audioconvert = gst.element_factory_make('audioconvert', 'audioconvert') -- cgit v1.2.3 From 76c6c806caec7af20a3fe11c04bb783baacc3934 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber <cwebber@dustycloud.org> Date: Wed, 16 Nov 2011 17:53:46 -0600 Subject: Accidentally had user['profile'] where it shoulda been user['bio'] --- mediagoblin/templates/mediagoblin/user_pages/user.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index c5beeaaa..6d938262 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -78,7 +78,7 @@ {%- trans username=user.username %}{{ username }}'s profile{% endtrans -%} </h1> - {% if not user['url'] and not user['profile'] %} + {% if not user['url'] and not user['bio'] %} {% if request.user['_id'] == user['_id'] %} <div class="grid_6 alpha empty_space"> <p> -- cgit v1.2.3 From ccca0fbfc3667900d0a5ad3687c27f4fd72db061 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber <cwebber@dustycloud.org> Date: Thu, 17 Nov 2011 08:28:23 -0600 Subject: Beginnings of sqlalchemy models --- mediagoblin/db/sql.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 mediagoblin/db/sql.py diff --git a/mediagoblin/db/sql.py b/mediagoblin/db/sql.py new file mode 100644 index 00000000..31ebfbf4 --- /dev/null +++ b/mediagoblin/db/sql.py @@ -0,0 +1,95 @@ +import datetime + +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import ( + Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey, + UniqueConstraint) + + +Base = declarative_base() + + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True) + username = Column(Unicode, nullable=False, unique=True) + email = Column(Unicode, nullable=False) + created = Column(DateTime, nullable=False, default=datetime.datetime.now) + pw_hash = Column(Unicode, nullable=False) + email_verified = Column(Boolean) + status = Column(Unicode, default="needs_email_verification", nullable=False) + verification_key = Column(Unicode) + is_admin = Column(Boolean, default=False, nullable=False) + url = Column(Unicode) + bio = Column(UnicodeText) # ?? + bio_html = Column(UnicodeText) # ?? + fp_verification_key = Column(Unicode) + fp_verification_expire = Column(DateTime) + + ## TODO + # plugin data would be in a separate model + + +class MediaEntry(Base): + __tablename__ = "media_entries" + + id = Column(Integer, primary_key=True) + uploader = Column(Integer, ForeignKey('users.id'), nullable=False) + slug = Column(Unicode, nullable=False) + created = Column(DateTime, nullable=False, default=datetime.datetime.now) + description = Column(UnicodeText) # ?? + description_html = Column(UnicodeText) # ?? + media_type = Column(Unicode, nullable=False) + + fail_error = Column(Unicode) + fail_metadata = Column(UnicodeText) + + queued_media_file = Column(Unicode) + + queued_task_id = Column(Unicode) + + __table_args__ = ( + UniqueConstraint('uploader', 'slug'), + {}) + + ## TODO + # media_files + # media_data + # attachment_files + # fail_error + + +class Tag(Base): + __tablename__ = "tags" + + id = Column(Integer, primary_key=True) + slug = Column(Unicode, nullable=False, unique=True) + + +class MediaTag(Base): + __tablename__ = "media_tags" + + id = Column(Integer, primary_key=True) + tag = Column(Integer, ForeignKey('tags.id'), nullable=False) + name = Column(Unicode) + media_entry = Column( + Integer, ForeignKey('media_entries.id'), + nullable=False) + # created = Column(DateTime, nullable=False, default=datetime.datetime.now) + + __table_args__ = ( + UniqueConstraint('tag', 'media_entry'), + {}) + + +class MediaComment(Base): + __tablename__ = "media_comments" + + id = Column(Integer, primary_key=True) + media_entry = Column( + Integer, ForeignKey('media_entries.id'), nullable=False) + author = Column(Integer, ForeignKey('users.id'), nullable=False) + created = Column(DateTime, nullable=False, default=datetime.datetime.now) + content = Column(UnicodeText, nullable=False) + content_html = Column(UnicodeText) -- cgit v1.2.3 From 6950c6c77c2daf4a47810e05a7c3f64f8995059d Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber <cwebber@dustycloud.org> Date: Sat, 19 Nov 2011 08:31:37 -0600 Subject: Adding app_config and global_config to the template environment --- mediagoblin/tools/template.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mediagoblin/tools/template.py b/mediagoblin/tools/template.py index 905a36df..a0eaabe7 100644 --- a/mediagoblin/tools/template.py +++ b/mediagoblin/tools/template.py @@ -55,6 +55,8 @@ def get_jinja_env(template_loader, locale): template_env.globals['fetch_messages'] = messages.fetch_messages template_env.globals['gridify_list'] = gridify_list template_env.globals['gridify_cursor'] = gridify_cursor + template_env.globals['app_config'] = mg_globals.app_config + template_env.globals['global_config'] = mg_globals.global_config if exists(locale): SETUP_JINJA_ENVS[locale] = template_env -- cgit v1.2.3 From 53bc39755bf22fe8eebf06b051018eba111a64e7 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber <cwebber@dustycloud.org> Date: Sat, 19 Nov 2011 08:33:29 -0600 Subject: Add app_config and global_config to the template environment --- mediagoblin/tools/template.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mediagoblin/tools/template.py b/mediagoblin/tools/template.py index a0eaabe7..0986761b 100644 --- a/mediagoblin/tools/template.py +++ b/mediagoblin/tools/template.py @@ -52,6 +52,7 @@ def get_jinja_env(template_loader, locale): # All templates will know how to ... # ... fetch all waiting messages and remove them from the queue # ... construct a grid of thumbnails or other media + # ... have access to the global and app config template_env.globals['fetch_messages'] = messages.fetch_messages template_env.globals['gridify_list'] = gridify_list template_env.globals['gridify_cursor'] = gridify_cursor -- cgit v1.2.3 From 3c0411f51f43ade8c7d47df4f3843fd79d4709b5 Mon Sep 17 00:00:00 2001 From: "Pablo J. Urbano Santos" <flamma@member.fsf.org> Date: Sat, 19 Nov 2011 17:07:41 +0100 Subject: Allow instance owners to customize html titles of page: Added html_title config option. Made base.html template use html_title option as page title. --- mediagoblin/config_spec.ini | 3 +++ mediagoblin/templates/mediagoblin/base.html | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index 900957ce..b804358c 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -1,4 +1,7 @@ [mediagoblin] +# HTML title of the pages +html_title = string(default="GNU MediaGoblin") + # database stuff db_host = string() db_name = string(default="mediagoblin") diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 925386e5..0d6b9e40 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -19,7 +19,7 @@ <html> <head> <meta charset="utf-8"> - <title>{% block title %}{% trans %}GNU MediaGoblin{% endtrans %}{% endblock title %} + {{ app_config['html_title'] }} Date: Sat, 19 Nov 2011 19:11:42 +0100 Subject: Added parameter ascending to MediaEntry::get_comments, if true, comments will be ordered ascending, otherwise descending --- mediagoblin/db/models.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 1c1bc2fd..f13a4457 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -217,9 +217,14 @@ class MediaEntry(Document): 'created': datetime.datetime.utcnow, 'state': u'unprocessed'} - def get_comments(self): + def get_comments(self, ascending=False): + if ascending: + order = ASCENDING + else: + order = DESCENDING + return self.db.MediaComment.find({ - 'media_entry': self._id}).sort('created', DESCENDING) + 'media_entry': self._id}).sort('created', order) def get_display_media(self, media_map, fetch_order=common.DISPLAY_IMAGE_FETCHING_ORDER): -- cgit v1.2.3 From 1a3138addd43d410b03cdd1816e0a62bd217de30 Mon Sep 17 00:00:00 2001 From: "Pablo J. Urbano Santos" Date: Sat, 19 Nov 2011 19:15:41 +0100 Subject: media_home: order comments by ascending date. --- mediagoblin/user_pages/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 82865bb4..98a21bb4 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -106,11 +106,11 @@ def media_home(request, media, page, **kwargs): """ if ObjectId(request.matchdict.get('comment')): pagination = Pagination( - page, media.get_comments(), MEDIA_COMMENTS_PER_PAGE, + page, media.get_comments(True), MEDIA_COMMENTS_PER_PAGE, ObjectId(request.matchdict.get('comment'))) else: pagination = Pagination( - page, media.get_comments(), MEDIA_COMMENTS_PER_PAGE) + page, media.get_comments(True), MEDIA_COMMENTS_PER_PAGE) comments = pagination() -- cgit v1.2.3 From fc5695c538f2b6d230c0e431087e9c10e6deac6c Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 19 Nov 2011 10:43:31 -0800 Subject: incorrect path in nginx config --- docs/source/deploying.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/deploying.rst b/docs/source/deploying.rst index c2ba0c47..b944a3d3 100644 --- a/docs/source/deploying.rst +++ b/docs/source/deploying.rst @@ -207,7 +207,7 @@ this ``nginx.conf`` file should be modeled on the following: :: # Instance specific media: location /mgoblin_media/ { - alias /srv/mediagoblin.example.org/mediagoblin/mediagoblin/user_dev/media/public/; + alias /srv/mediagoblin.example.org/mediagoblin/user_dev/media/public/; } # Mounting MediaGoblin itself via fastcgi. -- cgit v1.2.3 From b4b7b6a57a5ad9a5e52a5d3e05f9ad3d3e8b650a Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 19 Nov 2011 13:42:30 -0600 Subject: Added Corey Farwell to the list of contributors --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index c9fc5c8e..b0ef7154 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,6 +13,7 @@ Thank you! * Alex Camelio * Bernhard Keller * Caleb Forbes Davis V +* Corey Farwell * Chris Moylan * Christopher Allan Webber * Daniel Neel -- cgit v1.2.3 From 7c378f2cd5324a05e709cbada5eb5668ce3a3469 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 19 Nov 2011 14:01:38 -0600 Subject: Allow user to set whether comments are ascending or descending --- mediagoblin/config_spec.ini | 3 +++ mediagoblin/user_pages/views.py | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index 900957ce..4d412346 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -27,6 +27,9 @@ allow_registration = boolean(default=True) tags_delimiter = string(default=",") tags_max_length = integer(default=50) +# Whether comments are ascending or descending +comments_ascending = boolean(default=True) + # By default not set, but you might want something like: # "%(here)s/user_dev/templates/" local_templates = string() diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 98a21bb4..25fd2ebb 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -106,11 +106,15 @@ def media_home(request, media, page, **kwargs): """ if ObjectId(request.matchdict.get('comment')): pagination = Pagination( - page, media.get_comments(True), MEDIA_COMMENTS_PER_PAGE, + page, media.get_comments( + mg_globals.app_config['comments_ascending']), + MEDIA_COMMENTS_PER_PAGE, ObjectId(request.matchdict.get('comment'))) else: pagination = Pagination( - page, media.get_comments(True), MEDIA_COMMENTS_PER_PAGE) + page, media.get_comments( + mg_globals.app_config['comments_ascending']), + MEDIA_COMMENTS_PER_PAGE) comments = pagination() -- cgit v1.2.3 From 1bc231c766c41f61aee6d91c631bd972426b277b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 19 Nov 2011 14:03:01 -0600 Subject: Added Pablo Santos to the AUTHORS file --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index b0ef7154..76e16b86 100644 --- a/AUTHORS +++ b/AUTHORS @@ -28,6 +28,7 @@ Thank you! * Nathan Yergler * Odin Hørthe Omdal * Osama Khalid +* Pablo J. Urbano Santos * Rasmus Larsson * Sam Kleinman * Sebastian Spaeth -- cgit v1.2.3 From 7880168526032bc2ddce96257d8f62a01e562832 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 19 Nov 2011 14:06:48 -0600 Subject: Added back the title block --- mediagoblin/templates/mediagoblin/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 0d6b9e40..64fafb73 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -19,7 +19,7 @@ - {{ app_config['html_title'] }} + {% block title %}{{ app_config['html_title'] }}{% endblock %} Date: Sat, 19 Nov 2011 23:46:42 +0100 Subject: Change form structure and add relevant CSS rules --- mediagoblin/static/css/base.css | 6 +++++- mediagoblin/templates/mediagoblin/utils/wtforms.html | 12 +++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index afd10207..a7b659c3 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -212,7 +212,11 @@ text-align: center; width: 100%; } -.form_field_label,.form_field_input { +.form_field_input { + margin-bottom: 10px; +} + +.form_field_label { margin-bottom: 4px; } diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html index 6a86fd24..39dca7cc 100644 --- a/mediagoblin/templates/mediagoblin/utils/wtforms.html +++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html @@ -18,18 +18,16 @@ {# Generically render a field #} {% macro render_field_div(field) %} -
-
{{ _(field.label.text) }}
-
{{ field }}
+

+
+ {{ field }} {%- if field.errors -%} {% for error in field.errors %} -
- {{ error }} -
+

{{ error }}

{% endfor %} {%- endif %} {% if field.description -%} -
{{ _(field.description) }}
+

{{ _(field.description) }}

{%- endif %}
{%- endmacro %} -- cgit v1.2.3 From 2d62e9efd210becd30982e65e06a6ef97029b391 Mon Sep 17 00:00:00 2001 From: lora Date: Sat, 19 Nov 2011 17:00:25 -0600 Subject: issue 582: use media.slug instead of media.id --- mediagoblin/decorators.py | 3 +-- mediagoblin/templates/mediagoblin/user_pages/media.html | 4 ++-- .../templates/mediagoblin/user_pages/media_confirm_delete.html | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index 19e22bca..38f52ced 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -58,7 +58,7 @@ def user_may_delete_media(controller): """ def wrapper(request, *args, **kwargs): uploader = request.db.MediaEntry.find_one( - {'_id': ObjectId(request.matchdict['media'])}).uploader() + {'slug': request.matchdict['media'] }).uploader() if not (request.user['is_admin'] or request.user['_id'] == uploader['_id']): return exc.HTTPForbidden() @@ -95,7 +95,6 @@ def get_user_media_entry(controller): if not user: return render_404(request) - media = request.db.MediaEntry.find_one( {'slug': request.matchdict['media'], 'state': 'processed', diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 433f74dc..5e1b73de 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -124,7 +124,7 @@

{% set edit_url = request.urlgen('mediagoblin.edit.edit_media', user= media.uploader().username, - media= media._id) %} + media= media.slug) %} @@ -133,7 +133,7 @@

{% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', user= media.uploader().username, - media= media._id) %} + media= media.slug) %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html index dd6923a9..f62082bd 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html @@ -23,7 +23,7 @@

-- cgit v1.2.3 From 909dda1f85b27866e0d20343169c91953ca7d8f6 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 00:28:19 +0100 Subject: Change button style a bit --- mediagoblin/static/css/base.css | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index a7b659c3..8d9756b9 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -99,20 +99,14 @@ a.mediagoblin_logo{ } .header_submit, .header_submit_highlight{ - color: #272727; - background-color: #aaa; - background-image: -webkit-gradient(linear, left top, left bottom, from(##D2D2D2), to(#aaa)); - background-image: -webkit-linear-gradient(top, #D2D2D2, #aaa); - background-image: -moz-linear-gradient(top, #D2D2D2, #aaa); - background-image: -ms-linear-gradient(top, #D2D2D2, #aaa); - background-image: -o-linear-gradient(top, #D2D2D2, #aaa); - background-image: linear-gradient(top, #D2D2D2, #aaa); - box-shadow: 0px 0px 4px #000; - border-radius: 3px; + color: #c3c3c3; + background-color: #2d2d2d; + border: 1px solid; + border-color: #323232 #232323 #1F1F1F; + border-radius: 4px; margin: 8px; padding: 3px 8px; text-decoration: none; - border: medium none; font-style: normal; font-weight: bold; font-size: 1em; @@ -301,7 +295,7 @@ img.media_icon{ background-color: #1d1d1d; border: 1px solid; border-color: #2c2c2c #232323 #1a1a1a; - border-radius: 3px; + border-radius: 4px; text-decoration: none; padding: 8px 0px 14px; font-size: 2em; -- cgit v1.2.3 From 4837b2f253e7f525eb4eb97a574c8af68c0ff570 Mon Sep 17 00:00:00 2001 From: Jakob Kramer Date: Sat, 19 Nov 2011 22:17:21 +0100 Subject: added support for changing the password, issue #643 --- mediagoblin/edit/forms.py | 13 +++++++++++++ mediagoblin/edit/views.py | 34 ++++++++++++++++++++++++---------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index 7e71722c..ec4e22b3 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -43,6 +43,19 @@ class EditProfileForm(wtforms.Form): _('Website'), [wtforms.validators.Optional(), wtforms.validators.URL(message='Improperly formed URL')]) + old_password = wtforms.PasswordField( + _('Old password'), + [wtforms.validators.Optional()]) + new_password = wtforms.PasswordField( + _('New Password'), + [wtforms.validators.Optional(), + wtforms.validators.Length(min=6, max=30), + wtforms.validators.EqualTo( + 'confirm_password', + 'Passwords must match.')]) + confirm_password = wtforms.PasswordField( + 'Confirm password', + [wtforms.validators.Optional()]) class EditAttachmentsForm(wtforms.Form): diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 5f781552..75bf51bf 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -26,6 +26,7 @@ from werkzeug.utils import secure_filename from mediagoblin import messages from mediagoblin import mg_globals +from mediagoblin.auth import lib as auth_lib from mediagoblin.edit import forms from mediagoblin.edit.lib import may_edit_media from mediagoblin.decorators import require_active_login, get_user_media_entry @@ -161,19 +162,32 @@ def edit_profile(request): bio=user.get('bio')) if request.method == 'POST' and form.validate(): - user['url'] = unicode(request.POST['url']) - user['bio'] = unicode(request.POST['bio']) + user['url'] = unicode(request.POST['url']) + user['bio'] = unicode(request.POST['bio']) - user['bio_html'] = cleaned_markdown_conversion(user['bio']) - - user.save() + password_matches = auth_lib.bcrypt_check_password(request.POST['old_password'], + user['pw_hash']) + if (request.POST['old_password'] or request.POST['new_password']) and not \ + password_matches: messages.add_message(request, - messages.SUCCESS, - _("Profile edited!")) - return redirect(request, - 'mediagoblin.user_pages.user_home', - user=edit_username) + messages.ERROR, + _('Wrong password')) + + if password_matches: + user['pw_hash'] = auth_lib.bcrypt_gen_password_hash( + request.POST['new_password']) + + user['bio_html'] = cleaned_markdown_conversion(user['bio']) + + user.save() + + messages.add_message(request, + messages.SUCCESS, + _("Profile edited!")) + return redirect(request, + 'mediagoblin.user_pages.user_home', + user=edit_username) return render_to_response( request, -- cgit v1.2.3 From c8ccd23e8e0d77df3e7382cd6330e0c993bbcc8e Mon Sep 17 00:00:00 2001 From: Jakob Kramer Date: Sun, 20 Nov 2011 00:35:09 +0100 Subject: added unittests, now using form errors and fixed bug when no GET parameter is given for /edit/profile/ --- mediagoblin/edit/views.py | 23 +++++---- mediagoblin/tests/test_edit.py | 112 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 9 deletions(-) create mode 100644 mediagoblin/tests/test_edit.py diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 75bf51bf..673409bd 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -162,17 +162,22 @@ def edit_profile(request): bio=user.get('bio')) if request.method == 'POST' and form.validate(): - user['url'] = unicode(request.POST['url']) - user['bio'] = unicode(request.POST['bio']) - - password_matches = auth_lib.bcrypt_check_password(request.POST['old_password'], - user['pw_hash']) + password_matches = auth_lib.bcrypt_check_password( + request.POST['old_password'], + user['pw_hash']) if (request.POST['old_password'] or request.POST['new_password']) and not \ password_matches: - messages.add_message(request, - messages.ERROR, - _('Wrong password')) + form.old_password.errors.append(_('Wrong password')) + + return render_to_response( + request, + 'mediagoblin/edit/edit_profile.html', + {'user': user, + 'form': form}) + + user['url'] = unicode(request.POST['url']) + user['bio'] = unicode(request.POST['bio']) if password_matches: user['pw_hash'] = auth_lib.bcrypt_gen_password_hash( @@ -187,7 +192,7 @@ def edit_profile(request): _("Profile edited!")) return redirect(request, 'mediagoblin.user_pages.user_home', - user=edit_username) + user=user['username']) return render_to_response( request, diff --git a/mediagoblin/tests/test_edit.py b/mediagoblin/tests/test_edit.py new file mode 100644 index 00000000..3637b046 --- /dev/null +++ b/mediagoblin/tests/test_edit.py @@ -0,0 +1,112 @@ +# 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 . + +from mediagoblin import mg_globals +from mediagoblin.tests.tools import setup_fresh_app +from mediagoblin.tools import template +from mediagoblin.auth.lib import bcrypt_check_password, \ + bcrypt_gen_password_hash + + +@setup_fresh_app +def test_change_password(test_app): + """Test changing password correctly and incorrectly""" + # set up new user + test_user = mg_globals.database.User() + test_user['username'] = u'chris' + test_user['email'] = u'chris@example.com' + test_user['email_verified'] = True + test_user['status'] = u'active' + test_user['pw_hash'] = bcrypt_gen_password_hash('toast') + test_user.save() + + test_app.post( + '/auth/login/', { + 'username': u'chris', + 'password': 'toast'}) + + # test that the password can be changed + # template.clear_test_template_context() + test_app.post( + '/edit/profile/', { + 'bio': u'', + 'url': u'', + 'old_password': 'toast', + 'new_password': '123456', + 'confirm_password': '123456'}) + + # test_user has to be fetched again in order to have the current values + test_user = mg_globals.database.User.one({'username': 'chris'}) + + assert bcrypt_check_password('123456', test_user['pw_hash']) + + # test that the password cannot be changed if the given old_password + # is wrong + # template.clear_test_template_context() + test_app.post( + '/edit/profile/', { + 'bio': u'', + 'url': u'', + 'old_password': 'toast', + 'new_password': '098765', + 'confirm_password': '098765'}) + + test_user = mg_globals.database.User.one({'username': 'chris'}) + + assert not bcrypt_check_password('098765', test_user['pw_hash']) + + +@setup_fresh_app +def change_bio_url(test_app): + """Test changing bio and URL""" + # set up new user + test_user = mg_globals.database.User() + test_user['username'] = u'chris' + test_user['email'] = u'chris@example.com' + test_user['email_verified'] = True + test_user['status'] = u'active' + test_user['pw_hash'] = bcrypt_gen_password_hash('toast') + test_user.save() + + # test changing the bio and the URL properly + test_app.post( + '/edit/profile/', { + 'bio': u'I love toast!', + 'url': u'http://dustycloud.org/'}) + + test_user = mg_globals.database.User.one({'username': 'chris'}) + + assert test_user['bio'] == u'I love toast!' + assert test_user['url'] == u'http://dustycloud.org/' + + # test changing the bio and the URL inproperly + too_long_bio = 150 * 'T' + 150 * 'o' + 150 * 'a' + 150 * 's' + 150* 't' + + test_app.post( + '/edit/profile/', { + # more than 500 characters + 'bio': too_long_bio, + 'url': 'this-is-no-url'}) + + test_user = mg_globals.database.User.one({'username': 'chris'}) + + context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/edit/edit_profile.html'] + form = context['edit_profile_form'] + + assert form.bio.errors == [u'Field must be between 0 and 500 characters long.'] + assert form.url.errors == [u'Improperly formed URL'] + + # test changing the url inproperly -- cgit v1.2.3 From 5bd523eb23e7c30b52e41cdb0f02053d8573ce63 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 01:12:10 +0100 Subject: Change to background of "empty_space", it now uses an image --- mediagoblin/static/css/base.css | 2 +- mediagoblin/static/images/empty_back.png | Bin 0 -> 191 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 mediagoblin/static/images/empty_back.png diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 8d9756b9..d61292a2 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -177,7 +177,7 @@ text-align: center; } .empty_space{ - background-color: #222; + background-image: url("../images/empty_back.png"); font-style: italic; text-align: center; height: 160px; diff --git a/mediagoblin/static/images/empty_back.png b/mediagoblin/static/images/empty_back.png new file mode 100644 index 00000000..3522ddd3 Binary files /dev/null and b/mediagoblin/static/images/empty_back.png differ -- cgit v1.2.3 From 13423daae28f759a24ba645fecc3e01cdfa92d9c Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 01:43:48 +0100 Subject: Another change to button style. Renamed header_submit, header_submit_highlight and button classes, correct all references to these --- mediagoblin/static/css/base.css | 39 +++++++++++----------- .../templates/mediagoblin/auth/change_fp.html | 2 +- .../mediagoblin/auth/forgot_password.html | 2 +- mediagoblin/templates/mediagoblin/auth/login.html | 4 +-- .../templates/mediagoblin/auth/register.html | 2 +- mediagoblin/templates/mediagoblin/base.html | 6 ++-- .../templates/mediagoblin/edit/attachments.html | 2 +- mediagoblin/templates/mediagoblin/edit/edit.html | 2 +- .../templates/mediagoblin/edit/edit_profile.html | 2 +- mediagoblin/templates/mediagoblin/root.html | 4 +-- .../templates/mediagoblin/submit/start.html | 2 +- mediagoblin/templates/mediagoblin/test_submit.html | 2 +- .../templates/mediagoblin/user_pages/media.html | 2 +- .../user_pages/media_confirm_delete.html | 2 +- .../templates/mediagoblin/user_pages/user.html | 6 ++-- 15 files changed, 40 insertions(+), 39 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index d61292a2..cec236f4 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -98,24 +98,6 @@ a.mediagoblin_logo{ font-weight: bold; } -.header_submit, .header_submit_highlight{ - color: #c3c3c3; - background-color: #2d2d2d; - border: 1px solid; - border-color: #323232 #232323 #1F1F1F; - border-radius: 4px; - margin: 8px; - padding: 3px 8px; - text-decoration: none; - font-style: normal; - font-weight: bold; - font-size: 1em; -} - -.header_submit_highlight{ -background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109, 173, 144)); -} - .mediagoblin_footer { height: 30px; border-top: 1px solid #333; @@ -135,7 +117,26 @@ background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109, /* common website elements */ -.button, .cancel_link { +.button_action, .button_action_highlight{ + color: #c3c3c3; + background-color: #363636; + border: 1px solid; + border-color: #464646 #2B2B2B #252525; + border-radius: 4px; + margin: 8px; + padding: 3px 8px; + text-decoration: none; + font-style: normal; + font-weight: bold; + font-size: 1em; +} + +.button_action_highlight{ +background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109, 173, 144)); +} + + +.button_form, .cancel_link { height: 32px; min-width: 99px; background-color: #86d4b1; diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html index 53186cec..fa972085 100644 --- a/mediagoblin/templates/mediagoblin/auth/change_fp.html +++ b/mediagoblin/templates/mediagoblin/auth/change_fp.html @@ -30,7 +30,7 @@ {{ wtforms_util.render_divs(cp_form) }}
- +

diff --git a/mediagoblin/templates/mediagoblin/auth/forgot_password.html b/mediagoblin/templates/mediagoblin/auth/forgot_password.html index 9b821426..41940742 100644 --- a/mediagoblin/templates/mediagoblin/auth/forgot_password.html +++ b/mediagoblin/templates/mediagoblin/auth/forgot_password.html @@ -27,7 +27,7 @@

{% trans %}Recover password{% endtrans %}

{{ wtforms_util.render_divs(fp_form) }}
- +
diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html index 756f67c0..c3807e5f 100644 --- a/mediagoblin/templates/mediagoblin/auth/login.html +++ b/mediagoblin/templates/mediagoblin/auth/login.html @@ -42,10 +42,10 @@ {% trans %}Forgot your password?{% endtrans %}

- +
{% if next %} - {% endif %}

diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html index 25b68058..a0d0a277 100644 --- a/mediagoblin/templates/mediagoblin/auth/register.html +++ b/mediagoblin/templates/mediagoblin/auth/register.html @@ -29,7 +29,7 @@ {{ csrf_token }}
+ class="button_form" />
diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 64fafb73..ede5f5c6 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -47,7 +47,7 @@ alt="{% trans %}MediaGoblin logo{% endtrans %}" /> {% endblock %} {% if request.user and request.user['status'] == 'active' %} - {% trans %}Submit media{% endtrans %} @@ -59,8 +59,8 @@ {% if request.user.status == "needs_email_verification" %} - {% trans %}verify your email!{% endtrans %} + class="button_action_highlight"> + {% trans %}Verify your email!{% endtrans %} {% endif %} Cancel - + {{ csrf_token }}
diff --git a/mediagoblin/templates/mediagoblin/edit/edit.html b/mediagoblin/templates/mediagoblin/edit/edit.html index b4b3be85..73c2bada 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit.html +++ b/mediagoblin/templates/mediagoblin/edit/edit.html @@ -34,7 +34,7 @@ {{ wtforms_util.render_divs(form) }}
{% trans %}Cancel{% endtrans %} - + {{ csrf_token }}
diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html index 93b2a792..bf8fe5c1 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit_profile.html +++ b/mediagoblin/templates/mediagoblin/edit/edit_profile.html @@ -32,7 +32,7 @@ {{ wtforms_util.render_divs(form) }}
- + {{ csrf_token }}
diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html index 43d973d1..25ce9e96 100644 --- a/mediagoblin/templates/mediagoblin/root.html +++ b/mediagoblin/templates/mediagoblin/root.html @@ -30,9 +30,9 @@ {% if allow_registration %}

{% trans %}Don't have one yet? It's easy!{% endtrans %}

{% trans register_url=request.urlgen('mediagoblin.auth.register') -%} - Create an account at this site + Create an account at this site or - Set up MediaGoblin on your own server + Set up MediaGoblin on your own server {%- endtrans %} {% endif %} diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html index 29b01181..1a0dd4b7 100644 --- a/mediagoblin/templates/mediagoblin/submit/start.html +++ b/mediagoblin/templates/mediagoblin/submit/start.html @@ -27,7 +27,7 @@ {{ wtforms_util.render_divs(submit_form) }}
{{ csrf_token }} - +
diff --git a/mediagoblin/templates/mediagoblin/test_submit.html b/mediagoblin/templates/mediagoblin/test_submit.html index 190b9ac3..38be8efc 100644 --- a/mediagoblin/templates/mediagoblin/test_submit.html +++ b/mediagoblin/templates/mediagoblin/test_submit.html @@ -25,7 +25,7 @@ {{ wtforms_util.render_table(image_form) }} - + {{ csrf_token }} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 4b02b684..c8a9650f 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -98,7 +98,7 @@ media=media._id) }}" method="POST"> {{ wtforms_util.render_divs(comment_form) }}
- + {{ csrf_token }}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html index 8da90f79..c3a9d622 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html @@ -47,7 +47,7 @@
{# TODO: This isn't a button really... might do unexpected things :) #} {% trans %}Cancel{% endtrans %} - + {{ csrf_token }}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index d6a9fe1f..91dd2369 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -62,7 +62,7 @@

{% trans %}In case it doesn't:{% endtrans %}

{% trans %}Resend verification email{% endtrans %} + class="button_form">{% trans %}Resend verification email{% endtrans %} {% else %} {# if the user is not you, but still needs to verify their email #} @@ -97,7 +97,7 @@

+ class="button_action"> {%- trans %}Edit profile{% endtrans -%} @@ -147,7 +147,7 @@ This is where your media will appear, but you don't seem to have added anything yet. {%- endtrans %}

- {%- trans %}Add media{% endtrans -%} -- cgit v1.2.3 From 5ab3855e1f8fd94058ccea76ef2d5a1d795cc93a Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 01:46:21 +0100 Subject: Slight change to error wording --- mediagoblin/auth/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 8412b81c..54cb1ab5 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -74,7 +74,7 @@ def register(request): extra_validation_passes = False if users_with_email: register_form.email.errors.append( - _(u'Sorry, that email address has already been taken.')) + _(u'Sorry, a user with that email address already exists.')) extra_validation_passes = False if extra_validation_passes: -- cgit v1.2.3 From c6c08a2f296be16dbde4a5041bd6adc0d215d29d Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 01:57:02 +0100 Subject: Small correction, this button should be button_action, not button_form --- mediagoblin/templates/mediagoblin/user_pages/user.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index 91dd2369..5a39aaa5 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -62,7 +62,7 @@

{% trans %}In case it doesn't:{% endtrans %}

{% trans %}Resend verification email{% endtrans %} + class="button_action_highlight">{% trans %}Resend verification email{% endtrans %} {% else %} {# if the user is not you, but still needs to verify their email #} -- cgit v1.2.3 From 88f20b58b29a4edbfbc24378a991d82de8e7b975 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 01:57:29 +0100 Subject: Slight style changes to button_action_highlight --- mediagoblin/static/css/base.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index cec236f4..c26e11af 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -132,7 +132,9 @@ a.mediagoblin_logo{ } .button_action_highlight{ -background-image: -moz-linear-gradient(center top , rgb(134, 212, 177), rgb(109, 173, 144)); + background-color: #86D4B1; + border-color: #A2DEC3 #6CAA8E #5C9179; + color: #283F35; } -- cgit v1.2.3 From cee794a8f7ac82ee7681f749e56411c910e281a6 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 15:34:40 +0100 Subject: Fix for bug #467, "Add explanatory copy to add/edit picture pages saying that tags are comma-separated" --- mediagoblin/edit/forms.py | 4 +++- mediagoblin/submit/forms.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index ec4e22b3..93934be7 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -26,7 +26,9 @@ class EditForm(wtforms.Form): description = wtforms.TextAreaField('Description of this work') tags = wtforms.TextField( _('Tags'), - [tag_length_validator]) + [tag_length_validator], + description=_( + "Seperate tags by commas or spaces.")) slug = wtforms.TextField( _('Slug'), [wtforms.validators.Required(message=_("The slug can't be empty"))], diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py index 25d6e304..48a21f02 100644 --- a/mediagoblin/submit/forms.py +++ b/mediagoblin/submit/forms.py @@ -30,4 +30,6 @@ class SubmitStartForm(wtforms.Form): _('Description of this work')) tags = wtforms.TextField( _('Tags'), - [tag_length_validator]) + [tag_length_validator], + description=_( + "Seperate tags by commas or spaces.")) -- cgit v1.2.3 From 16a444444ab42f88f1654054050b7dcd64bf960e Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 16:18:27 +0100 Subject: Change tag list from a list to a paragraph. Wrap text for translation. --- mediagoblin/templates/mediagoblin/utils/tags.html | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html index b3211bd9..19ca8d2a 100644 --- a/mediagoblin/templates/mediagoblin/utils/tags.html +++ b/mediagoblin/templates/mediagoblin/utils/tags.html @@ -17,13 +17,20 @@ #} {% block tags_content -%} -

Tags

- +

{% endblock %} -- cgit v1.2.3 From 7807f5a513f2d5e510916e00dc276d0cd33de66a Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 16:45:45 +0100 Subject: Remove Edit/Delete icons, since they are not required yet. --- mediagoblin/static/images/icon_delete.png | Bin 472 -> 0 bytes mediagoblin/static/images/icon_edit.png | Bin 297 -> 0 bytes mediagoblin/templates/mediagoblin/user_pages/media.html | 11 ++--------- 3 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 mediagoblin/static/images/icon_delete.png delete mode 100644 mediagoblin/static/images/icon_edit.png diff --git a/mediagoblin/static/images/icon_delete.png b/mediagoblin/static/images/icon_delete.png deleted file mode 100644 index 9d76a5db..00000000 Binary files a/mediagoblin/static/images/icon_delete.png and /dev/null differ diff --git a/mediagoblin/static/images/icon_edit.png b/mediagoblin/static/images/icon_edit.png deleted file mode 100644 index 480c73ad..00000000 Binary files a/mediagoblin/static/images/icon_edit.png and /dev/null differ diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index c8a9650f..7ef64c76 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -116,24 +116,17 @@ {% if media['uploader'] == request.user._id or request.user['is_admin'] %} -

{% trans %}Actions{% endtrans %}

{% set edit_url = request.urlgen('mediagoblin.edit.edit_media', user= media.uploader().username, media= media._id) %} - - {% trans %}edit{% endtrans %} + {% trans %}Edit{% endtrans %}

{% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', user= media.uploader().username, media= media._id) %} - - {% trans %}delete{% endtrans %} + {% trans %}Delete{% endtrans %}

{% endif %} -- cgit v1.2.3 From 0b3cdd6a25f8aaa74beecb7fed32a20cc13587a8 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 20 Nov 2011 17:01:23 +0100 Subject: Navigation buttons edits. Removed images as they are no longer needed. Related: bug #504 --- mediagoblin/static/css/base.css | 8 ++------ mediagoblin/static/images/navigation_end.png | Bin 718 -> 0 bytes mediagoblin/static/images/navigation_left.png | Bin 406 -> 0 bytes mediagoblin/static/images/navigation_right.png | Bin 383 -> 0 bytes mediagoblin/templates/mediagoblin/utils/prev_next.html | 8 ++++---- 5 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 mediagoblin/static/images/navigation_end.png delete mode 100644 mediagoblin/static/images/navigation_left.png delete mode 100644 mediagoblin/static/images/navigation_right.png diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index c26e11af..12d88ffa 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -300,15 +300,11 @@ img.media_icon{ border-color: #2c2c2c #232323 #1a1a1a; border-radius: 4px; text-decoration: none; - padding: 8px 0px 14px; - font-size: 2em; + padding: 12px 0 16px; + font-size: 1.4em; margin: 0 0 20px } -p.navigation_button{ - color: #272727; -} - .navigation_left{ margin-right: 6px; } diff --git a/mediagoblin/static/images/navigation_end.png b/mediagoblin/static/images/navigation_end.png deleted file mode 100644 index b2f27296..00000000 Binary files a/mediagoblin/static/images/navigation_end.png and /dev/null differ diff --git a/mediagoblin/static/images/navigation_left.png b/mediagoblin/static/images/navigation_left.png deleted file mode 100644 index d1645120..00000000 Binary files a/mediagoblin/static/images/navigation_left.png and /dev/null differ diff --git a/mediagoblin/static/images/navigation_right.png b/mediagoblin/static/images/navigation_right.png deleted file mode 100644 index d4caa7b8..00000000 Binary files a/mediagoblin/static/images/navigation_right.png and /dev/null differ diff --git a/mediagoblin/templates/mediagoblin/utils/prev_next.html b/mediagoblin/templates/mediagoblin/utils/prev_next.html index 75903076..3363891b 100644 --- a/mediagoblin/templates/mediagoblin/utils/prev_next.html +++ b/mediagoblin/templates/mediagoblin/utils/prev_next.html @@ -25,23 +25,23 @@ {# There are no previous entries for the very first media entry #} {% if prev_entry_url %} - Previous image + ← newer {% else %} {# This is the first entry. display greyed-out 'previous' image #} {% endif %} {# Likewise, this could be the very last media entry #} {% if next_entry_url %} - Next image + older → {% else %} {# This is the last entry. display greyed-out 'next' image #} {% endif %} -- cgit v1.2.3 From 5dbeda8a0f2953aed13521b6e87376327e8302e0 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 20 Nov 2011 20:15:21 +0100 Subject: Fix redirect to logical path redirects should in nearly all cases go to a logical path like 'mediagoblin.auth.login' and not to an absolute path like "/auth/login". --- mediagoblin/auth/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index b3a70d46..d01861d1 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -202,7 +202,7 @@ def resend_activation(request): messages.ERROR, _('You must be logged in so we know who to send the email to!')) - return redirect(request, "/auth/login") + return redirect(request, 'mediagoblin.auth.login') if request.user["email_verified"]: messages.add_message( -- cgit v1.2.3 From 9404a9fed23bfe27144da4f8e692df1f692a25b5 Mon Sep 17 00:00:00 2001 From: Jakob Kramer Date: Sun, 20 Nov 2011 21:15:07 +0100 Subject: don't use 'and' anymore, if there is only one tag --- mediagoblin/templates/mediagoblin/utils/tags.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html index 19ca8d2a..20c50f6e 100644 --- a/mediagoblin/templates/mediagoblin/utils/tags.html +++ b/mediagoblin/templates/mediagoblin/utils/tags.html @@ -20,7 +20,10 @@

{% trans %}Tagged with{% endtrans %} {% for tag in media.tags %} {% if loop.last %} - {% trans %}and{% endtrans %} {{ tag['name'] }}. {% elif loop.revindex==2 %} -- cgit v1.2.3 From a00f1c1e1cecb8f127b6a064e2cd90c8f613660d Mon Sep 17 00:00:00 2001 From: Jakob Kramer Date: Sun, 20 Nov 2011 21:30:46 +0100 Subject: eyecandy for programmers --- mediagoblin/templates/mediagoblin/utils/tags.html | 24 ++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html index 20c50f6e..49bc3cee 100644 --- a/mediagoblin/templates/mediagoblin/utils/tags.html +++ b/mediagoblin/templates/mediagoblin/utils/tags.html @@ -20,19 +20,21 @@

{% trans %}Tagged with{% endtrans %} {% for tag in media.tags %} {% if loop.last %} + {# the 'and' should only appear if there is more than one tag #} {% if media.tags|length > 1 %} - {% trans %}and{% endtrans %} + {% trans %}and{% endtrans %} {% endif %} - {{ tag['name'] }}. - {% elif loop.revindex==2 %} - {{ tag['name'] }} - {% else %}{{ tag['name'] }}, + + {{ tag['name'] }}. + {% elif loop.revindex==2 %} + {{ tag['name'] }} + {% else %}{{ tag['name'] }}, {% endif %} {% endfor %}

-- cgit v1.2.3 From fe0a8f53e251aae93bee5f4dee79d462fad751e8 Mon Sep 17 00:00:00 2001 From: Jakob Kramer Date: Sun, 20 Nov 2011 21:40:51 +0100 Subject: fixed identation --- mediagoblin/templates/mediagoblin/utils/tags.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html index 49bc3cee..c7dfc8eb 100644 --- a/mediagoblin/templates/mediagoblin/utils/tags.html +++ b/mediagoblin/templates/mediagoblin/utils/tags.html @@ -24,15 +24,15 @@ {% if media.tags|length > 1 %} {% trans %}and{% endtrans %} {% endif %} - {{ tag['name'] }}. - {% elif loop.revindex==2 %} + {% elif loop.revindex == 2 %} {{ tag['name'] }} - {% else %}{{ tag['name'] }}, {% endif %} -- cgit v1.2.3 From a63b640f12896a873ebf96f9fe0ef62d0794bfe7 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Mon, 21 Nov 2011 00:06:59 +0100 Subject: Stashing changes --- mediagoblin/init/celery/__init__.py | 3 -- mediagoblin/media_types/__init__.py | 26 ++++++------ mediagoblin/media_types/video/processing.py | 49 ++++------------------ mediagoblin/media_types/video/transcoders.py | 1 - mediagoblin/process_media/__init__.py | 3 ++ mediagoblin/templates/mediagoblin/base.html | 7 ++++ .../mediagoblin/media_displays/video.html | 18 +++++--- setup.py | 1 - 8 files changed, 43 insertions(+), 65 deletions(-) diff --git a/mediagoblin/init/celery/__init__.py b/mediagoblin/init/celery/__init__.py index 05c54b05..c5d37420 100644 --- a/mediagoblin/init/celery/__init__.py +++ b/mediagoblin/init/celery/__init__.py @@ -17,11 +17,8 @@ import os import sys -from mediagoblin.media_types import get_media_types - MANDATORY_CELERY_IMPORTS = ['mediagoblin.process_media'] -MANDATORY_CELERY_IMPORTS = [i for i in get_media_types()] print(MANDATORY_CELERY_IMPORTS) diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index 49d3ab9d..2d13f5a6 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -26,31 +26,33 @@ class FileTypeNotSupported(Exception): class InvalidFileType(Exception): pass +# This should be more dynamic in the future. Perhaps put it in the .ini? +# -- Joar MEDIA_TYPES = [ 'mediagoblin.media_types.image', 'mediagoblin.media_types.video'] def get_media_types(): + ''' + Generator that returns the available media types + ''' for media_type in MEDIA_TYPES: yield media_type def get_media_managers(): + ''' + Generator that returns all available media managers + ''' for media_type in get_media_types(): - ''' - FIXME - __import__ returns the lowest-level module. If the plugin is located - outside the conventional plugin module tree, it will not be loaded - properly because of the [...]ugin.media_types. - - We need this if we want to support a separate site-specific plugin - folder. - ''' try: __import__(media_type) except ImportError as e: - raise Exception('ERROR: Could not import {0}: {1}'.format(media_type, e)) + raise Exception( + _('ERROR: Could not import {media_type}: {exception}').format( + media_type=media_type, + exception=e)) yield media_type, sys.modules[media_type].MEDIA_MANAGER @@ -67,8 +69,8 @@ def get_media_type_and_manager(filename): ext = os.path.splitext(filename)[1].lower() else: raise InvalidFileType( - 'Could not find any file extension in "{0}"'.format( - filename)) + _('Could not find any file extension in "{filename}"').format( + filename=filename)) if ext[1:] in manager['accepted_extensions']: return media_type, manager diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index 027f527b..4e05a71c 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -15,25 +15,21 @@ # along with this program. If not, see . import tempfile -import pkg_resources -import os import logging +import os from celery.task import Task from celery import registry from mediagoblin.db.util import ObjectId from mediagoblin import mg_globals as mgg -from mediagoblin.util import lazy_pass_to_ugettext as _ -from mediagoblin.process_media.errors import BaseProcessingFail, BadMediaFail +from mediagoblin.process_media import BaseProcessingFail from mediagoblin.process_media import mark_entry_failed from . import transcoders THUMB_SIZE = 180, 180 MEDIUM_SIZE = 640, 640 -loop = None # Is this even used? - logger = logging.getLogger(__name__) logging.basicConfig() logger.setLevel(logging.DEBUG) @@ -59,7 +55,11 @@ def process_video(entry): 'source') medium_filepath = create_pub_filepath( - entry, '640p.webm') + entry, + '{original}-640p.webm'.format( + original=os.path.splitext( + queued_filepath[-1])[0] # Select the + )) thumbnail_filepath = create_pub_filepath( entry, 'thumbnail.jpg') @@ -163,38 +163,3 @@ class ProcessMedia(Task): process_media = registry.tasks[ProcessMedia.name] - - -def mark_entry_failed(entry_id, exc): - """ - Mark a media entry as having failed in its conversion. - - Uses the exception that was raised to mark more information. If the - exception is a derivative of BaseProcessingFail then we can store extra - information that can be useful for users telling them why their media failed - to process. - - Args: - - entry_id: The id of the media entry - - """ - # Was this a BaseProcessingFail? In other words, was this a - # type of error that we know how to handle? - if isinstance(exc, BaseProcessingFail): - # Looks like yes, so record information about that failure and any - # metadata the user might have supplied. - mgg.database['media_entries'].update( - {'_id': entry_id}, - {'$set': {u'state': u'failed', - u'fail_error': exc.exception_path, - u'fail_metadata': exc.metadata}}) - else: - # Looks like no, so just mark it as failed and don't record a - # failure_error (we'll assume it wasn't handled) and don't record - # metadata (in fact overwrite it if somehow it had previous info - # here) - mgg.database['media_entries'].update( - {'_id': entry_id}, - {'$set': {u'state': u'failed', - u'fail_error': None, - u'fail_metadata': {}}}) diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index f6a2eb21..8d80beda 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -56,7 +56,6 @@ try: import pygst pygst.require('0.10') import gst - from gst import pbutils from gst.extend import discoverer except: raise Exception('gst/pygst 0.10 could not be found') diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 2b9eed6e..96fe49fe 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -53,10 +53,13 @@ class ProcessMedia(Task): # Try to process, and handle expected errors. try: + __import__(entry['media_type']) process_image(entry) except BaseProcessingFail, exc: mark_entry_failed(entry[u'_id'], exc) return + except ImportError, exc: + mark_entry_failed(entry[u'_id'], exc) entry['state'] = u'processed' entry.save() diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index b4c4dcf3..bad22e7e 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -28,8 +28,15 @@ href="{{ request.staticdirect('/css/extlib/960_16_col.css') }}"/> + + + + {% block mediagoblin_head %} {% endblock mediagoblin_head %} diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html index bff9889a..5b8ec789 100644 --- a/mediagoblin/templates/mediagoblin/media_displays/video.html +++ b/mediagoblin/templates/mediagoblin/media_displays/video.html @@ -1,11 +1,17 @@ {% extends 'mediagoblin/user_pages/media.html' %} {% block mediagoblin_media %} - +
+ +
{% if 'original' in media.media_files %}

1: + directory = self._resolve_filepath(filepath[:-1]) + if not os.path.exists(directory): + os.makedirs(directory) + + shutil.copy( + filename, self.get_local_path(filepath)) -- cgit v1.2.3 From 2e8fbc8fab47930f1de7e20e0072eaefafc898a6 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 20 Nov 2011 22:02:02 -0600 Subject: Slightly clearer docs on copy_local_to_storage --- mediagoblin/storage/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mediagoblin/storage/__init__.py b/mediagoblin/storage/__init__.py index b76e18af..0840614b 100644 --- a/mediagoblin/storage/__init__.py +++ b/mediagoblin/storage/__init__.py @@ -172,6 +172,10 @@ class StorageInterface(object): def copy_local_to_storage(self, filename, filepath): """ Copy this file from locally to the storage system. + + This is kind of the opposite of copy_locally. It's likely you + could override this method with something more appropriate to + your storage system. """ with self.get_file(filepath, 'wb') as dest_file: with file(filename, 'rb') as source_file: -- cgit v1.2.3 From 61c5306d247a4403032e4e37bbdf32db1e6d8aa8 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 20 Nov 2011 22:03:38 -0600 Subject: Made the image processing use intermediary conversion file. This should fix the problem with PIL and the cloudfiles storage system fighting. --- mediagoblin/process_media/__init__.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 34d83e54..54c0c493 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -118,6 +118,10 @@ def process_image(entry): Code to process an image """ workbench = mgg.workbench_manager.create_workbench() + # Conversions subdirectory to avoid collisions + conversions_subdir = os.path.join( + workbench.dir, 'conversions') + os.mkdir(conversions_subdir) queued_filepath = entry['queued_media_file'] queued_filename = workbench.localized_file( @@ -133,11 +137,15 @@ def process_image(entry): thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS) - thumb_filepath = create_pub_filepath(entry, 'thumbnail' + extension) - thumb_file = mgg.public_store.get_file(thumb_filepath, 'w') - - with thumb_file: + # Copy the thumb to the conversion subdir, then remotely. + thumb_filename = 'thumbnail' + extension + thumb_filepath = create_pub_filepath(entry, thumb_filename) + tmp_thumb_filename = os.path.join( + conversions_subdir, thumb_filename) + with file(tmp_thumb_filename, 'w') as thumb_file: thumb.save(thumb_file) + mgg.public_store.copy_local_to_storage( + tmp_thumb_filename, thumb_filepath) # 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,12 +156,18 @@ def process_image(entry): if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]: medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS) - medium_filepath = create_pub_filepath(entry, 'medium' + extension) - medium_file = mgg.public_store.get_file(medium_filepath, 'w') + medium_filename = 'medium' + extension + medium_filepath = create_pub_filepath(entry, medium_filename) + tmp_medium_filename = os.path.join( + conversions_subdir, medium_filename) - with medium_file: + with file(tmp_medium_filename, 'w') as medium_file: medium.save(medium_file) - medium_processed = True + + mgg.public_store.copy_local_to_storage( + tmp_medium_filename, medium_filepath) + + medium_processed = True # we have to re-read because unlike PIL, not everything reads # things in string representation :) -- cgit v1.2.3 From e56e5f8c5c3dc7909aa68a1543ed04ddb18e27f6 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 20 Nov 2011 22:25:22 -0600 Subject: Tests for StorageInterface*.copy_local_to_storage() --- mediagoblin/tests/test_storage.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/mediagoblin/tests/test_storage.py b/mediagoblin/tests/test_storage.py index 46ecb2ec..eab4d032 100644 --- a/mediagoblin/tests/test_storage.py +++ b/mediagoblin/tests/test_storage.py @@ -57,6 +57,10 @@ class FakeRemoteStorage(storage.filestorage.BasicFileStorage): # should force copying to the workbench local_storage = False + def copy_local_to_storage(self, *args, **kwargs): + return storage.StorageInterface.copy_local_to_storage( + self, *args, **kwargs) + def test_storage_system_from_config(): this_storage = storage.storage_system_from_config( @@ -252,3 +256,26 @@ def test_basic_storage_copy_locally(): this_storage.copy_locally(filepath, new_file_dest) assert file(new_file_dest).read() == 'Testing this file' + + +def _test_copy_local_to_storage_works(tmpdir, this_storage): + local_filename = tempfile.mktemp() + with file(local_filename, 'w') as tmpfile: + tmpfile.write('haha') + + this_storage.copy_local_to_storage( + local_filename, ['dir1', 'dir2', 'copiedto.txt']) + + assert file( + os.path.join(tmpdir, 'dir1/dir2/copiedto.txt'), + 'r').read() == 'haha' + + +def test_basic_storage_copy_local_to_storage(): + tmpdir, this_storage = get_tmp_filestorage() + _test_copy_local_to_storage_works(tmpdir, this_storage) + + +def test_general_storage_copy_local_to_storage(): + tmpdir, this_storage = get_tmp_filestorage(fake_remote=True) + _test_copy_local_to_storage_works(tmpdir, this_storage) -- cgit v1.2.3 From c875bb74a8245b39b6985f37cb8ab838c22efa7e Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Mon, 21 Nov 2011 21:47:00 +0100 Subject: Refractored GStreamer element linking --- mediagoblin/media_types/video/transcoders.py | 43 ++++++++++++++-------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index 8d80beda..8b220891 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -17,7 +17,6 @@ from __future__ import division import os -os.environ["GST_DEBUG_DUMP_DOT_DIR"] = "/tmp" os.putenv('GST_DEBUG_DUMP_DOT_DIR', '/tmp') import sys @@ -498,28 +497,30 @@ class VideoTranscoder: # or audio sink self.filesrc.link(self.decoder) - # Link all the video elements in a link to webmux - self.videoqueue.link(self.videorate) - self.videorate.link(self.ffmpegcolorspace) - self.ffmpegcolorspace.link(self.videoscale) - self.videoscale.link(self.capsfilter) - #self.capsfilter.link(self.xvimagesink) - self.capsfilter.link(self.vp8enc) - self.vp8enc.link(self.webmmux) + # Link all the video elements in a row to webmmux + gst.element_link_many( + self.videoqueue, + self.videorate, + self.ffmpegcolorspace, + self.videoscale, + self.capsfilter, + self.vp8enc, + self.webmmux) if self.data.is_audio: - # Link all the audio elements in a line to webmux - #self.audioconvert.link(self.alsasink) - self.audioqueue.link(self.audiorate) - self.audiorate.link(self.audioconvert) - self.audioconvert.link(self.audiocapsfilter) - self.audiocapsfilter.link(self.vorbisenc) - #self.audiocapsfilter.link(self.level) - #self.level.link(self.vorbisenc) - self.vorbisenc.link(self.webmmux) - - self.webmmux.link(self.progressreport) - self.progressreport.link(self.filesink) + # Link all the audio elements in a row to webmux + gst.element_link_many( + self.audioqueue, + self.audiorate, + self.audioconvert, + self.audiocapsfilter, + self.vorbisenc, + self.webmmux) + + gst.element_link_many( + self.webmmux, + self.progressreport, + self.filesink) # Setup the message bus and connect _on_message to the pipeline self._setup_bus() -- cgit v1.2.3 From 58dd8d9e6326013528cdfdfeea375c4eade54b92 Mon Sep 17 00:00:00 2001 From: "Pablo J. Urbano Santos" Date: Mon, 21 Nov 2011 22:42:55 +0100 Subject: Filename extensions are lowercased before uploading the image. --- mediagoblin/process_media/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py index 54c0c493..dcf21b81 100644 --- a/mediagoblin/process_media/__init__.py +++ b/mediagoblin/process_media/__init__.py @@ -128,7 +128,9 @@ def process_image(entry): mgg.queue_store, queued_filepath, 'source') - extension = os.path.splitext(queued_filename)[1] + filename_bits = os.path.splitext(queued_filename) + basename = os.path.split(filename_bits[0])[1] + extension = filename_bits[1].lower() try: thumb = Image.open(queued_filename) @@ -174,7 +176,8 @@ def process_image(entry): queued_file = file(queued_filename, 'rb') with queued_file: - original_filepath = create_pub_filepath(entry, queued_filepath[-1]) + #create_pub_filepath(entry, queued_filepath[-1]) + original_filepath = create_pub_filepath(entry, basename + extension) with mgg.public_store.get_file(original_filepath, 'wb') \ as original_file: -- cgit v1.2.3 From 8e5f974684ce4e329a5022459f2e536fa4e15edd Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Mon, 21 Nov 2011 23:18:40 +0100 Subject: Fixes after merging video branch into master - Removed debug output from init/celery - Moved process_media/__init__ to processing.py - Centralized the processing.ProcessMedia task class - Updated media managers to reference the processing function instead of the ProcessMedia instance - Updated new-style image processing to previous, newer old-style image processing - Updated video transcoding - Changed method in progress output, sometimes message.structure['percent'] raises KeyError --- mediagoblin/init/celery/__init__.py | 4 +- mediagoblin/media_types/image/__init__.py | 8 +- mediagoblin/media_types/image/processing.py | 95 +++++-------- mediagoblin/media_types/video/__init__.py | 7 +- mediagoblin/media_types/video/processing.py | 69 ++-------- mediagoblin/media_types/video/transcoders.py | 17 +-- mediagoblin/process_media/__init__.py | 195 --------------------------- mediagoblin/process_media/errors.py | 45 ------- mediagoblin/processing.py | 143 ++++++++++++++++++++ mediagoblin/submit/views.py | 7 +- 10 files changed, 200 insertions(+), 390 deletions(-) delete mode 100644 mediagoblin/process_media/__init__.py delete mode 100644 mediagoblin/process_media/errors.py create mode 100644 mediagoblin/processing.py diff --git a/mediagoblin/init/celery/__init__.py b/mediagoblin/init/celery/__init__.py index a62d40e3..1eb21d7a 100644 --- a/mediagoblin/init/celery/__init__.py +++ b/mediagoblin/init/celery/__init__.py @@ -18,9 +18,7 @@ import os import sys -MANDATORY_CELERY_IMPORTS = ['mediagoblin.process_media'] - -print(MANDATORY_CELERY_IMPORTS) +MANDATORY_CELERY_IMPORTS = ['mediagoblin.processing'] DEFAULT_SETTINGS_MODULE = 'mediagoblin.init.celery.dummy_settings_module' diff --git a/mediagoblin/media_types/image/__init__.py b/mediagoblin/media_types/image/__init__.py index 0cd0383f..3b63d8eb 100644 --- a/mediagoblin/media_types/image/__init__.py +++ b/mediagoblin/media_types/image/__init__.py @@ -14,15 +14,13 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from mediagoblin.media_types.image.processing import process_media +from mediagoblin.media_types.image.processing import process_image MEDIA_MANAGER = { "human_readable": "Image", - "processor": process_media, # alternately a string, + "processor": process_image, # alternately a string, # 'mediagoblin.media_types.image.processing'? "display_template": "mediagoblin/media_displays/image.html", "default_thumb": "images/media_thumbs/image.jpg", - "accepted_extensions": ["jpg", "jpeg", "png", "gif", "tiff"], - "accepted_mimetypes": [ - "image/jpeg", "image/png", "image/gif", "image/tiff"]} + "accepted_extensions": ["jpg", "jpeg", "png", "gif", "tiff"]} diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py index 57eb75db..5e8e4e0a 100644 --- a/mediagoblin/media_types/image/processing.py +++ b/mediagoblin/media_types/image/processing.py @@ -15,6 +15,7 @@ # along with this program. If not, see . import Image +import os from celery.task import Task from celery import registry @@ -22,19 +23,9 @@ from celery import registry from mediagoblin.db.util import ObjectId from mediagoblin import mg_globals as mgg -from mediagoblin.util import lazy_pass_to_ugettext as _ - -from mediagoblin.process_media.errors import * - -THUMB_SIZE = 180, 180 -MEDIUM_SIZE = 640, 640 - - -def create_pub_filepath(entry, filename): - return mgg.public_store.get_unique_filepath( - ['media_entries', - unicode(entry['_id']), - filename]) +from mediagoblin.processing import BaseProcessingFail, \ + mark_entry_failed, BadMediaFail, create_pub_filepath, THUMB_SIZE, \ + MEDIUM_SIZE ################################ # Media processing initial steps @@ -77,67 +68,39 @@ class ProcessMedia(Task): process_media = registry.tasks[ProcessMedia.name] -def mark_entry_failed(entry_id, exc): - """ - Mark a media entry as having failed in its conversion. - - Uses the exception that was raised to mark more information. If the - exception is a derivative of BaseProcessingFail then we can store extra - information that can be useful for users telling them why their media failed - to process. - - Args: - - entry_id: The id of the media entry - - """ - # Was this a BaseProcessingFail? In other words, was this a - # type of error that we know how to handle? - if isinstance(exc, BaseProcessingFail): - # Looks like yes, so record information about that failure and any - # metadata the user might have supplied. - mgg.database['media_entries'].update( - {'_id': entry_id}, - {'$set': {u'state': u'failed', - u'fail_error': exc.exception_path, - u'fail_metadata': exc.metadata}}) - else: - # Looks like no, so just mark it as failed and don't record a - # failure_error (we'll assume it wasn't handled) and don't record - # metadata (in fact overwrite it if somehow it had previous info - # here) - mgg.database['media_entries'].update( - {'_id': entry_id}, - {'$set': {u'state': u'failed', - u'fail_error': None, - u'fail_metadata': {}}}) - - def process_image(entry): """ Code to process an image """ workbench = mgg.workbench_manager.create_workbench() + # Conversions subdirectory to avoid collisions + conversions_subdir = os.path.join( + workbench.dir, 'conversions') + os.mkdir(conversions_subdir) queued_filepath = entry['queued_media_file'] queued_filename = workbench.localized_file( 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_file = mgg.public_store.get_file(thumb_filepath, 'w') - with thumb_file: - thumb.save(thumb_file, "JPEG", quality=90) + # Copy the thumb to the conversion subdir, then remotely. + thumb_filename = 'thumbnail' + extension + thumb_filepath = create_pub_filepath(entry, thumb_filename) + tmp_thumb_filename = os.path.join( + conversions_subdir, thumb_filename) + with file(tmp_thumb_filename, 'w') as thumb_file: + thumb.save(thumb_file) + mgg.public_store.copy_local_to_storage( + tmp_thumb_filename, thumb_filepath) # 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,15 +111,18 @@ 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_filename = 'medium' + extension + medium_filepath = create_pub_filepath(entry, medium_filename) + tmp_medium_filename = os.path.join( + conversions_subdir, medium_filename) + + with file(tmp_medium_filename, 'w') as medium_file: + medium.save(medium_file) - medium_filepath = create_pub_filepath(entry, 'medium.jpg') - medium_file = mgg.public_store.get_file(medium_filepath, 'w') + mgg.public_store.copy_local_to_storage( + tmp_medium_filename, medium_filepath) - with medium_file: - medium.save(medium_file, "JPEG", quality=90) - medium_processed = True + medium_processed = True # we have to re-read because unlike PIL, not everything reads # things in string representation :) @@ -165,7 +131,8 @@ def process_image(entry): with queued_file: original_filepath = create_pub_filepath(entry, queued_filepath[-1]) - with mgg.public_store.get_file(original_filepath, 'wb') as original_file: + with mgg.public_store.get_file(original_filepath, 'wb') \ + as original_file: original_file.write(queued_file.read()) mgg.queue_store.delete_file(queued_filepath) diff --git a/mediagoblin/media_types/video/__init__.py b/mediagoblin/media_types/video/__init__.py index c1910ee2..a970ab01 100644 --- a/mediagoblin/media_types/video/__init__.py +++ b/mediagoblin/media_types/video/__init__.py @@ -14,13 +14,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from mediagoblin.media_types.video.processing import process_media +from mediagoblin.media_types.video.processing import process_video MEDIA_MANAGER = { "human_readable": "Video", - "processor": process_media, # alternately a string, + "processor": process_video, # alternately a string, # 'mediagoblin.media_types.image.processing'? "display_template": "mediagoblin/media_displays/video.html", "default_thumb": "images/media_thumbs/video.jpg", - "accepted_extensions": ["mp4", "mov", "webm", "avi", "3gp", "3gpp", "mkv", "ogv", "ogg"]} + "accepted_extensions": [ + "mp4", "mov", "webm", "avi", "3gp", "3gpp", "mkv", "ogv", "ogg"]} diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index 4e05a71c..6125e49c 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -18,21 +18,15 @@ import tempfile import logging import os -from celery.task import Task -from celery import registry - -from mediagoblin.db.util import ObjectId from mediagoblin import mg_globals as mgg -from mediagoblin.process_media import BaseProcessingFail -from mediagoblin.process_media import mark_entry_failed +from mediagoblin.processing import mark_entry_failed, \ + THUMB_SIZE, MEDIUM_SIZE, create_pub_filepath from . import transcoders -THUMB_SIZE = 180, 180 -MEDIUM_SIZE = 640, 640 - -logger = logging.getLogger(__name__) logging.basicConfig() -logger.setLevel(logging.DEBUG) + +_log = logging.getLogger(__name__) +_log.setLevel(logging.DEBUG) def process_video(entry): @@ -73,8 +67,10 @@ def process_video(entry): transcoder = transcoders.VideoTranscoder(queued_filename, tmp_dst.name) # Push transcoded video to public storage + _log.debug('Saving medium...') mgg.public_store.get_file(medium_filepath, 'wb').write( tmp_dst.read()) + _log.debug('Saved medium') entry['media_files']['webm_640'] = medium_filepath @@ -91,8 +87,10 @@ def process_video(entry): transcoders.VideoThumbnailer(queued_filename, tmp_thumb.name) # Push the thumbnail to public storage + _log.debug('Saving thumbnail...') mgg.public_store.get_file(thumbnail_filepath, 'wb').write( tmp_thumb.read()) + _log.debug('Saved thumbnail') entry['media_files']['thumb'] = thumbnail_filepath @@ -107,7 +105,9 @@ def process_video(entry): with mgg.public_store.get_file(original_filepath, 'wb') as \ original_file: + _log.debug('Saving original...') original_file.write(queued_file.read()) + _log.debug('Saved original') entry['media_files']['original'] = original_filepath @@ -116,50 +116,3 @@ def process_video(entry): # Save the MediaEntry entry.save() - -def create_pub_filepath(entry, filename): - return mgg.public_store.get_unique_filepath( - ['media_entries', - unicode(entry['_id']), - filename]) - - -################################ -# Media processing initial steps -################################ - -class ProcessMedia(Task): - """ - Pass this entry off for processing. - """ - def run(self, media_id): - """ - Pass the media entry off to the appropriate processing function - (for now just process_image...) - """ - entry = mgg.database.MediaEntry.one( - {'_id': ObjectId(media_id)}) - - # Try to process, and handle expected errors. - try: - process_video(entry) - except BaseProcessingFail, exc: - mark_entry_failed(entry[u'_id'], exc) - return - - entry['state'] = u'processed' - entry.save() - - def on_failure(self, exc, task_id, args, kwargs, einfo): - """ - If the processing failed we should mark that in the database. - - Assuming that the exception raised is a subclass of BaseProcessingFail, - we can use that to get more information about the failure and store that - for conveying information to users about the failure, etc. - """ - entry_id = args[0] - mark_entry_failed(entry_id, exc) - - -process_media = registry.tasks[ProcessMedia.name] diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index 8b220891..493a837f 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -195,7 +195,6 @@ class VideoThumbnailer: _log.debug('seek amount: {0}'.format(seek_amount)) - seek_result = self.thumbnail_pipeline.seek( 1.0, gst.FORMAT_TIME, @@ -204,14 +203,6 @@ class VideoThumbnailer: seek_amount, gst.SEEK_TYPE_NONE, 0) - ''' - - seek_result = self.thumbnail_pipeline.seek_simple( - gst.FORMAT_TIME, - gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE, - seek_amount) - - ''' if not seek_result: self.errors.append('COULD_NOT_SEEK') @@ -576,17 +567,13 @@ class VideoTranscoder: elif t == gst.MESSAGE_ELEMENT: if message.structure.get_name() == 'progress': - data = { - 'structure': message.structure, - 'percent': message.structure['percent'], - 'total': message.structure['total'], - 'current': message.structure['current']} + data = dict(message.structure) if self._progress_callback: self._progress_callback(data) _log.info('{percent}% done...'.format( - percent=data['percent'])) + percent=data.get('percent'))) _log.debug(data) elif t == gst.MESSAGE_ERROR: diff --git a/mediagoblin/process_media/__init__.py b/mediagoblin/process_media/__init__.py deleted file mode 100644 index 346bb479..00000000 --- a/mediagoblin/process_media/__init__.py +++ /dev/null @@ -1,195 +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 . - -import os - -import Image -from celery.task import Task -from celery import registry - -from mediagoblin.db.util import ObjectId -from mediagoblin import mg_globals as mgg -from mediagoblin.process_media.errors import BaseProcessingFail, BadMediaFail - - -THUMB_SIZE = 180, 180 -MEDIUM_SIZE = 640, 640 - - -def create_pub_filepath(entry, filename): - return mgg.public_store.get_unique_filepath( - ['media_entries', - unicode(entry._id), - filename]) - - -################################ -# Media processing initial steps -################################ - -class ProcessMedia(Task): - """ - Pass this entry off for processing. - """ - def run(self, media_id): - """ - Pass the media entry off to the appropriate processing function - (for now just process_image...) - """ - entry = mgg.database.MediaEntry.one( - {'_id': ObjectId(media_id)}) - - # Try to process, and handle expected errors. - try: - __import__(entry['media_type']) - process_image(entry) - except BaseProcessingFail, exc: - mark_entry_failed(entry._id, exc) - return - except ImportError, exc: - mark_entry_failed(entry[u'_id'], exc) - - entry['state'] = u'processed' - entry.save() - - def on_failure(self, exc, task_id, args, kwargs, einfo): - """ - If the processing failed we should mark that in the database. - - Assuming that the exception raised is a subclass of - BaseProcessingFail, we can use that to get more information - about the failure and store that for conveying information to - users about the failure, etc. - """ - entry_id = args[0] - mark_entry_failed(entry_id, exc) - - -process_media = registry.tasks[ProcessMedia.name] - - -def mark_entry_failed(entry_id, exc): - """ - Mark a media entry as having failed in its conversion. - - Uses the exception that was raised to mark more information. If - the exception is a derivative of BaseProcessingFail then we can - store extra information that can be useful for users telling them - why their media failed to process. - - Args: - - entry_id: The id of the media entry - - """ - # Was this a BaseProcessingFail? In other words, was this a - # type of error that we know how to handle? - if isinstance(exc, BaseProcessingFail): - # Looks like yes, so record information about that failure and any - # metadata the user might have supplied. - mgg.database['media_entries'].update( - {'_id': entry_id}, - {'$set': {u'state': u'failed', - u'fail_error': exc.exception_path, - u'fail_metadata': exc.metadata}}) - else: - # Looks like no, so just mark it as failed and don't record a - # failure_error (we'll assume it wasn't handled) and don't record - # metadata (in fact overwrite it if somehow it had previous info - # here) - mgg.database['media_entries'].update( - {'_id': entry_id}, - {'$set': {u'state': u'failed', - u'fail_error': None, - u'fail_metadata': {}}}) - - -def process_image(entry): - """ - Code to process an image - """ - workbench = mgg.workbench_manager.create_workbench() - # Conversions subdirectory to avoid collisions - conversions_subdir = os.path.join( - workbench.dir, 'conversions') - os.mkdir(conversions_subdir) - - queued_filepath = entry['queued_media_file'] - queued_filename = workbench.localized_file( - 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) - - # Copy the thumb to the conversion subdir, then remotely. - thumb_filename = 'thumbnail' + extension - thumb_filepath = create_pub_filepath(entry, thumb_filename) - tmp_thumb_filename = os.path.join( - conversions_subdir, thumb_filename) - with file(tmp_thumb_filename, 'w') as thumb_file: - thumb.save(thumb_file) - mgg.public_store.copy_local_to_storage( - tmp_thumb_filename, thumb_filepath) - - # 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 - # entry. - medium = Image.open(queued_filename) - medium_processed = False - - if medium.size[0] > MEDIUM_SIZE[0] or medium.size[1] > MEDIUM_SIZE[1]: - medium.thumbnail(MEDIUM_SIZE, Image.ANTIALIAS) - - medium_filename = 'medium' + extension - medium_filepath = create_pub_filepath(entry, medium_filename) - tmp_medium_filename = os.path.join( - conversions_subdir, medium_filename) - - with file(tmp_medium_filename, 'w') as medium_file: - medium.save(medium_file) - - mgg.public_store.copy_local_to_storage( - tmp_medium_filename, medium_filepath) - - medium_processed = True - - # we have to re-read because unlike PIL, not everything reads - # things in string representation :) - queued_file = file(queued_filename, 'rb') - - with queued_file: - original_filepath = create_pub_filepath(entry, queued_filepath[-1]) - - with mgg.public_store.get_file(original_filepath, 'wb') \ - as original_file: - original_file.write(queued_file.read()) - - mgg.queue_store.delete_file(queued_filepath) - entry['queued_media_file'] = [] - media_files_dict = entry.setdefault('media_files', {}) - media_files_dict['thumb'] = thumb_filepath - media_files_dict['original'] = original_filepath - if medium_processed: - media_files_dict['medium'] = medium_filepath - - # clean up workbench - workbench.destroy_self() diff --git a/mediagoblin/process_media/errors.py b/mediagoblin/process_media/errors.py deleted file mode 100644 index 4224a3e1..00000000 --- a/mediagoblin/process_media/errors.py +++ /dev/null @@ -1,45 +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 . - -from mediagoblin.tools.translate import lazy_pass_to_ugettext as _ - - -class BaseProcessingFail(Exception): - """ - Base exception that all other processing failure messages should - subclass from. - - You shouldn't call this itself; instead you should subclass it - and provid the exception_path and general_message applicable to - this error. - """ - general_message = u'' - - @property - def exception_path(self): - return u"%s:%s" % ( - self.__class__.__module__, self.__class__.__name__) - - def __init__(self, **metadata): - self.metadata = metadata or {} - - -class BadMediaFail(BaseProcessingFail): - """ - Error that should be raised when an inappropriate file was given - for the media type specified. - """ - general_message = _(u'Invalid file given for media type.') diff --git a/mediagoblin/processing.py b/mediagoblin/processing.py new file mode 100644 index 00000000..8738cbe2 --- /dev/null +++ b/mediagoblin/processing.py @@ -0,0 +1,143 @@ +# 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 . + +from celery.task import Task + +from mediagoblin.db.util import ObjectId +from mediagoblin import mg_globals as mgg + +from mediagoblin.util import lazy_pass_to_ugettext as _ + +from mediagoblin.media_types import get_media_manager + + +THUMB_SIZE = 180, 180 +MEDIUM_SIZE = 640, 640 + + +def create_pub_filepath(entry, filename): + return mgg.public_store.get_unique_filepath( + ['media_entries', + unicode(entry._id), + filename]) + + +################################ +# Media processing initial steps +################################ + +class ProcessMedia(Task): + """ + DEPRECATED -- This now resides in the individual media plugins + + Pass this entry off for processing. + """ + def run(self, media_id): + """ + Pass the media entry off to the appropriate processing function + (for now just process_image...) + """ + entry = mgg.database.MediaEntry.one( + {'_id': ObjectId(media_id)}) + + # Try to process, and handle expected errors. + try: + #__import__(entry['media_type']) + manager = get_media_manager(entry['media_type']) + manager['processor'](entry) + except BaseProcessingFail, exc: + mark_entry_failed(entry._id, exc) + return + except ImportError, exc: + mark_entry_failed(entry[u'_id'], exc) + + entry['state'] = u'processed' + entry.save() + + def on_failure(self, exc, task_id, args, kwargs, einfo): + """ + If the processing failed we should mark that in the database. + + Assuming that the exception raised is a subclass of + BaseProcessingFail, we can use that to get more information + about the failure and store that for conveying information to + users about the failure, etc. + """ + entry_id = args[0] + mark_entry_failed(entry_id, exc) + + +def mark_entry_failed(entry_id, exc): + """ + Mark a media entry as having failed in its conversion. + + Uses the exception that was raised to mark more information. If + the exception is a derivative of BaseProcessingFail then we can + store extra information that can be useful for users telling them + why their media failed to process. + + Args: + - entry_id: The id of the media entry + + """ + # Was this a BaseProcessingFail? In other words, was this a + # type of error that we know how to handle? + if isinstance(exc, BaseProcessingFail): + # Looks like yes, so record information about that failure and any + # metadata the user might have supplied. + mgg.database['media_entries'].update( + {'_id': entry_id}, + {'$set': {u'state': u'failed', + u'fail_error': exc.exception_path, + u'fail_metadata': exc.metadata}}) + else: + # Looks like no, so just mark it as failed and don't record a + # failure_error (we'll assume it wasn't handled) and don't record + # metadata (in fact overwrite it if somehow it had previous info + # here) + mgg.database['media_entries'].update( + {'_id': entry_id}, + {'$set': {u'state': u'failed', + u'fail_error': None, + u'fail_metadata': {}}}) + + +class BaseProcessingFail(Exception): + """ + Base exception that all other processing failure messages should + subclass from. + + You shouldn't call this itself; instead you should subclass it + and provid the exception_path and general_message applicable to + this error. + """ + general_message = u'' + + @property + def exception_path(self): + return u"%s:%s" % ( + self.__class__.__module__, self.__class__.__name__) + + def __init__(self, **metadata): + self.metadata = metadata or {} + + +class BadMediaFail(BaseProcessingFail): + """ + Error that should be raised when an inappropriate file was given + for the media type specified. + """ + general_message = _(u'Invalid file given for media type.') diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index dd1c3d1b..21381e39 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -19,6 +19,8 @@ import uuid from os.path import splitext from cgi import FieldStorage +from celery import registry + from werkzeug.utils import secure_filename from mediagoblin.db.util import ObjectId @@ -27,7 +29,7 @@ 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 mark_entry_failed +from mediagoblin.processing import mark_entry_failed, ProcessMedia from mediagoblin.messages import add_message, SUCCESS from mediagoblin.media_types import get_media_type_and_manager @@ -104,8 +106,9 @@ def submit_start(request): # # (... don't change entry after this point to avoid race # conditions with changes to the document via processing code) + process_media = registry.tasks[ProcessMedia.name] try: - media_manager['processor'].apply_async( + process_media.apply_async( [unicode(entry._id)], {}, task_id=task_id) except BaseException as exc: -- cgit v1.2.3 From 0bce749b21595fb0e33e2a109902b71e4611d483 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Mon, 21 Nov 2011 23:38:31 +0100 Subject: Fixes after merging video into master - part 2 - Added handling of InvalidFileType to submit.views - Updated test_celery_setup and test_submission tests to reflect the changes to the media procesing infrastructure --- mediagoblin/submit/views.py | 135 +++++++++++++++++---------------- mediagoblin/tests/test_celery_setup.py | 4 +- mediagoblin/tests/test_submission.py | 6 +- 3 files changed, 74 insertions(+), 71 deletions(-) diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 21381e39..3def44ce 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -31,7 +31,7 @@ from mediagoblin.decorators import require_active_login from mediagoblin.submit import forms as submit_forms, security from mediagoblin.processing import mark_entry_failed, ProcessMedia from mediagoblin.messages import add_message, SUCCESS -from mediagoblin.media_types import get_media_type_and_manager +from mediagoblin.media_types import get_media_type_and_manager, InvalidFileType @require_active_login @@ -48,86 +48,89 @@ def submit_start(request): submit_form.file.errors.append( _(u'You must provide a file.')) else: - filename = request.POST['file'].filename + try: + filename = request.POST['file'].filename + media_type, media_manager = get_media_type_and_manager(filename) - media_type, media_manager = get_media_type_and_manager(filename) + # create entry and save in database + entry = request.db.MediaEntry() + entry['_id'] = ObjectId() + entry['media_type'] = unicode(media_type) + entry['title'] = ( + unicode(request.POST['title']) + or unicode(splitext(filename)[0])) - # create entry and save in database - entry = request.db.MediaEntry() - entry['_id'] = ObjectId() - entry['media_type'] = unicode(media_type) - entry['title'] = ( - unicode(request.POST['title']) - or unicode(splitext(filename)[0])) + entry['description'] = unicode(request.POST.get('description')) + entry['description_html'] = cleaned_markdown_conversion( + entry['description']) - entry['description'] = unicode(request.POST.get('description')) - entry['description_html'] = cleaned_markdown_conversion( - entry['description']) - - entry['uploader'] = request.user['_id'] + entry['uploader'] = request.user['_id'] - # Process the user's folksonomy "tags" - entry['tags'] = convert_to_tag_list_of_dicts( - request.POST.get('tags')) + # Process the user's folksonomy "tags" + entry['tags'] = convert_to_tag_list_of_dicts( + request.POST.get('tags')) - # Generate a slug from the title - entry.generate_slug() + # Generate a slug from the title + entry.generate_slug() - # Now store generate the queueing related filename - queue_filepath = request.app.queue_store.get_unique_filepath( - ['media_entries', - unicode(entry._id), - secure_filename(filename)]) + # Now store generate the queueing related filename + queue_filepath = request.app.queue_store.get_unique_filepath( + ['media_entries', + unicode(entry._id), + secure_filename(filename)]) - # queue appropriately - queue_file = request.app.queue_store.get_file( - queue_filepath, 'wb') + # queue appropriately + queue_file = request.app.queue_store.get_file( + queue_filepath, 'wb') - with queue_file: - queue_file.write(request.POST['file'].file.read()) + with queue_file: + queue_file.write(request.POST['file'].file.read()) - # Add queued filename to the entry - entry['queued_media_file'] = queue_filepath + # Add queued filename to the entry + entry['queued_media_file'] = queue_filepath - # We generate this ourselves so we know what the taks id is for - # retrieval later. + # We generate this ourselves so we know what the taks id is for + # retrieval later. - # (If we got it off the task's auto-generation, there'd be - # a risk of a race condition when we'd save after sending - # off the task) - task_id = unicode(uuid.uuid4()) - entry['queued_task_id'] = task_id + # (If we got it off the task's auto-generation, there'd be + # a risk of a race condition when we'd save after sending + # off the task) + task_id = unicode(uuid.uuid4()) + entry['queued_task_id'] = task_id - # Save now so we have this data before kicking off processing - entry.save(validate=True) + # Save now so we have this data before kicking off processing + entry.save(validate=True) - # Pass off to processing - # - # (... don't change entry after this point to avoid race - # conditions with changes to the document via processing code) - process_media = registry.tasks[ProcessMedia.name] - try: - process_media.apply_async( - [unicode(entry._id)], {}, - task_id=task_id) - except BaseException as exc: - # The purpose of this section is because when running in "lazy" - # or always-eager-with-exceptions-propagated celery mode that - # the failure handling won't happen on Celery end. Since we - # expect a lot of users to run things in this way we have to - # capture stuff here. + # Pass off to processing # - # ... not completely the diaper pattern because the - # exception is re-raised :) - mark_entry_failed(entry._id, exc) - # re-raise the exception - raise - - add_message(request, SUCCESS, _('Woohoo! Submitted!')) - - return redirect(request, "mediagoblin.user_pages.user_home", - user=request.user['username']) + # (... don't change entry after this point to avoid race + # conditions with changes to the document via processing code) + process_media = registry.tasks[ProcessMedia.name] + try: + process_media.apply_async( + [unicode(entry._id)], {}, + task_id=task_id) + except BaseException as exc: + # The purpose of this section is because when running in "lazy" + # or always-eager-with-exceptions-propagated celery mode that + # the failure handling won't happen on Celery end. Since we + # expect a lot of users to run things in this way we have to + # capture stuff here. + # + # ... not completely the diaper pattern because the + # exception is re-raised :) + mark_entry_failed(entry._id, exc) + # re-raise the exception + raise + + add_message(request, SUCCESS, _('Woohoo! Submitted!')) + + return redirect(request, "mediagoblin.user_pages.user_home", + user=request.user['username']) + except InvalidFileType, exc: + submit_form.file.errors.append( + _(u'Invalid file type.')) return render_to_response( request, diff --git a/mediagoblin/tests/test_celery_setup.py b/mediagoblin/tests/test_celery_setup.py index 348a4357..19a9b899 100644 --- a/mediagoblin/tests/test_celery_setup.py +++ b/mediagoblin/tests/test_celery_setup.py @@ -50,7 +50,7 @@ def test_setup_celery_from_config(): assert isinstance(fake_celery_module.CELERYD_ETA_SCHEDULER_PRECISION, float) assert fake_celery_module.CELERY_RESULT_PERSISTENT is True assert fake_celery_module.CELERY_IMPORTS == [ - 'foo.bar.baz', 'this.is.an.import', 'mediagoblin.process_media'] + 'foo.bar.baz', 'this.is.an.import', 'mediagoblin.processing'] assert fake_celery_module.CELERY_MONGODB_BACKEND_SETTINGS == { 'database': 'mediagoblin'} assert fake_celery_module.CELERY_RESULT_BACKEND == 'mongodb' @@ -74,7 +74,7 @@ def test_setup_celery_from_config(): assert isinstance(fake_celery_module.CELERYD_ETA_SCHEDULER_PRECISION, float) assert fake_celery_module.CELERY_RESULT_PERSISTENT is False assert fake_celery_module.CELERY_IMPORTS == [ - 'baz.bar.foo', 'import.is.a.this', 'mediagoblin.process_media'] + 'baz.bar.foo', 'import.is.a.this', 'mediagoblin.processing'] assert fake_celery_module.CELERY_MONGODB_BACKEND_SETTINGS == { 'database': 'captain_lollerskates', 'host': 'mongodb.example.org', diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py index dec7118b..eea5747f 100644 --- a/mediagoblin/tests/test_submission.py +++ b/mediagoblin/tests/test_submission.py @@ -222,7 +222,7 @@ class TestSubmission: 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!'] + assert form.file.errors == [u'Invalid file type.'] # NOTE: The following 2 tests will ultimately fail, but they # *will* pass the initial form submission step. Instead, @@ -246,7 +246,7 @@ class TestSubmission: assert_equal(entry['state'], 'failed') assert_equal( entry['fail_error'], - u'mediagoblin.process_media.errors:BadMediaFail') + u'mediagoblin.processing:BadMediaFail') # Test non-supported file with .png extension # ------------------------------------------- @@ -266,4 +266,4 @@ class TestSubmission: assert_equal(entry['state'], 'failed') assert_equal( entry['fail_error'], - u'mediagoblin.process_media.errors:BadMediaFail') + u'mediagoblin.processing:BadMediaFail') -- cgit v1.2.3 From 8aeb6738774f6428312bd0889e2aaf4fc9445da0 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Tue, 22 Nov 2011 00:09:41 +0100 Subject: Video support is disabled by default, set enable_video to true to enable --- mediagoblin/config_spec.ini | 3 +++ mediagoblin/media_types/__init__.py | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index eef6f6e0..e5e059c9 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -50,6 +50,9 @@ allow_attachments = boolean(default=False) # Cookie stuff csrf_cookie_name = string(default='mediagoblin_csrftoken') +# Media types +enable_video = boolean(default=False) + [storage:publicstore] storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage") base_dir = string(default="%(here)s/user_dev/media/public") diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index 2d13f5a6..a2ea6bcb 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -17,6 +17,7 @@ import os import sys +from mediagoblin import mg_globals from mediagoblin.util import lazy_pass_to_ugettext as _ @@ -29,8 +30,10 @@ class InvalidFileType(Exception): # This should be more dynamic in the future. Perhaps put it in the .ini? # -- Joar MEDIA_TYPES = [ - 'mediagoblin.media_types.image', - 'mediagoblin.media_types.video'] + 'mediagoblin.media_types.image'] + +if mg_globals.app_config['enable_video']: + MEDIA_TYPES.append('mediagoblin.media_types.video') def get_media_types(): -- cgit v1.2.3 From d0ba62e2e773dbd3cc89bf6f446da45370652360 Mon Sep 17 00:00:00 2001 From: "Pablo J. Urbano Santos" Date: Tue, 22 Nov 2011 20:29:33 +0100 Subject: Fixes #597. Add a visible error when user tries to delete an image without cheking the "I'm sure" checkbox. --- mediagoblin/user_pages/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 25fd2ebb..2ccb453b 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -179,6 +179,9 @@ def media_confirm_delete(request, media): return redirect(request, "mediagoblin.user_pages.user_home", user=username) else: + messages.add_message( + request, messages.ERROR, + _("The file was not deleted because you didn't check that you were sure.")) return exc.HTTPFound( location=media.url_for_self(request.urlgen)) -- cgit v1.2.3 From 6506b1e22c70b55a73ee4cb391aebaf73db79ef9 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Tue, 22 Nov 2011 21:06:08 +0100 Subject: Fixes for video branch - Removed superfluous code from media_types.image - Updated lazy_pass_to_ugettext imports --- mediagoblin/media_types/__init__.py | 10 ++------ mediagoblin/media_types/image/processing.py | 36 ---------------------------- mediagoblin/media_types/video/transcoders.py | 4 ++-- mediagoblin/processing.py | 2 +- 4 files changed, 5 insertions(+), 47 deletions(-) diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index a2ea6bcb..f56fd942 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -18,7 +18,7 @@ import os import sys from mediagoblin import mg_globals -from mediagoblin.util import lazy_pass_to_ugettext as _ +from mediagoblin.tools.translate import lazy_pass_to_ugettext as _ class FileTypeNotSupported(Exception): @@ -49,13 +49,7 @@ def get_media_managers(): Generator that returns all available media managers ''' for media_type in get_media_types(): - try: - __import__(media_type) - except ImportError as e: - raise Exception( - _('ERROR: Could not import {media_type}: {exception}').format( - media_type=media_type, - exception=e)) + __import__(media_type) yield media_type, sys.modules[media_type].MEDIA_MANAGER diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py index 5e8e4e0a..2932c455 100644 --- a/mediagoblin/media_types/image/processing.py +++ b/mediagoblin/media_types/image/processing.py @@ -31,42 +31,6 @@ from mediagoblin.processing import BaseProcessingFail, \ # Media processing initial steps ################################ -class ProcessMedia(Task): - """ - Pass this entry off for processing. - """ - def run(self, media_id): - """ - Pass the media entry off to the appropriate processing function - (for now just process_image...) - """ - entry = mgg.database.MediaEntry.one( - {'_id': ObjectId(media_id)}) - - # Try to process, and handle expected errors. - try: - process_image(entry) - except BaseProcessingFail, exc: - mark_entry_failed(entry[u'_id'], exc) - return - - entry['state'] = u'processed' - entry.save() - - def on_failure(self, exc, task_id, args, kwargs, einfo): - """ - If the processing failed we should mark that in the database. - - Assuming that the exception raised is a subclass of BaseProcessingFail, - we can use that to get more information about the failure and store that - for conveying information to users about the failure, etc. - """ - entry_id = args[0] - mark_entry_failed(entry_id, exc) - - -process_media = registry.tasks[ProcessMedia.name] - def process_image(entry): """ diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index 493a837f..d7ed14ca 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -94,8 +94,8 @@ class VideoThumbnailer: self.videosink = gst.element_factory_make('fakesink', 'videosink') self.playbin.set_property('video-sink', self.videosink) - #self.audiosink = gst.element_factory_make('fakesink', 'audiosink') - #self.playbin.set_property('audio-sink', self.audiosink) + self.audiosink = gst.element_factory_make('fakesink', 'audiosink') + self.playbin.set_property('audio-sink', self.audiosink) self.bus = self.playbin.get_bus() self.bus.add_signal_watch() diff --git a/mediagoblin/processing.py b/mediagoblin/processing.py index 8738cbe2..89c4ac89 100644 --- a/mediagoblin/processing.py +++ b/mediagoblin/processing.py @@ -19,7 +19,7 @@ from celery.task import Task from mediagoblin.db.util import ObjectId from mediagoblin import mg_globals as mgg -from mediagoblin.util import lazy_pass_to_ugettext as _ +from mediagoblin.tools.translate import lazy_pass_to_ugettext as _ from mediagoblin.media_types import get_media_manager -- cgit v1.2.3 From 56bfd91ab45c5160bcd65ebe15f44b08f880ed72 Mon Sep 17 00:00:00 2001 From: "Pablo J. Urbano Santos" Date: Tue, 22 Nov 2011 21:07:09 +0100 Subject: Added a message noticing the user the image has been successfully deleted. --- mediagoblin/user_pages/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 2ccb453b..b28b68e1 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -175,13 +175,14 @@ def media_confirm_delete(request, media): delete_media_files(media) media.delete() + messages.add_message(request, messages.SUCCESS, _('You deleted the media.')) return redirect(request, "mediagoblin.user_pages.user_home", user=username) else: messages.add_message( request, messages.ERROR, - _("The file was not deleted because you didn't check that you were sure.")) + _("The media was not deleted because you didn't check that you were sure.")) return exc.HTTPFound( location=media.url_for_self(request.urlgen)) -- cgit v1.2.3 From ea33f63635ca0b57f0bc7eca6eb941a9ee99b596 Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 22 Nov 2011 21:48:56 +0100 Subject: Wrap long line. Nothing else. --- mediagoblin/user_pages/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index b28b68e1..f679be9c 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -175,7 +175,8 @@ def media_confirm_delete(request, media): delete_media_files(media) media.delete() - messages.add_message(request, messages.SUCCESS, _('You deleted the media.')) + messages.add_message( + request, messages.SUCCESS, _('You deleted the media.')) return redirect(request, "mediagoblin.user_pages.user_home", user=username) -- cgit v1.2.3 From 4d4e5b435b54fcf0920786a40e190c1748cc2ed1 Mon Sep 17 00:00:00 2001 From: Elrond Date: Fri, 18 Nov 2011 23:37:25 +0100 Subject: 652: Don't show empty field labels. If the label for a field is empty, don't show it at all. And don't translate it! --- mediagoblin/templates/mediagoblin/utils/wtforms.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html index 39dca7cc..cc30388f 100644 --- a/mediagoblin/templates/mediagoblin/utils/wtforms.html +++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html @@ -18,7 +18,9 @@ {# Generically render a field #} {% macro render_field_div(field) %} -

+ {% if field.label.text -%} +

+ {%- endif %}
{{ field }} {%- if field.errors -%} -- cgit v1.2.3 From 30188321531e1b0d3c78166498702bbd8c7dc2bc Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 21 Nov 2011 21:40:48 +0100 Subject: Rename MediaEntry.uploader() to .get_uploader() The .uploader() method conflicts with the uploader database field. As we're moving to .FIELD for db field access, this is a relevant conflict. So renaming .uploader() to .get_uploader() --- mediagoblin/db/models.py | 8 ++++---- mediagoblin/decorators.py | 2 +- mediagoblin/listings/views.py | 2 +- mediagoblin/templates/mediagoblin/edit/attachments.html | 2 +- mediagoblin/templates/mediagoblin/edit/edit.html | 2 +- mediagoblin/templates/mediagoblin/user_pages/media.html | 16 ++++++++-------- .../mediagoblin/user_pages/media_confirm_delete.html | 2 +- mediagoblin/user_pages/views.py | 4 ++-- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index f13a4457..265fe36d 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -263,7 +263,7 @@ class MediaEntry(Document): Use a slug if we have one, else use our '_id'. """ - uploader = self.uploader() + uploader = self.get_uploader() if self.get('slug'): return urlgen( @@ -286,7 +286,7 @@ class MediaEntry(Document): '_id', ASCENDING).limit(1) if cursor.count(): return urlgen('mediagoblin.user_pages.media_home', - user=self.uploader()['username'], + user=self.get_uploader()['username'], media=unicode(cursor[0]['slug'])) def url_to_next(self, urlgen): @@ -300,10 +300,10 @@ class MediaEntry(Document): if cursor.count(): return urlgen('mediagoblin.user_pages.media_home', - user=self.uploader()['username'], + user=self.get_uploader()['username'], media=unicode(cursor[0]['slug'])) - def uploader(self): + def get_uploader(self): return self.db.User.find_one({'_id': self['uploader']}) def get_fail_exception(self): diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index 8f7532ec..1cdce23a 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -58,7 +58,7 @@ def user_may_delete_media(controller): """ def wrapper(request, *args, **kwargs): uploader = request.db.MediaEntry.find_one( - {'_id': ObjectId(request.matchdict['media'])}).uploader() + {'_id': ObjectId(request.matchdict['media'])}).get_uploader() if not (request.user['is_admin'] or request.user._id == uploader._id): return exc.HTTPForbidden() diff --git a/mediagoblin/listings/views.py b/mediagoblin/listings/views.py index 12e539e7..5a09de43 100644 --- a/mediagoblin/listings/views.py +++ b/mediagoblin/listings/views.py @@ -86,7 +86,7 @@ def tag_atom_feed(request): feed.add(entry.get('title'), entry.get('description_html'), content_type='html', - author=entry.uploader()['username'], + author=entry.get_uploader()['username'], updated=entry.get('created'), url=entry.url_for_self(request.urlgen)) diff --git a/mediagoblin/templates/mediagoblin/edit/attachments.html b/mediagoblin/templates/mediagoblin/edit/attachments.html index 576642cf..6a5ab896 100644 --- a/mediagoblin/templates/mediagoblin/edit/attachments.html +++ b/mediagoblin/templates/mediagoblin/edit/attachments.html @@ -20,7 +20,7 @@ {% import "/mediagoblin/utils/wtforms.html" as wtforms_util %} {% block mediagoblin_content %}
diff --git a/mediagoblin/templates/mediagoblin/edit/edit.html b/mediagoblin/templates/mediagoblin/edit/edit.html index 73c2bada..aa46af3d 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit.html +++ b/mediagoblin/templates/mediagoblin/edit/edit.html @@ -22,7 +22,7 @@ {% block mediagoblin_content %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 7ef64c76..adbb66db 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -56,8 +56,8 @@ {% 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 -%} + user=media.get_uploader().username), + username=media.get_uploader().username -%} By {{ username }} on {{ date }} {%- endtrans %}

@@ -84,7 +84,7 @@ {% trans %}at{% endtrans %} {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }} @@ -94,7 +94,7 @@ {% if request.user %} {{ wtforms_util.render_divs(comment_form) }}
@@ -106,7 +106,7 @@ {{ render_pagination(request, pagination, request.urlgen('mediagoblin.user_pages.media_home', - user = media.uploader().username, + user = media.get_uploader().username, media = media._id)) }}
{% endif %} @@ -118,13 +118,13 @@ request.user['is_admin'] %}

{% set edit_url = request.urlgen('mediagoblin.edit.edit_media', - user= media.uploader().username, + user= media.get_uploader().username, media= media._id) %} {% trans %}Edit{% endtrans %}

{% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', - user= media.uploader().username, + user= media.get_uploader().username, media= media._id) %} {% trans %}Delete{% endtrans %}

@@ -148,7 +148,7 @@ or request.user['is_admin']) %}

Add attachment

{% endif %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html index c3a9d622..058351a5 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html @@ -22,7 +22,7 @@ {% block mediagoblin_content %}
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index f679be9c..61cae775 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -169,7 +169,7 @@ def media_confirm_delete(request, media): if request.method == 'POST' and form.validate(): if form.confirm.data is True: - username = media.uploader()['username'] + username = media.get_uploader()['username'] # Delete all files on the public storage delete_media_files(media) @@ -188,7 +188,7 @@ def media_confirm_delete(request, media): location=media.url_for_self(request.urlgen)) if ((request.user[u'is_admin'] and - request.user._id != media.uploader()._id)): + request.user._id != media.get_uploader()._id)): messages.add_message( request, messages.WARNING, _("You are about to delete another user's media. " -- cgit v1.2.3 From cfa96da734e633856282fcefb04e1fb231d85053 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 25 Nov 2011 11:41:24 -0600 Subject: Load multiple media types based on the media_types section of the config file --- mediagoblin.ini | 3 +++ mediagoblin/config_spec.ini | 5 +++-- mediagoblin/media_types/__init__.py | 14 +++----------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/mediagoblin.ini b/mediagoblin.ini index 728ab2f2..dbde6e51 100644 --- a/mediagoblin.ini +++ b/mediagoblin.ini @@ -11,6 +11,9 @@ email_debug_mode = true # Set to false to disable registrations allow_registration = true +## Uncomment this to turn on video or enable other media types +# media_types = mediagoblin.media_types.image, mediagoblin.media_types.video + ## Uncomment this to put some user-overriding templates here #local_templates = %(here)s/user_dev/templates/ diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index e5e059c9..a17e30f0 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -2,16 +2,17 @@ # HTML title of the pages html_title = string(default="GNU MediaGoblin") +# Enabled media types +media_types = string_list(default=list("mediagoblin.media_types.image")) + # database stuff db_host = string() db_name = string(default="mediagoblin") db_port = integer() - # Where temporary files used in processing and etc are kept workbench_path = string(default="%(here)s/user_dev/media/workbench") - # Where mediagoblin-builtin static assets are kept direct_remote_path = string(default="/mgoblin_static/") diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index f56fd942..61786562 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -27,20 +27,12 @@ class FileTypeNotSupported(Exception): class InvalidFileType(Exception): pass -# This should be more dynamic in the future. Perhaps put it in the .ini? -# -- Joar -MEDIA_TYPES = [ - 'mediagoblin.media_types.image'] - -if mg_globals.app_config['enable_video']: - MEDIA_TYPES.append('mediagoblin.media_types.video') - def get_media_types(): - ''' + """ Generator that returns the available media types - ''' - for media_type in MEDIA_TYPES: + """ + for media_type in mg_globals.app_config['media_types']: yield media_type -- cgit v1.2.3 From f47a7a8c92936dfedd73716a69ba3f0978481aca Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 25 Nov 2011 11:42:03 -0600 Subject: Remove old enable_video config option --- mediagoblin/config_spec.ini | 2 -- 1 file changed, 2 deletions(-) diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index a17e30f0..c057f432 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -51,8 +51,6 @@ allow_attachments = boolean(default=False) # Cookie stuff csrf_cookie_name = string(default='mediagoblin_csrftoken') -# Media types -enable_video = boolean(default=False) [storage:publicstore] storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage") -- cgit v1.2.3 From 4da6efb45956321d831339da0fcdbbb6553c6846 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 25 Nov 2011 11:43:34 -0600 Subject: Removing these video javascript files, which are currently unused --- mediagoblin/templates/mediagoblin/base.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 3dd9c8ff..29639026 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -32,11 +32,6 @@ href="{{ request.staticdirect('/css/video-js.css') }}"/> - - - {% block mediagoblin_head %} {% endblock mediagoblin_head %} -- cgit v1.2.3 From ce5ae8da19707019cd62d42533e591d71071f4fe Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 25 Nov 2011 12:13:56 -0600 Subject: Rename MediaGoblin middleware to meddleware to avoid confusion w/ wsgi middleware hehehehehe, "meddleware" --- mediagoblin/app.py | 16 ++--- mediagoblin/meddleware/__init__.py | 20 ++++++ mediagoblin/meddleware/csrf.py | 132 +++++++++++++++++++++++++++++++++++++ mediagoblin/meddleware/noop.py | 27 ++++++++ mediagoblin/middleware/__init__.py | 20 ------ mediagoblin/middleware/csrf.py | 132 ------------------------------------- mediagoblin/middleware/noop.py | 27 -------- mediagoblin/tests/tools.py | 10 +-- mediagoblin/tools/template.py | 2 +- 9 files changed, 193 insertions(+), 193 deletions(-) create mode 100644 mediagoblin/meddleware/__init__.py create mode 100644 mediagoblin/meddleware/csrf.py create mode 100644 mediagoblin/meddleware/noop.py delete mode 100644 mediagoblin/middleware/__init__.py delete mode 100644 mediagoblin/middleware/csrf.py delete mode 100644 mediagoblin/middleware/noop.py diff --git a/mediagoblin/app.py b/mediagoblin/app.py index ce4b0bec..aafadd97 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -20,7 +20,7 @@ import urllib import routes from webob import Request, exc -from mediagoblin import routing, middleware +from mediagoblin import routing, meddleware from mediagoblin.tools import common, translate, template from mediagoblin.tools.response import render_404 from mediagoblin.tools import request as mg_request @@ -100,15 +100,15 @@ class MediaGoblinApp(object): # matters in always eager mode :) setup_workbench() - # instantiate application middleware - self.middleware = [common.import_component(m)(self) - for m in middleware.ENABLED_MIDDLEWARE] + # instantiate application meddleware + self.meddleware = [common.import_component(m)(self) + for m in meddleware.ENABLED_MEDDLEWARE] def __call__(self, environ, start_response): request = Request(environ) - # pass the request through our middleware classes - for m in self.middleware: + # pass the request through our meddleware classes + for m in self.meddleware: response = m.process_request(request) if response is not None: return response(environ, start_response) @@ -169,8 +169,8 @@ class MediaGoblinApp(object): # get the response from the controller response = controller(request) - # pass the response through the middleware - for m in self.middleware[::-1]: + # pass the response through the meddleware + for m in self.meddleware[::-1]: m.process_response(request, response) return response(environ, start_response) diff --git a/mediagoblin/meddleware/__init__.py b/mediagoblin/meddleware/__init__.py new file mode 100644 index 00000000..3addc937 --- /dev/null +++ b/mediagoblin/meddleware/__init__.py @@ -0,0 +1,20 @@ +# 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 . + +ENABLED_MEDDLEWARE = ( + 'mediagoblin.meddleware.noop:NoOpMeddleware', + 'mediagoblin.meddleware.csrf:CsrfMeddleware', + ) diff --git a/mediagoblin/meddleware/csrf.py b/mediagoblin/meddleware/csrf.py new file mode 100644 index 00000000..051afe58 --- /dev/null +++ b/mediagoblin/meddleware/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 . + +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 CsrfMeddleware(object): + """CSRF Protection Meddleware + + 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/meddleware/noop.py b/mediagoblin/meddleware/noop.py new file mode 100644 index 00000000..d11a5b9e --- /dev/null +++ b/mediagoblin/meddleware/noop.py @@ -0,0 +1,27 @@ +# 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 . + + +class NoOpMeddleware(object): + + def __init__(self, mg_app): + self.app = mg_app + + def process_request(self, request): + pass + + def process_response(self, request, response): + pass diff --git a/mediagoblin/middleware/__init__.py b/mediagoblin/middleware/__init__.py deleted file mode 100644 index 05325ee5..00000000 --- a/mediagoblin/middleware/__init__.py +++ /dev/null @@ -1,20 +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 . - -ENABLED_MIDDLEWARE = ( - 'mediagoblin.middleware.noop:NoOpMiddleware', - 'mediagoblin.middleware.csrf:CsrfMiddleware', - ) diff --git a/mediagoblin/middleware/csrf.py b/mediagoblin/middleware/csrf.py deleted file mode 100644 index 8275c18e..00000000 --- a/mediagoblin/middleware/csrf.py +++ /dev/null @@ -1,132 +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 . - -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/middleware/noop.py b/mediagoblin/middleware/noop.py deleted file mode 100644 index 820b5d9e..00000000 --- a/mediagoblin/middleware/noop.py +++ /dev/null @@ -1,27 +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 . - - -class NoOpMiddleware(object): - - def __init__(self, mg_app): - self.app = mg_app - - def process_request(self, request): - pass - - def process_response(self, request, response): - pass diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py index 420d9ba8..1a26c6e9 100644 --- a/mediagoblin/tests/tools.py +++ b/mediagoblin/tests/tools.py @@ -50,9 +50,9 @@ $ CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_tests ./bin/nosetests""" class BadCeleryEnviron(Exception): pass -class TestingMiddleware(object): +class TestingMeddleware(object): """ - Middleware for the Unit tests + Meddleware for the Unit tests It might make sense to perform some tests on all requests/responses. Or prepare them in a special @@ -60,7 +60,7 @@ class TestingMiddleware(object): 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 + meddleware list, which means: requests are handed here first, responses last. So this wraps up the "normal" app. @@ -149,11 +149,11 @@ def get_test_app(dump_old_app=True): test_app = loadapp( 'config:' + TEST_SERVER_CONFIG) - # Insert the TestingMiddleware, which can do some + # Insert the TestingMeddleware, 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)) + mg_globals.app.meddleware.insert(0, TestingMeddleware(mg_globals.app)) app = TestApp(test_app) MGOBLIN_APP = app diff --git a/mediagoblin/tools/template.py b/mediagoblin/tools/template.py index 0986761b..f48b7c2e 100644 --- a/mediagoblin/tools/template.py +++ b/mediagoblin/tools/template.py @@ -21,7 +21,7 @@ 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 +from mediagoblin.meddleware.csrf import render_csrf_form_token SETUP_JINJA_ENVS = {} -- cgit v1.2.3 From 1b7662012f4f0827d01cc8747ce710b3e4dc6b81 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 25 Nov 2011 12:33:34 -0600 Subject: Uncommenting requires=['gst'] till I figure out why Joar added it there :) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c3c2f86f..ec672dd2 100644 --- a/setup.py +++ b/setup.py @@ -66,7 +66,7 @@ setup( ## their package managers. # 'lxml', ], - requires=['gst'], + # requires=['gst'], test_suite='nose.collector', entry_points="""\ [console_scripts] -- cgit v1.2.3 From 56dc1c9d3eb73b86bf8e165ffc79ad4929239603 Mon Sep 17 00:00:00 2001 From: Elrond Date: Fri, 25 Nov 2011 22:16:18 +0100 Subject: Add base class for Meddleware Created a BaseMeddleware which all Meddleware should derive from. This is not strictly needed, but will greatly help. The base class has the common __init__ of all the other Meddlwares and fall backs for all hooks. That way a new Meddlware only needs to override what it actually wants to implement. --- mediagoblin/meddleware/__init__.py | 12 ++++++++++++ mediagoblin/meddleware/csrf.py | 6 ++---- mediagoblin/meddleware/noop.py | 5 ++--- mediagoblin/tests/tools.py | 9 ++------- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/mediagoblin/meddleware/__init__.py b/mediagoblin/meddleware/__init__.py index 3addc937..729a020d 100644 --- a/mediagoblin/meddleware/__init__.py +++ b/mediagoblin/meddleware/__init__.py @@ -18,3 +18,15 @@ ENABLED_MEDDLEWARE = ( 'mediagoblin.meddleware.noop:NoOpMeddleware', 'mediagoblin.meddleware.csrf:CsrfMeddleware', ) + + +class BaseMeddleware(object): + + def __init__(self, mg_app): + self.app = mg_app + + def process_request(self, request): + pass + + def process_response(self, request, response): + pass diff --git a/mediagoblin/meddleware/csrf.py b/mediagoblin/meddleware/csrf.py index 051afe58..ca2eca5f 100644 --- a/mediagoblin/meddleware/csrf.py +++ b/mediagoblin/meddleware/csrf.py @@ -21,6 +21,7 @@ from webob.exc import HTTPForbidden from wtforms import Form, HiddenField, validators from mediagoblin import mg_globals +from mediagoblin.meddleware import BaseMeddleware # Use the system (hardware-based) random number generator if it exists. # -- this optimization is lifted from Django @@ -47,7 +48,7 @@ def render_csrf_form_token(request): return form.csrf_token -class CsrfMeddleware(object): +class CsrfMeddleware(BaseMeddleware): """CSRF Protection Meddleware Adds a CSRF Cookie to responses and verifies that it is present @@ -57,9 +58,6 @@ class CsrfMeddleware(object): 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. diff --git a/mediagoblin/meddleware/noop.py b/mediagoblin/meddleware/noop.py index d11a5b9e..b43053de 100644 --- a/mediagoblin/meddleware/noop.py +++ b/mediagoblin/meddleware/noop.py @@ -15,11 +15,10 @@ # along with this program. If not, see . -class NoOpMeddleware(object): +from mediagoblin.meddleware import BaseMeddleware - def __init__(self, mg_app): - self.app = mg_app +class NoOpMeddleware(BaseMeddleware): def process_request(self, request): pass diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py index 1a26c6e9..01813e96 100644 --- a/mediagoblin/tests/tools.py +++ b/mediagoblin/tests/tools.py @@ -26,6 +26,7 @@ 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 +from mediagoblin.meddleware import BaseMeddleware MEDIAGOBLIN_TEST_DB_NAME = u'__mediagoblin_tests__' @@ -50,7 +51,7 @@ $ CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_tests ./bin/nosetests""" class BadCeleryEnviron(Exception): pass -class TestingMeddleware(object): +class TestingMeddleware(BaseMeddleware): """ Meddleware for the Unit tests @@ -69,12 +70,6 @@ class TestingMeddleware(object): 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": -- cgit v1.2.3 From 5568a014195fa9f39021033a6ba2706125bb13ed Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 23 Oct 2011 23:29:15 +0200 Subject: Use setup_global_and_app_config in gmg's migrate. Instead of using read_mediagoblin_config, forgetting to check the validation report and then finding the main app section by hand, just use setup_global_and_app_config. --- mediagoblin/gmg_commands/migrate.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mediagoblin/gmg_commands/migrate.py b/mediagoblin/gmg_commands/migrate.py index beea109d..bd3bcb20 100644 --- a/mediagoblin/gmg_commands/migrate.py +++ b/mediagoblin/gmg_commands/migrate.py @@ -18,7 +18,7 @@ import sys from mediagoblin.db import util as db_util from mediagoblin.db.open import setup_connection_and_db_from_config -from mediagoblin.init.config import read_mediagoblin_config +from mediagoblin.init import setup_global_and_app_config # This MUST be imported so as to set up the appropriate migrations! from mediagoblin.db import migrations @@ -41,9 +41,9 @@ def _print_finished_migration(migration_number, migration_func): def migrate(args): - config, validation_result = read_mediagoblin_config(args.conf_file) + global_config, app_config = setup_global_and_app_config(args.conf_file) connection, db = setup_connection_and_db_from_config( - config['mediagoblin'], use_pymongo=True) + app_config, use_pymongo=True) migration_manager = db_util.MigrationManager(db) # Clear old indexes -- cgit v1.2.3 From 91cf67385a78a59af7874df327b96f7ea0b4259b Mon Sep 17 00:00:00 2001 From: Nathan Yergler Date: Sat, 26 Nov 2011 14:34:36 -0800 Subject: Issue 680: Dispatch meddleware request processing post-routing --- mediagoblin/app.py | 13 +++++++------ mediagoblin/meddleware/__init__.py | 2 +- mediagoblin/meddleware/csrf.py | 2 +- mediagoblin/meddleware/noop.py | 3 ++- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/mediagoblin/app.py b/mediagoblin/app.py index aafadd97..7f087ed9 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -107,12 +107,6 @@ class MediaGoblinApp(object): def __call__(self, environ, start_response): request = Request(environ) - # pass the request through our meddleware classes - for m in self.meddleware: - response = m.process_request(request) - if response is not None: - return response(environ, start_response) - ## Routing / controller loading stuff path_info = request.path_info route_match = self.routing.match(path_info) @@ -164,6 +158,13 @@ class MediaGoblinApp(object): return render_404(request)(environ, start_response) controller = common.import_component(route_match['controller']) + + # pass the request through our meddleware classes + for m in self.meddleware: + response = m.process_request(request, controller) + if response is not None: + return response(environ, start_response) + request.start_response = start_response # get the response from the controller diff --git a/mediagoblin/meddleware/__init__.py b/mediagoblin/meddleware/__init__.py index 729a020d..7ba70d87 100644 --- a/mediagoblin/meddleware/__init__.py +++ b/mediagoblin/meddleware/__init__.py @@ -25,7 +25,7 @@ class BaseMeddleware(object): def __init__(self, mg_app): self.app = mg_app - def process_request(self, request): + def process_request(self, request, controller): pass def process_response(self, request, response): diff --git a/mediagoblin/meddleware/csrf.py b/mediagoblin/meddleware/csrf.py index ca2eca5f..961fa7a6 100644 --- a/mediagoblin/meddleware/csrf.py +++ b/mediagoblin/meddleware/csrf.py @@ -58,7 +58,7 @@ class CsrfMeddleware(BaseMeddleware): CSRF_KEYLEN = 64 SAFE_HTTP_METHODS = ("GET", "HEAD", "OPTIONS", "TRACE") - def process_request(self, request): + def process_request(self, request, controller): """For non-safe requests, confirm that the tokens are present and match. """ diff --git a/mediagoblin/meddleware/noop.py b/mediagoblin/meddleware/noop.py index b43053de..f5376494 100644 --- a/mediagoblin/meddleware/noop.py +++ b/mediagoblin/meddleware/noop.py @@ -19,7 +19,8 @@ from mediagoblin.meddleware import BaseMeddleware class NoOpMeddleware(BaseMeddleware): - def process_request(self, request): + + def process_request(self, request, controller): pass def process_response(self, request, response): -- cgit v1.2.3 From ca9ebfe2e05c83248d647b442ff29a9758a6a05c Mon Sep 17 00:00:00 2001 From: Nathan Yergler Date: Sat, 26 Nov 2011 15:32:35 -0800 Subject: Issue 680 Allow decorating views to prevent CSRF protection. --- mediagoblin/meddleware/csrf.py | 15 ++++++++++++--- mediagoblin/tests/test_csrf_middleware.py | 21 ++++++++++++++++++++- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/mediagoblin/meddleware/csrf.py b/mediagoblin/meddleware/csrf.py index 961fa7a6..16541bee 100644 --- a/mediagoblin/meddleware/csrf.py +++ b/mediagoblin/meddleware/csrf.py @@ -31,6 +31,13 @@ else: getrandbits = random.getrandbits +def csrf_exempt(func): + """Decorate a Controller to exempt it from CSRF protection.""" + + func.csrf_enabled = False + return func + + class CsrfForm(Form): """Simple form to handle rendering a CSRF token and confirming it is included in the POST.""" @@ -75,9 +82,11 @@ class CsrfMeddleware(BaseMeddleware): # 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): + if (getattr(controller, 'csrf_enabled', True) and + 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) diff --git a/mediagoblin/tests/test_csrf_middleware.py b/mediagoblin/tests/test_csrf_middleware.py index 691f10b9..c8fca23a 100644 --- a/mediagoblin/tests/test_csrf_middleware.py +++ b/mediagoblin/tests/test_csrf_middleware.py @@ -27,7 +27,7 @@ from mediagoblin import mg_globals 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/') @@ -69,3 +69,22 @@ def test_csrf_token_must_match(test_app): mg_globals.app_config['csrf_cookie_name'])}, extra_environ={'gmg.verify_csrf': True}).\ status_int == 200 + +@setup_fresh_app +def test_csrf_exempt(test_app): + + # monkey with the views to decorate a known endpoint + import mediagoblin.auth.views + from mediagoblin.meddleware.csrf import csrf_exempt + + mediagoblin.auth.views.login = csrf_exempt( + mediagoblin.auth.views.login + ) + + # construct a request with no cookie or form token + assert test_app.post('/auth/login/', + extra_environ={'gmg.verify_csrf': True}, + expect_errors=False).status_int == 200 + + # restore the CSRF protection in case other tests expect it + mediagoblin.auth.views.login.csrf_enabled = True -- cgit v1.2.3 From 3038ba87e4fdc5612f57affeedb643a614e0c9a2 Mon Sep 17 00:00:00 2001 From: Manuel Urbano Santos Date: Sun, 27 Nov 2011 13:49:47 +0100 Subject: * Bug #671: Tags list on Edit page is not seperated by spaces and hard to read : Make 'media_tags_as_string' function put a space after each comma. * Feature #678: Drop custom delimiters in tags : I declare a constant in the begining of text.py file. --- mediagoblin/config_spec.ini | 1 - mediagoblin/tools/text.py | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index eef6f6e0..544f0321 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -27,7 +27,6 @@ email_smtp_pass = string(default=None) allow_registration = boolean(default=True) # tag parsing -tags_delimiter = string(default=",") tags_max_length = integer(default=50) # Whether comments are ascending or descending diff --git a/mediagoblin/tools/text.py b/mediagoblin/tools/text.py index be1adb00..d576224d 100644 --- a/mediagoblin/tools/text.py +++ b/mediagoblin/tools/text.py @@ -43,6 +43,7 @@ HTML_CLEANER = Cleaner( host_whitelist=(), whitelist_tags=set([])) +TAGS_DELIMITER=','; def clean_html(html): # clean_html barfs on an empty string @@ -67,7 +68,7 @@ def convert_to_tag_list_of_dicts(tag_string): # Split the tag string into a list of tags for tag in stripped_tag_string.split( - mg_globals.app_config['tags_delimiter']): + TAGS_DELIMITER): # Ignore empty or duplicate tags if tag.strip() and tag.strip() not in [t['name'] for t in taglist]: @@ -85,7 +86,7 @@ def media_tags_as_string(media_entry_tags): """ media_tag_string = '' if media_entry_tags: - media_tag_string = mg_globals.app_config['tags_delimiter'].join( + media_tag_string = (TAGS_DELIMITER+u' ').join( [tag['name'] for tag in media_entry_tags]) return media_tag_string -- cgit v1.2.3 From d5bb51f9d4871d8b758875fb18be5d8a9fbdb260 Mon Sep 17 00:00:00 2001 From: Manuel Urbano Santos Date: Sun, 27 Nov 2011 13:55:07 +0100 Subject: * Feature #678: Drop custom delimiters in tags * Eliminate the definition of the tag delimiter for tests. * Remove a test that was related to custom tags delimiter. * Bug #671: Tags list on Edit page is not seperated by spaces and hard to read * Modify a test to include this space. --- mediagoblin/tests/test_mgoblin_app.ini | 1 - mediagoblin/tests/test_tags.py | 9 +-------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini index f979e810..2525a4f9 100644 --- a/mediagoblin/tests/test_mgoblin_app.ini +++ b/mediagoblin/tests/test_mgoblin_app.ini @@ -5,7 +5,6 @@ email_debug_mode = true db_name = __mediagoblin_tests__ # tag parsing -tags_delimiter = "," tags_max_length = 50 # Celery shouldn't be set up by the application as it's setup via diff --git a/mediagoblin/tests/test_tags.py b/mediagoblin/tests/test_tags.py index a05831c9..583c1a55 100644 --- a/mediagoblin/tests/test_tags.py +++ b/mediagoblin/tests/test_tags.py @@ -39,11 +39,4 @@ def test_list_of_dicts_conversion(test_app): # Make sure converting the list of dicts to a string works 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 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'}] + u'yin, yang' -- cgit v1.2.3 From 9382221fe2d3e69b7900cfb7461abfdb443b4d10 Mon Sep 17 00:00:00 2001 From: Manuel Urbano Santos Date: Sun, 27 Nov 2011 14:31:20 +0100 Subject: Fix the text "Seperate tags by commas and spaces" since spaces are not used to seperate anymore. --- mediagoblin/edit/forms.py | 2 +- mediagoblin/submit/forms.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index 93934be7..dd339e08 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -28,7 +28,7 @@ class EditForm(wtforms.Form): _('Tags'), [tag_length_validator], description=_( - "Seperate tags by commas or spaces.")) + "Seperate tags by commas.")) slug = wtforms.TextField( _('Slug'), [wtforms.validators.Required(message=_("The slug can't be empty"))], diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py index 48a21f02..ad420771 100644 --- a/mediagoblin/submit/forms.py +++ b/mediagoblin/submit/forms.py @@ -32,4 +32,4 @@ class SubmitStartForm(wtforms.Form): _('Tags'), [tag_length_validator], description=_( - "Seperate tags by commas or spaces.")) + "Seperate tags by commas.")) -- cgit v1.2.3 From 19e2668b77427a1157984480231023661792fca8 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 27 Nov 2011 15:31:42 -0600 Subject: Updating translations --- mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po | 268 ++++++++++--------- mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po | 290 +++++++++++--------- mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po | 310 ++++++++++++---------- mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po | 234 ++++++++-------- mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po | 278 ++++++++++--------- mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po | 278 ++++++++++--------- mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po | 280 ++++++++++--------- mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po | 246 +++++++++-------- mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po | 272 ++++++++++--------- mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po | 254 ++++++++++-------- mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po | 256 ++++++++++-------- mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po | 282 +++++++++++--------- mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po | 278 ++++++++++--------- mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po | 279 ++++++++++--------- mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po | 290 +++++++++++--------- mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po | 280 ++++++++++--------- mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po | 271 ++++++++++--------- mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po | 246 +++++++++-------- mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po | 282 ++++++++++---------- mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po | 248 +++++++++-------- mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po | 275 ++++++++++--------- 21 files changed, 3125 insertions(+), 2572 deletions(-) diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po index 548e971f..40e8b1cd 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -21,6 +21,10 @@ msgstr "" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "" + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "اسم المستخدم" @@ -54,8 +58,8 @@ 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 "عفوًا، هذا العنوان البريدي مستخدم." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -69,11 +73,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "مفتاح التحقق أو معرف المستخدم خاطئ" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "أعدنا إرسال رسالة التحقق." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -89,43 +101,63 @@ msgstr "العنوان" msgid "Tags" msgstr "الوسوم" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "المسار" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "لا يمكن ترك المسار فارغًا" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" "الجزء الذي يمثل عنوان الملف في المسار. لا حاجة إلى تغيير محتوى هذه الخانة " "عادةً." -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "السيرة" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "الموقع الإلكتروني" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "يوجد ملف آخر بهذا المسار لدى هذى المستخدم." -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "أنت تحرّر وسائط مستخدم آخر. كن حذرًا أثناء العملية." -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 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." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" msgstr "" #: mediagoblin/submit/forms.py:25 @@ -136,18 +168,18 @@ msgstr "الملف" msgid "Description of this work" msgstr "وصف هذا العمل." -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 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 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "يا سلام! نُشرَت!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "ويحي!" @@ -167,29 +199,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "صورة قزم مرتبك" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "غنو ميدياغوبلن" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "شعار ميدياغوبلن" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "أرسل وسائط" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "أكّد بريدك" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "لِج" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -200,61 +232,32 @@ 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 GNU 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 "مشروع يحاول جعل عالمنا أفضل عن طريق اللامركزية (قريبًا!)." +msgid "Hi there, welcome to this MediaGoblin site!" +msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:33 -msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"جاهز للتمدد. (سيُضاف دعم أنساق كثيرة من الوسائط قريبًا، كما سندعم الفيديو!)." -#: mediagoblin/templates/mediagoblin/root.html:34 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"أنشئ حسابًا مجانيًا\n" -" أو\n" -" ركّب ميدياغوبلن على خادومك الخاص" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "أحدث الوسائط" @@ -262,9 +265,13 @@ msgstr "أحدث الوسائط" 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/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -300,22 +307,18 @@ msgstr "" msgid "Logging in failed!" msgstr "فشل الولوج!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "ألا تملك حسابًا بعد؟" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "أنشئ حسابًا هنا!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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 "أنشئ حسابًا!" @@ -361,9 +364,15 @@ msgstr "احفظ التغييرات" msgid "Editing %(username)s's profile" msgstr "تحرير ملف %(username)s الشخصي" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "الوسائط الموسومة ب‍" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -373,16 +382,16 @@ msgstr "انشر وسائطك" msgid "Submit" msgstr "أرسل" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "وسائط %(username)s" -#: 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?" @@ -413,35 +422,45 @@ msgstr "لا توجد وسائط تحت المعالجة" msgid "These uploads failed to process:" msgstr "فشلت معالجة هذه الملفات:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "ملف %(username)s الشخصي" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "عذرًا، تعذر العثور على مستخدم بهذا الاسم." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "يجب التحقق من البريد الإلكتروني" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "أوشكنا على الانتهاء! ما زال حسابك بحاجة إلى التفعيل." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "إن لم تصل." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "أعد إرسال رسالة التحقق" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can الولوج وإعادة إرسالها." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "ملف %(username)s الشخصي" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "حرِّر الملف الشخصي" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "لم يعبئ هذا العضو بيانات ملفه بعد." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "أظهِر كل وسائط %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "أضف وسائط" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "لا يبدو أنه توجد أي وسائط هنا حتى الآن..." @@ -503,6 +517,14 @@ msgstr "الأحدث" msgid "Older" msgstr "الأقدم" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "علِّق" @@ -511,15 +533,23 @@ msgstr "علِّق" msgid "I am sure I want to delete this" msgstr "أنا متأكد من رغبتي بحذف هذا العمل" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "أنت على وشك حذف وسائط مستخدم آخر. كن حذرًا أثناء العملية." diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po index e2cd8342..f07ab2d6 100644 --- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PROJECT project. # # Translators: +# Al fred , 2011. # , 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" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,6 +20,10 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Aquest tipus de fitxer no és vàlid." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Nom d'usuari" @@ -52,8 +57,8 @@ 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." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -68,11 +73,19 @@ 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 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Torna'm a enviar el correu de verificació" -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -86,42 +99,62 @@ msgstr "Títol" msgid "Tags" msgstr "Etiquetes" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Biografia" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Lloc web" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 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 +#: mediagoblin/edit/views.py:156 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/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -131,18 +164,18 @@ msgstr "Fitxer" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 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 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Visca! S'ha enviat!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Ups!" @@ -161,31 +194,31 @@ 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 "GNU MediaGoblin" +msgstr "Imatge de la pantalla 404, el goblin no sap què fer..." -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "Logo de mediagoblin" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 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:65 +msgid "Verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Entra" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -196,66 +229,32 @@ 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 GNU project, " -"after all.)" +msgid "Hi there, welcome to this MediaGoblin site!" 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!)" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." 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 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Desenvolupat per persones com vostè. ( Podeu ajudar a millorar " -"aquest programari! )" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "" @@ -263,8 +262,12 @@ msgstr "" msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 @@ -294,22 +297,18 @@ msgstr "" msgid "Logging in failed!" msgstr "Inici de sessió ha fallat!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Encara no teniu un compte?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Creeu-ne un aquí!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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!" @@ -355,9 +354,15 @@ msgstr "Desa els canvis" msgid "Editing %(username)s's profile" msgstr "" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Etiquetat amb:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -367,16 +372,16 @@ msgstr "Envieu els vostres fitxers" msgid "Submit" msgstr "Envia" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "%(username)s'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?" @@ -397,7 +402,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 msgid "Media in-processing" -msgstr "" +msgstr "S'està processant el fitxer" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46 msgid "No media in-processing" @@ -405,37 +410,49 @@ msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 msgid "These uploads failed to process:" +msgstr "No s'han pogut penjar els següents fitxers:" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Lamentablement no s'ha trobat l'usuari que cercàveu." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" -msgstr "" +msgstr "Cal que verifiqueu l'adreça electrònica" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." -msgstr "" +msgstr "Gairebé esteu! Tan sols falta que activeu el vostre compte" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" -msgstr "" +msgstr "Per si no hi fos:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Torna'm a enviar el correu de verificació" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." msgstr "" +"Algú ja ha registrat un compte amb aquest nom d'usuari, però encara l'ha " +"d'activar." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can entrar 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Edita el perfil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." -msgstr "" +msgstr "Aquest usuari encara no ha escrit res al seu perfil." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" -msgstr "" +msgstr "Tots els fitxers" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "" #: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 msgid "feed icon" -msgstr "" +msgstr "Icona RSS" #: mediagoblin/templates/mediagoblin/utils/feed_link.html:23 msgid "Atom feed" @@ -497,6 +509,14 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Comentari" @@ -505,15 +525,23 @@ msgstr "Comentari" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index 5c4ef0d0..f5907eda 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po @@ -6,6 +6,7 @@ # , 2011. # , 2011. # Elrond , 2011. +# , 2011. # Jan-Christoph Borchardt , 2011. # , 2011. # , 2011. @@ -15,9 +16,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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 15:18+0000\n" -"Last-Translator: piratenpanda \n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"Last-Translator: cwebber \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" @@ -26,6 +27,10 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Benutzername" @@ -48,43 +53,52 @@ msgstr "Hier nochmal eintragen, um Tippfehler zu verhindern." #: mediagoblin/auth/forms.py:42 msgid "Email address" -msgstr "Email-Adresse" +msgstr "E-Mail-Adresse" #: mediagoblin/auth/views.py:55 msgid "Sorry, registration is disabled on this instance." -msgstr "Registrierung ist auf dieser Instanz leider deaktiviert." +msgstr "Das Registrieren ist auf dieser Instanz leider deaktiviert." #: 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:77 -msgid "Sorry, that email address has already been taken." -msgstr "Tut und Leid, aber diese Email-Adresse wird bereits verwendet." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" -"Deine Email-Adresse wurde bestätigt. Du kannst dich nun anmelden, Dein " +"Deine E-Mail-Adresse wurde bestätigt. Du kannst dich nun anmelden, Dein " "Profil bearbeiten und Bilder hochladen!" #: mediagoblin/auth/views.py:185 msgid "The verification key or user id is incorrect" -msgstr "Der Bestätigungssschlüssel oder die Nutzernummer ist falsch." +msgstr "Der Bestätigungsschlüssel oder die Nutzernummer ist falsch." + +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." -msgstr "Bestätigungs-Email wurde erneut versandt." +msgstr "Bestätigungs-E-Mail wurde erneut versandt." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 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." +"E-Mail zur Wiederherstellung des Passworts konnte nicht gesendet werden, " +"weil dein Benutzername inaktiv oder deine E-Mail-Adresse noch nicht " +"verifiziert ist." #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" @@ -94,44 +108,64 @@ msgstr "Titel" msgid "Tags" msgstr "Markierungen" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Kurztitel" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "Bitte gib einen Kurztitel ein" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" "Der Titelteil der Medienadresse. Normalerweise muss hier nichts geändert " "werden." -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Biographie" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Webseite" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "Diesen Kurztitel hast du bereits vergeben." -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 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:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "Du bearbeitest das Profil eines Anderen. Bitte sei vorsichtig." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." -msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -141,18 +175,18 @@ msgstr "Datei" msgid "Description of this work" msgstr "Beschreibung des Werkes" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Du musst eine Datei angeben." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Yeeeaaah! Geschafft!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Hoppla!" @@ -173,29 +207,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Bild eines angespannten Goblins" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "MediaGoblin-Logo" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Medien hochladen" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "Bitte bestätige deine Email-Adresse!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Anmelden" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -208,71 +242,32 @@ msgid "Explore" msgstr "Entdecke" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Hallo Medien-Liebhaber! MediaGoblin ist …" - -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -msgstr "Der perfekte Platz für deine Medien!" - -#: mediagoblin/templates/mediagoblin/root.html:30 -msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" -msgstr "" -"Ein Platz für Zusammenarbeit und um Originale und abgeleitete Werke zu " -"präsentieren!" - -#: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Frei, wie in Freiheit. (Wir sind schließlich ein GNU-Projekt.)" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"Weltverbesserer durch Dezentralisierung und (hoffentlich bald!) unabhängige " -"Kommunikation!" -#: mediagoblin/templates/mediagoblin/root.html:33 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Gebaut für Erweiterungen. (Bald mit Unterstützung für verschiedene " -"Medientypen inklusive Videos!)" -#: mediagoblin/templates/mediagoblin/root.html:34 -msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -"Betrieben von Leuten wie dir. (Du kannst uns dabei helfen, " -"die Software zu verbessern!)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Neugierig dich uns anzuschließen?" - -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"Gratis ein Konto einrichten\n" -" or\n" -" MediaGoblin auf deinem eigenen Server einrichten" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Neuste Medien" @@ -280,9 +275,13 @@ msgstr "Neuste Medien" msgid "Enter your new password" msgstr "Neues Passwort eingeben" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" -msgstr "Benutzername oder Email-Adresse eingeben" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -292,8 +291,8 @@ msgstr "Dein Passwort wurde geändert. Versuche dich jetzt einzuloggen." 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." +"Überprüfe deinen Posteingang. Wir haben dir eine E-Mail mit einem Link " +"geschickt, mit dem du dein Passwort ändern kannst." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -314,28 +313,24 @@ msgstr "" "\n" "%(verification_url)s\n" "\n" -"Wenn du denkst, dass das ein Fehler ist, ignoriere einfach diese Email und bleib ein glücklicher Goblin!" +"Wenn du denkst, dass das ein Fehler ist, ignoriere einfach diese E-Mail und bleib ein glücklicher Goblin!" #: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "Anmeldevorgang fehlgeschlagen!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Hast du noch kein Konto?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Registriere dich hier!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "Passwort vergessen?" -#: mediagoblin/templates/mediagoblin/auth/login.html:52 -msgid "Change it!" -msgstr "Wechsle es!" - #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Neues Konto registrieren!" @@ -356,7 +351,7 @@ msgid "" msgstr "" "Hallo %(username)s,\n" "\n" -"um dein Konto bei GNU MediaGoblin zu aktivieren, musst du folgende Adresse in einem Webbrowser öffnen:\n" +"um dein Konto bei GNU MediaGoblin zu aktivieren, musst du folgende Adresse in deinem Webbrowser öffnen:\n" "\n" "%(verification_url)s" @@ -380,9 +375,15 @@ msgstr "Änderungen speichern" msgid "Editing %(username)s's profile" msgstr "%(username)ss Profil bearbeiten" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Medien markiert mit:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -392,16 +393,16 @@ msgstr "Medien hochladen" msgid "Submit" msgstr "Bestätigen" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "%(username)ss Medien" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Dieser Benutzer wurde leider nicht gefunden." - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -434,31 +435,41 @@ msgstr "Keine Medien in Bearbeitung" msgid "These uploads failed to process:" msgstr "Die folgenden Uploads sind fehlgeschlagen:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "%(username)ss Profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Dieser Benutzer konnte leider nicht gefunden werden." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" -msgstr "Email-Bestätigung benötigt" +msgstr "E-Mail-Bestätigung benötigt" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Fast fertig! Dein Konto muss noch freigeschaltet werden." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "" -"Gleich solltest du eine Email bekommen, die dir sagt, was du noch machen " -"musst." +"Gleich solltest du eine E-Mail erhalten, die dir erklärt, was du noch machen" +" musst." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "Wenn sie nicht ankommt:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Bestätigung erneut senden" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -466,7 +477,7 @@ msgstr "" "Jemand hat bereits ein Konto mit diesem Benutzernamen registriert, aber es " "muss noch aktiviert werden." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can anmelden und sie erneut " "senden." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "%(username)ss Profil" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." msgstr "Hier kannst du Anderen etwas über dich erzählen." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Profil bearbeiten" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Dieser Benutzer hat (noch) keine Daten in seinem Profil." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Alle Medien von %(username)s anschauen" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "Hier erscheinen deine Medien. Sobald du etwas hochgeladen hast." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Medien hinzufügen" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Scheinbar gibt es hier noch nichts …" @@ -529,6 +535,14 @@ msgstr "Neuere" msgid "Older" msgstr "Ältere" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Kommentar" @@ -537,15 +551,23 @@ msgstr "Kommentar" msgid "I am sure I want to delete this" msgstr "Ja, wirklich löschen" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "Leere Kommentare sind nicht erlaubt." -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "Kommentar hinzugefügt!" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 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 f3e0c100..c1f3fd7f 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-11-01 23:14-0500\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,10 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "" + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "" @@ -50,7 +54,7 @@ msgid "Sorry, a user with that name already exists." msgstr "" #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." +msgid "Sorry, a user with that email address already exists." msgstr "" #: mediagoblin/auth/views.py:179 @@ -89,40 +93,60 @@ msgstr "" msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 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." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" msgstr "" #: mediagoblin/submit/forms.py:25 @@ -133,16 +157,16 @@ msgstr "" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:49 -msgid "The file doesn't seem to be an image!" +#: mediagoblin/submit/views.py:127 +msgid "Woohoo! Submitted!" msgstr "" -#: mediagoblin/submit/views.py:121 -msgid "Woohoo! Submitted!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." msgstr "" #: mediagoblin/templates/mediagoblin/404.html:21 @@ -163,29 +187,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -196,60 +220,35 @@ msgid "Explore" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:30 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +"To add your own media, place comments, save your favourites and more, you" +" can log in with your MediaGoblin account." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project," -" after all.)" +msgid "Don't have one yet? It's easy!" 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. (You can help us improve " -"this software!)" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:39 #, python-format msgid "" -"Create a " -"free account\n" +"Create an " +"account at this site\n" " or\n" -" Set up MediaGoblin on " "your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "" @@ -257,8 +256,12 @@ msgstr "" msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 @@ -287,22 +290,18 @@ msgstr "" msgid "Logging in failed!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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 "" @@ -342,8 +341,14 @@ msgstr "" msgid "Editing %(username)s's profile" msgstr "" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 @@ -354,14 +359,14 @@ msgstr "" msgid "Submit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format -msgid "%(username)s's media" +msgid "%(username)s'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." +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 +#, python-format +msgid "%(username)s's media" msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -393,74 +398,79 @@ msgstr "" msgid "These uploads failed to process:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can " "log in 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -480,6 +490,14 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "" @@ -488,15 +506,23 @@ msgstr "" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po index f6bb1cce..2cffe874 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -21,6 +21,10 @@ msgstr "" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "La provizita dosiero ne konformas al la informtipo." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Uzantnomo" @@ -54,8 +58,8 @@ msgid "Sorry, a user with that name already exists." msgstr "Bedaŭrinde, uzanto kun tiu nomo jam ekzistas." #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." -msgstr "Tiu retpoŝtadreso jam estas uzata." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -69,11 +73,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "La kontrol-kodo aŭ la uzantonomo ne estas korekta" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Resendi vian kontrol-mesaĝon." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -89,44 +101,64 @@ msgstr "Titolo" msgid "Tags" msgstr "Etikedoj" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "La distingiga adresparto" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "La distingiga adresparto ne povas esti malplena" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" "La parto de la dosieradreso, bazita sur la dosiertitolo. Ordinare ne necesas" " ĝin ŝanĝi." -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Retejo" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 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:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "Vi priredaktas dosieron de alia uzanto. Agu singardeme." -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "Vi redaktas profilon de alia uzanto. Agu singardeme." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." -msgstr "La provizita dosiero ne konformas al la informtipo." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -136,18 +168,18 @@ msgstr "Dosiero" msgid "Description of this work" msgstr "Priskribo de ĉi tiu verko" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Vi devas provizi dosieron." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Hura! Alŝutitas!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Oj!" @@ -168,29 +200,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Bildo de 404-koboldo penŝvitanta." -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "Emblemo de MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Alŝuti aŭd-vid-dosieron" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "konfirmu vian retpoŝtadreson! " +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Ensaluti" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -203,69 +235,32 @@ msgid "Explore" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Saluton, artemulo! MediaGoblin estas…" - -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -msgstr "La perfekta loko por viaj aŭd-vid-dosieroj!" - -#: mediagoblin/templates/mediagoblin/root.html:30 -msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" -msgstr "" -"Loko, kie homoj povas kunlabori, kaj elmeti originalajn kreaĵojn kaj " -"derivaĵojn!" - -#: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Libera verko. (Ni ja estas projekto de GNU.)" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"Celanta plibonigi la mondon per sencentreco kaj (iam, baldaŭ!) federateco!" -#: mediagoblin/templates/mediagoblin/root.html:33 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Kreita por etendado. (Baldaŭ en la programo aperos subteno de pluraj " -"informspecoj, inkluzive de filmoj!)" -#: mediagoblin/templates/mediagoblin/root.html:34 -msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -"Vivanta per homoj kiel vi. (Vi povas helpi al ni " -"plibonigi la programon!)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Ĉu vi deziregas aliĝi nin?" - -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"Kreu senpagan" -" konton⏎ aŭ⏎ Kreu senpagan konton" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Plej nove aldonitaj dosieroj" @@ -273,9 +268,13 @@ msgstr "Plej nove aldonitaj dosieroj" msgid "Enter your new password" msgstr "Enigu vian novan pasvorton" -#: 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/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -313,22 +312,18 @@ msgstr "" msgid "Logging in failed!" msgstr "Ensaluto malsukcesis!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Ĉu ankoraŭ sen konto?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Kreu ĝin ĉi tie!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "Ĉu vi forgesis vian pasvorton?" -#: mediagoblin/templates/mediagoblin/auth/login.html:52 -msgid "Change it!" -msgstr "Ŝanĝu ĝin!" - #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Kreu konton!" @@ -373,9 +368,15 @@ msgstr "Konservi ŝanĝojn" msgid "Editing %(username)s's profile" msgstr "Redaktado de l’profilo de %(username)s'" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Dosieroj markitaj per:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -385,16 +386,16 @@ msgstr "Alŝutu vian aŭd-vid-dosieron" msgid "Submit" msgstr "Alŝuti" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Dosieroj de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Uzanto ne trovita." - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -427,30 +428,40 @@ msgstr "Neniu dosieroj preparatas" msgid "These uploads failed to process:" msgstr "Preparado de ĉi tiuj alŝutaĵoj malsukcesis:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "Profilo de %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Uzanto ne trovita." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "Necesas konfirmo de retpoŝtadreso" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Preskaŭ finite! Restas nur validigi vian konton." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "" "Post kelkaj momentoj devas veni retletero kun instrukcio pri kiel tion fari." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "Se tio ne okazas:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Resendi kontrolmesaĝon" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -458,7 +469,7 @@ msgstr "" "Iu registris konton kun tiu ĉi uzantonomo, sed ĝi devas ankoraŭ esti " "aktivigita." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can ensaluti kaj resendi ĝin." -#: 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." msgstr "Jen estas spaceto por rakonti pri vi al aliaj." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Redakti profilon" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Ĉi tiu uzanto ne jam aldonis informojn pri si." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Rigardi ĉiujn dosierojn de %(username)s'" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "" "Ĝuste ĉi tie aperos viaj dosieroj, sed vi ŝajne ankoraŭ nenion alŝutis." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Aldoni dosieron" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Ĉi tie ŝajne estas ankoraŭ neniuj dosieroj…" @@ -521,6 +527,14 @@ msgstr "Plinovaj" msgid "Older" msgstr "Malplinovaj" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Komento" @@ -529,15 +543,23 @@ 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:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." -msgstr "" +msgstr "Malplenaj komentoj ne estas afiŝeblaj." -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" +msgstr "La komento estas afiŝita!" + +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:198 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.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po index a3c9939b..6ab070af 100644 --- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po @@ -14,8 +14,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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mediagoblin/team/es/)\n" "MIME-Version: 1.0\n" @@ -25,6 +25,10 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Archivo inválido para el formato seleccionado." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Nombre de usuario" @@ -59,8 +63,8 @@ msgid "Sorry, a user with that name already exists." msgstr "Lo sentimos, ya existe un usuario con ese nombre." #: 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." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -75,11 +79,19 @@ 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:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Se reenvió tu correo electrónico de verificación." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -96,44 +108,64 @@ msgstr "Título" msgid "Tags" msgstr "Etiquetas" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Ficha" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "La ficha no puede estar vacía" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" "La parte del título de la URL de este contenido. Normalmente no necesitas " "cambiar esto." -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Sitio web" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 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:85 +#: mediagoblin/edit/views.py:86 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:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "Estás editando un perfil de usuario. Proceder con precaución." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." -msgstr "Archivo inválido para el formato seleccionado." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -143,18 +175,18 @@ msgstr "Archivo" msgid "Description of this work" msgstr "Descripción de esta obra" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Debes proporcionar un archivo." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "¡Woohoo! ¡Enviado!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Ups!" @@ -175,29 +207,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Imagen de 404 goblin estresándose" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "Logo de MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Enviar contenido" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "¡Verifica tu correo electrónico!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Conectarse" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -210,71 +242,32 @@ msgid "Explore" msgstr "Explorar" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -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!" - -#: 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 originales y derivadas!" - -#: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Libre, como en la libertad. (Somos parte del proyecto GNU después de todo.)" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"Queriendo hacer del mundo un mejor lugar a través de la descentralización y " -"(eventualmente, muy pronto!) la federalización!" -#: mediagoblin/templates/mediagoblin/root.html:33 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Pensado para ser extensible. (Prontamente soporte para multiples formatos, " -"incluyendo video!)" -#: mediagoblin/templates/mediagoblin/root.html:34 -msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -"Impulsado por gente como vos. ( Vos podés ayudarnos a " -"mejorar este programa)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Te gustaría unirte a nosotros?" - -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"Crea una " -"cuenta gratuita o Establece MediaGoblin en " -"tu propio servidor" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "El contenido más reciente" @@ -282,9 +275,13 @@ msgstr "El contenido más reciente" msgid "Enter your new password" msgstr "Ingrese su nueva contraseña" -#: 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/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -319,22 +316,18 @@ msgstr "" msgid "Logging in failed!" msgstr "¡Falló el inicio de sesión!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "¿No tienes una cuenta?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "¡Crea una aquí!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "¿Olvidaste tu contraseña?" -#: mediagoblin/templates/mediagoblin/auth/login.html:52 -msgid "Change it!" -msgstr "Cambiarlo!" - #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "¡Crea una cuenta!" @@ -379,9 +372,15 @@ msgstr "Guardar cambios" msgid "Editing %(username)s's profile" msgstr "Editando el perfil de %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Contenido etiquetado con:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -391,16 +390,16 @@ msgstr "Envía tu contenido" msgid "Submit" msgstr "Enviar" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Contenido de %(username)s's" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Lo sentimos, no se encontró ese usuario." - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -433,31 +432,41 @@ msgstr "No hay contenido siendo procesado." msgid "These uploads failed to process:" msgstr "Estos archivos no pudieron ser procesados:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "Perfil de %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Lo sentimos, no se encontró ese usuario." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "Es necesario un correo electrónico de verificación" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Casi terminas! Solo falta activar la cuenta." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "" "En unos momentos te debería llegar un correo electrónico con las " "instrucciones para hacerlo." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "En caso de que no:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Reenviar correo electrónico de verificación" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -465,7 +474,7 @@ msgstr "" "Alguien ya registró una cuenta con ese nombre de usuario, pero todavía no " "fue activada." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can acceder y reenviarlo." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "Perfil de %(username)s" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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í." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Editar perfil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Este usuario (todavia) no ha completado su perfil." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Ver todo el contenido de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "" "Aquí es donde tú contenido estará, pero parece que aún no has agregado nada." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Añadir contenido" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Parece que aún no hay ningún contenido aquí..." @@ -528,6 +532,14 @@ msgstr "Recientes" msgid "Older" msgstr "Antiguas" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Comentario" @@ -536,15 +548,23 @@ msgstr "Comentario" msgid "I am sure I want to delete this" msgstr "Estoy seguro de que quiero borrar esto" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 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.po b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po index 0a6a5a40..b37f5217 100644 --- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po @@ -13,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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-04 10:05+0000\n" -"Last-Translator: chesuidayeur \n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,6 +24,10 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Le fichier envoyé ne correspond pas au type de média." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Nom d'utilisateur" @@ -59,8 +63,8 @@ msgid "Sorry, a user with that name already exists." msgstr "Un utilisateur existe déjà avec ce nom, désolé." #: 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." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -74,11 +78,19 @@ msgstr "" 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:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "E-mail de vérification renvoyé." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -94,48 +106,68 @@ msgstr "Titre" msgid "Tags" msgstr "Tags" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Légende" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "La légende ne peut pas être laissée vide." -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 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:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Site web" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 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:85 +#: mediagoblin/edit/views.py:86 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:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "" "Vous vous apprêtez à modifier le profil d'un utilisateur. Veuillez prendre " "garde." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." -msgstr "Le fichier envoyé ne correspond pas au type de média." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -145,18 +177,18 @@ msgstr "Fichier" msgid "Description of this work" msgstr "Descriptif pour ce travail" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Il vous faut fournir un fichier." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Youhou, c'est envoyé !" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Zut!" @@ -177,29 +209,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Image de 404 gobelin angoissé" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "Logo MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Soumettre un média" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "vérifiez votre adresse e-mail !" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "S'identifier" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -212,71 +244,32 @@ msgid "Explore" msgstr "Explorer" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Salut à tous, amateur de médias! MediaGoblin est ..." - -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -msgstr "L'endroit idéal pour vos médias!" - -#: mediagoblin/templates/mediagoblin/root.html:30 -msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" -msgstr "" -"Un 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 GNU project, " -"after all.)" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Logiciel libre. (Nous sommes un projet GNU " -"après tout.)" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"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 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Construit pour l'extensibilité. (Plusieurs types de médias à venir au " -"logiciel, y compris le support vidéo!)" -#: mediagoblin/templates/mediagoblin/root.html:34 -msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -"Propulsé par des gens comme vous. (Vous pouvez nous aider à " -"améliorer ce logiciel!)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Envi de vous joindre à nous ?" - -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"Créez gratuitement en compte\n" -" ou\n" -" Installez MediaGoblin sur votre propre serveur" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Tout derniers media" @@ -284,9 +277,13 @@ msgstr "Tout derniers media" msgid "Enter your new password" msgstr "Entrez un nouveau mot de passe" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" -msgstr "Entrez votre nom d'utilisateur ou votre email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -327,22 +324,18 @@ msgstr "" msgid "Logging in failed!" msgstr "La connexion a échoué!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Pas encore de compte?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Créez-en un ici!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "Vous avez oublié votre mot de passe ?" -#: mediagoblin/templates/mediagoblin/auth/login.html:52 -msgid "Change it!" -msgstr "Changez-le !" - #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Créer un compte!" @@ -387,9 +380,15 @@ msgstr "Enregistrer les modifications" msgid "Editing %(username)s's profile" msgstr "Modification du profil de %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Média comportant les tags suivants :" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -399,16 +398,16 @@ msgstr "Soumettez ce média" msgid "Submit" msgstr "Soumettre" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Médias de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Impossible de trouver cet utilisateur, désolé." - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -441,31 +440,41 @@ msgstr "Aucun média en transformation" msgid "These uploads failed to 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "profil de %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Impossible de trouver cet utilisateur, désolé." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "Vérification d'email nécessaire" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Presque fini ! Votre compte a encore besoin d'être activé." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "" "Un e-mail devrait vous parvenir dans quelques instants ; il vous indiquera " "comment procéder." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "Si la vérification n'est pas arrivée à bon port :" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Renvoyer l'e-mail de vérification" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -473,7 +482,7 @@ msgstr "" "Quelqu'un a enregistré un compte avec ce nom, mais il doit encore être " "activé." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can identifier et " "le renvoyer." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "profil de %(username)s" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." msgstr "Voici un endroit pour parler aux autres de vous-même." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Modifier le profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Cet utilisateur n'a pas (encore) rempli son profil." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Voir tous les médias de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." @@ -514,11 +518,11 @@ msgstr "" "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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Ajouter des médias" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Il ne semble pas y avoir de média là, pour l'instant ..." @@ -538,6 +542,14 @@ msgstr "Nouveaux" msgid "Older" msgstr "Anciens" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Commentaire" @@ -546,15 +558,23 @@ msgstr "Commentaire" msgid "I am sure I want to delete this" msgstr "Je suis sûr de vouloir supprimer cela" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "Les commentaires vides ne sont pas autorisés." -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "Votre commentaire a été posté !" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 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.po b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po index d9fdf8d6..a4f1f8d7 100644 --- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ia/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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,6 +19,10 @@ msgstr "" "Language: ia\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "" + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Nomine de usator" @@ -52,7 +56,7 @@ msgid "Sorry, a user with that name already exists." msgstr "" #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." +msgid "Sorry, a user with that email address already exists." msgstr "" #: mediagoblin/auth/views.py:179 @@ -65,11 +69,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -83,41 +95,61 @@ msgstr "Titulo" msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Sito web" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 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." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" msgstr "" #: mediagoblin/submit/forms.py:25 @@ -128,16 +160,16 @@ msgstr "" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:49 -msgid "The file doesn't seem to be an image!" +#: mediagoblin/submit/views.py:127 +msgid "Woohoo! Submitted!" msgstr "" -#: mediagoblin/submit/views.py:121 -msgid "Woohoo! Submitted!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." msgstr "" #: mediagoblin/templates/mediagoblin/404.html:21 @@ -158,29 +190,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Initiar session" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -191,57 +223,32 @@ msgid "Explore" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:30 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +msgid "Don't have one yet? It's easy!" 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. (You can help us improve this" -" software!)" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:39 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "" @@ -249,8 +256,12 @@ msgstr "" msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 @@ -280,22 +291,18 @@ msgstr "" msgid "Logging in failed!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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!" @@ -335,8 +342,14 @@ msgstr "" msgid "Editing %(username)s's profile" msgstr "" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 @@ -347,14 +360,14 @@ msgstr "" msgid "Submit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format -msgid "%(username)s's media" +msgid "%(username)s'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." +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 +#, python-format +msgid "%(username)s's media" msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -387,75 +400,80 @@ msgstr "" msgid "These uploads failed to process:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "Profilo de %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can log in 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -475,6 +493,14 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Commento" @@ -483,15 +509,23 @@ msgstr "Commento" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po index 183d09ed..25700f8f 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,6 +19,10 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "documento non valido come tipo multimediale." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Nome utente" @@ -52,8 +56,8 @@ msgid "Sorry, a user with that name already exists." msgstr "Spiacente, esiste già un utente con quel nome" #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." -msgstr "Spiacente, quell'indirizzo email è già stato preso." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -67,11 +71,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "La chiave di verifica o l'id utente è sbagliato" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Rispedisci email di verifica" -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -85,44 +97,64 @@ msgstr "Titolo" msgid "Tags" msgstr "Tags" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Sito web" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 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:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "Stai modificando il profilo di un utente. Procedi con attenzione." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." -msgstr "documento non valido come tipo multimediale." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -132,18 +164,18 @@ msgstr "Documento" msgid "Description of this work" msgstr "Descrizione di questo lavoro" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Devi specificare un documento." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Evviva! " +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Oops!" @@ -164,29 +196,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Immagine di 404 folletti che stressano" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "MediaGoblin logo" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Inoltra file multimediale" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "verifica il tuo indirizzo email!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Accedi" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -199,65 +231,32 @@ msgid "Explore" msgstr "Esplora" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Ciao, amante del multimedia! MediaGoblin è..." - -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -msgstr "Il posto perfetto per i tuoi documenti multimediali!" - -#: mediagoblin/templates/mediagoblin/root.html:30 -msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Un posto per collaborare con altri e mostrare le proprie creazioni originali" -" e derivate!" -#: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"Libero, come in libertà. (Siamo un progetto GNU, dopotutto.)" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" -msgstr "" -"Con l'obbiettivo di rendere il mondo un posto migliore attraverso la " -"decentrelizzazione e (finalmente, presto!) federazione!" - -#: mediagoblin/templates/mediagoblin/root.html:33 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Fatto per estensibilità. (Numerosi tipi multimediali saranno presto aggiunti" -" al programma, incluso il supporto video!)" -#: mediagoblin/templates/mediagoblin/root.html:34 -msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Eccitato di unirti a noi?" - -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Documenti multimediali più recenti" @@ -265,9 +264,13 @@ msgstr "Documenti multimediali più recenti" msgid "Enter your new password" msgstr "Inserisci la tua nuova password" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" -msgstr "Inserisci il tuo nome utente o email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -296,22 +299,18 @@ msgstr "" msgid "Logging in failed!" msgstr "Accesso fallito!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Non hai ancora un account?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Creane uno qui!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "Hai dimenticato la password?" -#: mediagoblin/templates/mediagoblin/auth/login.html:52 -msgid "Change it!" -msgstr "" - #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Crea un account!" @@ -356,9 +355,15 @@ msgstr "Salva i cambiamenti" msgid "Editing %(username)s's profile" msgstr "Stai modificando il profilo di %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Media taggata con:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -368,16 +373,16 @@ msgstr "Inoltra documento multimediale" msgid "Submit" msgstr "Conferma" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Documenti multimediali di %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Mi dispiace, utente non trovato" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -408,30 +413,40 @@ msgstr "Nessun documento multimediale in elaborazione" msgid "These uploads failed to process:" msgstr "L'elaborazione di questi upload è fallita:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "profilo di %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Mi dispiace, utente non trovato" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "è necessario verificare email" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Quasi finito! Il tuo account deve ancora essere attivato." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "" "In breve dovresti ricevere un email contenente istruzioni su come fare." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "Nel caso non fosse:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Rispedisci email di verifica" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -439,7 +454,7 @@ msgstr "" "Qualcuno ha registrato un account con questo nome utente, ma deve ancora " "essere attivato." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can accedere e rispedirlo." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "profilo di %(username)s" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." msgstr "Ecco un posto dove raccontare agli altri di te." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Modifica profilo" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Questo utente non ha (ancora) compilato il proprio profilo." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Visualizza tutti i file multimediali di %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." @@ -479,11 +489,11 @@ msgstr "" "Questo è dove i tuoi documenti multimediali appariranno, ma sembra che tu " "non abbia ancora aggiunto niente." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Aggiungi documenti multimediali" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Non sembra ci sia ancora nessun documento multimediali qui.." @@ -503,6 +513,14 @@ msgstr "Più nuovo" msgid "Older" msgstr "Più vecchio" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Commento" @@ -511,15 +529,23 @@ msgstr "Commento" msgid "I am sure I want to delete this" msgstr "Sono sicuro di volerlo cancellare" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 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.po b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po index 59262d82..f2989e0e 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,6 +19,10 @@ msgstr "" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "" + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "ユーザネーム" @@ -52,7 +56,7 @@ msgid "Sorry, a user with that name already exists." msgstr "申し訳ありませんが、その名前を持つユーザーがすでに存在しています。" #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." +msgid "Sorry, a user with that email address already exists." msgstr "" #: mediagoblin/auth/views.py:179 @@ -65,11 +69,19 @@ msgstr "メアドが確認されています。これで、ログインしてプ msgid "The verification key or user id is incorrect" msgstr "検証キーまたはユーザーIDが間違っています" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "検証メールを再送しました。" -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -83,41 +95,61 @@ msgstr "タイトル" msgid "Tags" msgstr "タグ" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "スラグ" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "スラグは必要です。" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "自己紹介" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "URL" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "そのスラグを持つエントリは、このユーザーは既に存在します。" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "あなたは、他のユーザーのメディアを編集しています。ご注意ください。" -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 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." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" msgstr "" #: mediagoblin/submit/forms.py:25 @@ -128,18 +160,18 @@ msgstr "ファイル" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 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 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "投稿終了!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "" @@ -158,29 +190,29 @@ msgstr "" 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 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "コンテンツを投稿" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "メアドを確認してください!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "ログイン" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -191,57 +223,32 @@ msgid "Explore" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:30 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +msgid "Don't have one yet? It's easy!" 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. (You can help us improve this" -" software!)" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:39 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "" @@ -249,8 +256,12 @@ msgstr "" msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 @@ -280,22 +291,18 @@ msgstr "" msgid "Logging in failed!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "まだアカウントを持っていませんか?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "ここで作成!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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 "アカウントを作成!" @@ -340,9 +347,15 @@ msgstr "投稿する" msgid "Editing %(username)s's profile" msgstr "%(username)sさんのプロフィールを編集中" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "タグ付けされたコンテンツ:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -352,16 +365,16 @@ msgstr "コンテンツを投稿" msgid "Submit" msgstr "送信" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "%(username)sさんのコンテンツ" -#: 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?" @@ -392,75 +405,80 @@ msgstr "" msgid "These uploads failed to process:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "%(username)sさんのプロフィール" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "申し訳ありませんが、そのユーザーは見つかりませんでした。" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "到着しない場合は、" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "確認メールを再送信" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can log in and resend it." msgstr "あなたの確認メールを紛失した場合、ログインして再送できます。" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "%(username)sさんのプロフィール" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "プロフィールを編集" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "%(username)sさんのコンテンツをすべて見る" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -480,6 +498,14 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "" @@ -488,15 +514,23 @@ msgstr "" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po index 618daf6f..84957014 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,6 +19,10 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "" + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Gebruikersnaam" @@ -52,8 +56,8 @@ msgid "Sorry, a user with that name already exists." msgstr "Sorry, er bestaat al een gebruiker met die naam." #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." -msgstr "Sorry, dat e-mailadres is al ingenomen." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -67,11 +71,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "De verificatie sleutel of gebruikers-ID is onjuist" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Verificatie e-mail opnieuw opgestuurd." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -85,44 +97,64 @@ msgstr "Titel" msgid "Tags" msgstr "Etiket" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Website" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 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:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "" "U bent een gebruikersprofiel aan het aanpassen. Ga voorzichtig te werk." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" msgstr "" #: mediagoblin/submit/forms.py:25 @@ -133,18 +165,18 @@ msgstr "Bestand" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "U moet een bestand aangeven." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Mooizo! Toegevoegd!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "" @@ -163,29 +195,29 @@ msgstr "" 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 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Voeg media toe" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "Controleer uw e-mail!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Inloggen" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -196,57 +228,32 @@ msgid "Explore" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:30 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +msgid "Don't have one yet? It's easy!" 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. (You can help us improve this" -" software!)" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:39 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "" @@ -254,8 +261,12 @@ msgstr "" msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 @@ -285,22 +296,18 @@ msgstr "" msgid "Logging in failed!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Heeft u nog geen account?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Maak er hier een!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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 "Maak een account aan!" @@ -342,9 +349,15 @@ msgstr "Wijzigingen opslaan" msgid "Editing %(username)s's profile" msgstr "Het profiel aanpassen van %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Media met het etiket:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -354,16 +367,16 @@ msgstr "Voeg media toe" msgid "Submit" msgstr "Voeg toe" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Media van %(username)s " -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Sorry, die gebruiker kon niet worden gevonden." - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -394,37 +407,47 @@ msgstr "" msgid "These uploads failed to process:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "Profiel van %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Sorry, die gebruiker kon niet worden gevonden." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "" "Een e-mail zou in een paar ogenblikken aan moeten komen met instructies " "hiertoe." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "Zoniet:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Stuur de verificatie e-mail opnieuw op." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can inloggen en hem nogmaals verzenden." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "Profiel van %(username)s" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Profiel aanpassen." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Bekijk alle media van %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -486,6 +504,14 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Commentaar" @@ -494,15 +520,23 @@ msgstr "Commentaar" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po index c74e1dd0..21cfdda5 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,6 +19,10 @@ msgstr "" "Language: nn_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Ugyldig fil for mediatypen." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Brukarnamn" @@ -52,8 +56,8 @@ msgid "Sorry, a user with that name already exists." msgstr "Ein konto med dette brukarnamnet finst allereide." #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." -msgstr "Den epostadressa er allereide teken." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -67,11 +71,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "Stadfestingsnykelen eller brukar-ID-en din er feil." -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Send ein ny stadfestingsepost." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -86,42 +98,62 @@ msgstr "Tittel" msgid "Tags" msgstr "Merkelappar" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Nettnamn" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "Nettnamnet kan ikkje vera tomt" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "Nettnamnet (adressetittel) for mediefila di. Trengst ikkje endrast." -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Presentasjon" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Heimeside" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "Eit innlegg med denne adressetittelen finst allereie." -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "Trå varsamt, du endrar nokon andre sine mediefiler." -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "Trå varsamt, du endrar nokon andre sin profil." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." -msgstr "Ugyldig fil for mediatypen." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -131,18 +163,18 @@ msgstr "Fil" msgid "Description of this work" msgstr "Skildring av mediefila" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Du må velja ei fil." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Johoo! Opplasta!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Oops." @@ -163,29 +195,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Bilete av stressa 404-tusse." -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Last opp" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "Stadfest epostadressa di" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Logg inn" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -198,69 +230,32 @@ msgid "Explore" msgstr "Utforsk" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Hei der mediaentusiast, MediaGoblin..." - -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -msgstr "Er ein perfekt plass for mediet ditt!" - -#: mediagoblin/templates/mediagoblin/root.html:30 -msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Er ein plass for folk å samarbeida og visa fram sjølvlaga og vidarebygde " -"verk." - -#: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" -msgstr "Fri som i fridom (me er eit GNU-prosjekt)." -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"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 "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" -msgstr "Bygd for utviding (fleire medietypar kjem snart, m.a. video)." -#: mediagoblin/templates/mediagoblin/root.html:34 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Driven av folk som deg. (Du kan hjelpa med å forbetra" -" MediaGoblin)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Lyst til å bli med oss?" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" +msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"Opprett ein " -"gratis konto eller installer MediaGoblin på " -"eigen tenar" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Nyaste mediefiler" @@ -268,9 +263,13 @@ msgstr "Nyaste mediefiler" msgid "Enter your new password" msgstr "Fyll inn passord" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" -msgstr "Fyll inn brukarnamn eller epost" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -308,22 +307,18 @@ msgstr "" msgid "Logging in failed!" msgstr "Innlogging feila" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Har du ingen konto?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Lag ein!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "Gløymd passordet?" -#: mediagoblin/templates/mediagoblin/auth/login.html:52 -msgid "Change it!" -msgstr "Endra" - #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Lag ein konto." @@ -368,9 +363,15 @@ msgstr "Lagra" msgid "Editing %(username)s's profile" msgstr "Endrar profilen til %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Merkelappar:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -380,16 +381,16 @@ msgstr "Last opp" msgid "Submit" msgstr "Send" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "%(username)s sine mediefiler" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Fann ingen slik brukar" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -420,35 +421,45 @@ msgstr "Ingen media under handsaming" msgid "These uploads failed to process:" msgstr "Klarte ikkje handsama desse opplasta filene:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "%(username)s sin profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Fann ingen slik brukar" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "Epostverifisering trengst." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Nesten ferdig. Du treng berre aktivera kontoen." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "Ein epost med instruksjonar kjem straks." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "I tilfelle det ikkje skjer:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Send ein ny epost" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." msgstr "Dette brukarnamnet finst allereie, men det er ikkje aktivert." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can logga inn for å få " "tilsendt ny epost med stadfestingslenkje." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "%(username)s sin profil" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." msgstr "Her kan du fortelja om deg sjølv." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Endra profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Brukaren har ikkje fylt ut profilen sin (enno)." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Sjå alle %(username)s sine mediefiler" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." -msgstr "Her kjem mediefilene dine. Ser ikkje ut til at du har lagt til noko." +msgstr "Her kjem mediefilene dine." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Legg til mediefiler" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Ser ikkje ut til at det finst nokon mediefiler her nett no." @@ -510,6 +516,14 @@ msgstr "Nyare" msgid "Older" msgstr "Eldre" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Innspel" @@ -518,15 +532,23 @@ msgstr "Innspel" msgid "I am sure I want to delete this" msgstr "Eg er sikker eg vil sletta dette" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." -msgstr "" +msgstr "Du må skriva noko i innspelet." -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" +msgstr "Innspel lagt til." + +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:198 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.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po index 047e598b..c4f77f8a 100644 --- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/pt_BR/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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/mediagoblin/team/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -20,6 +20,10 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Arquivo inválido para esse tipo de mídia" + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Nome de Usuário" @@ -54,8 +58,8 @@ msgid "Sorry, a user with that name already exists." msgstr "Desculpe, um usuário com este nome já existe." #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." -msgstr "Desculpe, esse endereço de email já está em uso." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -69,11 +73,19 @@ msgstr "" 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:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "O email de verificação foi reenviado." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -89,43 +101,63 @@ msgstr "Título" msgid "Tags" msgstr "Etiquetas" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Arquivo" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "O arquivo não pode estar vazio" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 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:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Biografia" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Website" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "Uma entrada com esse arquivo já existe para esse usuário" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "Você está editando a mídia de outro usuário. Tenha cuidado." -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." 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 "Arquivo inválido para esse tipo de mídia" +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -135,18 +167,18 @@ msgstr "Arquivo" msgid "Description of this work" msgstr "Descrição desse trabalho" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Você deve fornecer um arquivo." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Eba! Enviado!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Oops" @@ -167,29 +199,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Imagem do goblin 404 aparecendo" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "Logo MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Enviar mídia" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "Verifique seu email!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Entrar" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -202,71 +234,32 @@ msgid "Explore" msgstr "Explorar" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Olá amante de mídias. MediaGoblin é..." - -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -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 GNU project, " -"after all.)" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Livre como a liberdade. (Afinal, somos um projeto GNU)" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." 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 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." 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 "" -"Powered by people like you. (You can help us improve this" -" software!)" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -"Desenvolvido por pessoas como você. (Você pode ajudar a melhorar " -"esse software)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Animado para juntar-se a nós?" - -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -" Crie uma conta grátis \n" -" ou Configure seu próprio servidor MediaGoblin\n" -" " -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Mídia mais recente" @@ -274,9 +267,13 @@ msgstr "Mídia mais recente" msgid "Enter your new password" msgstr "Digite sua nova senha" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" -msgstr "Digite seu nome de usuário ou email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -315,22 +312,18 @@ msgstr "" msgid "Logging in failed!" msgstr "Autenticação falhou" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Ainda não tem conta?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Crie uma aqui!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "Esqueceu sua senha?" -#: mediagoblin/templates/mediagoblin/auth/login.html:52 -msgid "Change it!" -msgstr "Altere-a" - #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Criar uma conta!" @@ -375,9 +368,15 @@ msgstr "Salvar mudanças" msgid "Editing %(username)s's profile" msgstr "Editando perfil de %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Mídia marcada como:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -387,16 +386,16 @@ msgstr "Envie sua mídia" msgid "Submit" msgstr "Enviar" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Mídia de %(username)s " -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -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?" @@ -428,29 +427,39 @@ msgstr "Nenhuma mídia em processo" msgid "These uploads failed to process:" msgstr "Esses envios não foram processados:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "Perfil de %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Desculpe, esse usuário não foi encontrado." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "Verificação de email necessária" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Quase pronto! Sua conta ainda precisa ser ativada" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "Um email deve chegar em instantes com instruções de como fazê-lo." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "Caso contrário:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Reenviar email de verificação" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -458,7 +467,7 @@ 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can efetuar login e reenviá-la." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "Perfil de %(username)s" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Editar perfil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Esse usuário não preencheu seu perfil (ainda)." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Ver todas as mídias de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." @@ -498,11 +502,11 @@ 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Adicionar mídia" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Aparentemente não há nenhuma mídia aqui ainda..." @@ -522,6 +526,14 @@ msgstr "Mais novo" msgid "Older" msgstr "Mais velho" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Comentário" @@ -530,15 +542,23 @@ msgstr "Comentário" msgid "I am sure I want to delete this" msgstr "Eu tenho certeza de que quero pagar isso" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 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.po b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po index 01fe5c48..96fd46d8 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 20:49+0000\n" -"Last-Translator: gap \n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,10 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Formatul fișierului nu corespunde cu tipul de media selectat." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Nume de utilizator" @@ -52,8 +56,8 @@ 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:77 -msgid "Sorry, that email address has already been taken." -msgstr "Ne pare rău, această adresă de e-mail este deja rezervată." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -67,11 +71,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "Cheie de verificare sau user ID incorect." -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "E-mail-ul de verificare a fost retrimis." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -87,45 +99,65 @@ msgstr "Titlu" msgid "Tags" msgstr "Etichete" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Identificator" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "Identificatorul nu poate să lipsească" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" "Partea din adresa acestui fișier corespunzătoare titlului. De regulă nu " "trebuie modificată." -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Biografie" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Sit Web" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 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:85 +#: mediagoblin/edit/views.py:86 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:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "Editezi profilul unui utilizator. Se recomandă prudență." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." -msgstr "Formatul fișierului nu corespunde cu tipul de media selectat." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -135,18 +167,18 @@ msgstr "Fișier" msgid "Description of this work" msgstr "Descrierea acestui fișier" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Trebuie să selectezi un fișier." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Gata, trimis!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Oops!" @@ -167,29 +199,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Imagine cu elful 404 stresat." -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "logo MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Transmite un fișier media" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "verifică e-mail-ul!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Autentificare" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -202,70 +234,32 @@ msgid "Explore" msgstr "Explorează" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Bună! MediaGoblin este..." - -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -msgstr "Locul perfect pentru fișierele tale media!" - -#: mediagoblin/templates/mediagoblin/root.html:30 -msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" -msgstr "" -"Un loc unde oamenii colaborează și își expun creațiile originale și " -"derivate!" - -#: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Liber. (Suntem un proiect GNU, până la urmă.)" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"Un pas spre o lume mai bună prin descentralizare și (în curând) " -"federalizare!" -#: mediagoblin/templates/mediagoblin/root.html:33 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Proiectat să fie extensibil. (Software-ul va avea în curând suport pentru " -"mai multe formate de media, inclusiv pentru video!)" -#: mediagoblin/templates/mediagoblin/root.html:34 -msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -"Animat de oameni ca tine. (Ne poți ajuta să îmbunătățim" -" acest software!)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Vrei să ni te alături?" - -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"Creează gratuit un cont\n" -" sau\n" -" instalează MediaGoblin pe serverul tău" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Cele mai recente fișiere" @@ -273,9 +267,13 @@ msgstr "Cele mai recente fișiere" msgid "Enter your new password" msgstr "Introdu noua parolă" -#: 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/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -313,22 +311,18 @@ msgstr "" msgid "Logging in failed!" msgstr "Autentificare eșuată!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Nu ai un cont?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Creează-l aici!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "Ai uitat parola?" -#: mediagoblin/templates/mediagoblin/auth/login.html:52 -msgid "Change it!" -msgstr "Schimb-o!" - #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Creează un cont!" @@ -373,9 +367,15 @@ msgstr "Salvează modificările" msgid "Editing %(username)s's profile" msgstr "Editare profil %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Etichete:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -385,16 +385,16 @@ msgstr "Trimite fișierele tale media" msgid "Submit" msgstr "Trimite" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Fișierele media ale lui %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Ne pare rău, nu am găsit utilizatorul căutat." - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -425,29 +425,39 @@ msgstr "Niciun fișier în curs de procesare" msgid "These uploads failed to process:" msgstr "Aceste fișiere nu au putut fi procesate:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "Profil %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Ne pare rău, nu am găsit utilizatorul căutat." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "Este necesară confirmarea adresei de e-mail" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Aproape gata! Mai trebuie doar să activezi contul." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "Vei primi în scurt timp un e-mail cu instrucțiuni." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "Dacă nu-l primești:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Retrimite mesajul de verificare" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -455,7 +465,7 @@ msgstr "" "Cineva a înregistrat un cont cu acest nume de utilizator, dar contul nu a " "fost încă activat." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can autentifici pentru a-l retrimite." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "Profil %(username)s" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." msgstr "Aici poți spune altora ceva despre tine." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Editare profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Acest utilizator nu și-a completat (încă) profilul." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Vezi toate fișierele media ale lui %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." @@ -495,11 +500,11 @@ msgstr "" "Aici vor apărea fișierele tale media, dar se pare că încă nu ai trimis " "nimic." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Trimite fișier" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Nu pare să existe niciun fișier media deocamdată..." @@ -519,6 +524,14 @@ msgstr "Mai noi" msgid "Older" msgstr "Mai vechi" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Scrie un comentariu" @@ -527,15 +540,23 @@ 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:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "Comentariul trebuie să aibă un conținut." -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "Comentariul a fost transmis." -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 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.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po index f4bfbd67..9fb1ce08 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-04 11:13+0000\n" -"Last-Translator: aleksejrs \n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,10 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Неправильный формат файла." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Логин" @@ -52,8 +56,8 @@ 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 "Извините, этот адрес электронной почты уже занят." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -67,11 +71,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "Неверный ключ проверки или идентификатор пользователя" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Переслать сообщение с подтверждением аккаунта." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -88,45 +100,65 @@ msgstr "Название" msgid "Tags" msgstr "Метки" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Отличительная часть адреса" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "Отличительная часть адреса необходима" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" "Часть адреса этого файла, производная от его названия. Её обычно не нужно " "изменять." -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Биография" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Сайт" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "" "У этого пользователя уже есть файл с такой отличительной частью адреса." -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "Вы редактируете файлы другого пользователя. Будьте осторожны." -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 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/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -136,18 +168,18 @@ msgstr "Файл" msgid "Description of this work" msgstr "Описание этого произведения" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 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 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Ура! Файл загружен!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Ой!" @@ -160,35 +192,35 @@ msgstr "Кажется, такой страницы не существует. msgid "" "If you're sure the address is correct, maybe the page you're looking for has" " been moved or deleted." -msgstr "Возможно, страница которую вы ищете была удалена или переехала." +msgstr "Возможно, страница, которую вы ищете, была удалена или переехала." #: mediagoblin/templates/mediagoblin/404.html:32 msgid "Image of 404 goblin stressing out" msgstr "Изображение 404 нервничающего гоблина" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "Символ MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Загрузить файл" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "подтвердите ваш адрес электронной почты!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Войти" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -201,66 +233,32 @@ msgid "Explore" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Привет, любитель мультимедиа! MediaGoblin…" - -#: 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!" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Место для того, чтобы совместно работать или просто показать свои " -"оригинальные и/или заимствованные создания!" - -#: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" -msgstr "Свободное ПО. (Мы же проект GNU.)" -#: 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!)" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"Рассчитан на расширяемость. (В программе скоро должна появиться поддержка " -"других видов мультимедиа, таких как видео!)" -#: mediagoblin/templates/mediagoblin/root.html:34 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Поддерживается такими же, как и ты. (Ты можешь помочь сделать это" -" ПО лучше!)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Самые новые файлы" @@ -268,18 +266,24 @@ msgstr "Самые новые файлы" 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/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +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 "" +"Проверьте свой электронный почтовый ящик. Мы отправили сообщение с адресом " +"для изменения Вашего пароля." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -294,27 +298,32 @@ 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" +"следующий URL вашим веб‐браузером:\n" +"\n" +"%(verification_url)s\n" +"\n" +"Если вы думаете, что это какая‐то ошибка, то игнорируйте\n" +"это сообщение и продолжайте быть счастливым гоблином!" #: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" msgstr "Авторизация неуспешна!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Ещё нету аккаунта?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Создайте здесь!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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 "Создать аккаунт!" @@ -359,9 +368,15 @@ msgstr "Сохранить изменения" msgid "Editing %(username)s's profile" msgstr "Редактирование профиля %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Файлы с меткой:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -371,16 +386,16 @@ msgstr "Загрузить файл(ы)" msgid "Submit" msgstr "Подтвердить" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Файлы пользователя %(username)s" -#: 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?" @@ -412,38 +427,48 @@ msgstr "Нету файлов для обработки" msgid "These uploads failed to process:" msgstr "Обработка этих файлов вызвала ошибку:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "Профиль пользователя %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Извините, но такой пользователь не найден." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "Нужно подтверждение почтового адреса" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Почти закончили! Теперь надо активировать ваш аккаунт." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "А если нет, то:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "" "Повторно отправить сообщение для подверждения адреса электронной почты" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can войти и отправить его повторно." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "Профиль пользователя %(username)s" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Редактировать профиль" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Это пользователь не заполнил свой профайл (пока)." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Смотреть все файлы %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Добавить файлы" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Пока что тут файлов нет…" @@ -505,6 +525,14 @@ msgstr "Более новые" msgid "Older" msgstr "Более старые" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Комментарий" @@ -513,15 +541,23 @@ msgstr "Комментарий" msgid "I am sure I want to delete this" msgstr "Я уверен, что хочу удалить это" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "Empty comments are not allowed." -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" +msgstr "Комментарий размещён!" + +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "Вы на пороге удаления файла другого пользователя. Будьте осторожны." diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po index d3196b9c..bee7b3b5 100644 --- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sk/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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,6 +19,10 @@ msgstr "" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Odovzdaný nesprávny súbor pre daný typ média." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Prihlasovacie meno" @@ -52,8 +56,8 @@ 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á." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -67,11 +71,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "Nesprávny overovací kľúč alebo používateľské ID" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Opätovne zaslať overovaciu správu." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -87,42 +99,62 @@ msgstr "Nadpis" msgid "Tags" msgstr "Štítky" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Unikátna časť adresy" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "Unikátna časť adresy musí byť vyplnená" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 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 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Webstránka" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 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 +#: mediagoblin/edit/views.py:86 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 +#: mediagoblin/edit/views.py:156 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/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -132,18 +164,18 @@ msgstr "Súbor" msgid "Description of this work" msgstr "Charakteristika diela" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 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 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Juchú! Úspešne vložené!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Ajaj!" @@ -164,29 +196,29 @@ msgstr "" 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 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "MediaGoblin logo" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 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:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Prihlásenie" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -199,71 +231,32 @@ 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 GNU project, " -"after all.)" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Voľné, vo význame slobody. (Koniec-koncov, sme predsa GNU projekt.)" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." 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 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." 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. (You can help us improve this" -" software!)" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -"Existujeme aj vďaka ľudom ako si ty. (Môžeš nám pomôcť softvér " -"vylepšiť!)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Tak čo, chceš sa pridať?" - -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"Vytvoriť bezplatný účet\n" -" alebo\n" -" Sprevádzkovať MediaGoblin na vlastnom serveri" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Najčerstvejšie výtvory" @@ -271,9 +264,13 @@ msgstr "Najčerstvejšie výtvory" 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/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -312,22 +309,18 @@ msgstr "" msgid "Logging in failed!" msgstr "Prihlásenie zlyhalo!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Ešte nemáš účet?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Vytvoriť jeden tu!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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!" @@ -373,9 +366,15 @@ msgstr "Uložiť zmeny" 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/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -385,16 +384,16 @@ msgstr "Vlož svoj výtvor" msgid "Submit" msgstr "Vložiť" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Výtvory, ktoré vlastní %(username)s" -#: 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?" @@ -425,29 +424,39 @@ msgstr "Žiadne médiá v procese spracovania" 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "Profil, ktorý vlastní %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Prepáč, používateľské meno nenájdené." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "Potrebné overenie e-mailovej adresy" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "V prípade, že sa tak nestalo:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Opätovne zaslať overovaciu správu" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -455,7 +464,7 @@ 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can prihlásiť 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Upraviť profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Pridať výtvor" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Najskôr tu ešte nebudú žiadne výtvory..." @@ -518,6 +522,14 @@ msgstr "Novšie" msgid "Older" msgstr "Staršie" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Komentár" @@ -526,15 +538,23 @@ msgstr "Komentár" msgid "I am sure I want to delete this" msgstr "Jednoznačne to chcem odstrániť" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." -msgstr "" +msgstr "Komentáre bez obsahu nepovolené." -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" +msgstr "Komentár odoslaný!" + +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:198 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.po b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po index cba4fdd0..77273ebe 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,6 +19,10 @@ msgstr "" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Za vrsto vsebine je bila podana napačna datoteka." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Uporabniško ime" @@ -52,8 +56,8 @@ msgid "Sorry, a user with that name already exists." msgstr "Oprostite, uporabnik s tem imenom že obstaja." #: 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." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -67,11 +71,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "Potrditveni ključ ali uporabniška identifikacija je napačna" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Ponovno pošiljanje potrditvene e-pošte." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -85,42 +97,62 @@ msgstr "Naslov" msgid "Tags" msgstr "Oznake" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Oznaka" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "Oznaka ne sme biti prazna" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Biografija" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Spletna stran" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 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:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "Urejate vsebino drugega uporabnika. Nadaljujte pazljivo." -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "Urejate uporabniški profil. Nadaljujte pazljivo." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." -msgstr "Za vrsto vsebine je bila podana napačna datoteka." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -130,18 +162,18 @@ msgstr "Datoteka" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Podati morate datoteko." -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Juhej! Poslano." +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Opa!" @@ -162,29 +194,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Slika napake 404 s paničnim škratom" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "Logotip MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Pošlji vsebino" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "Preverite svojo e-pošto." +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Prijava" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -195,66 +227,32 @@ msgid "Explore" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Pozdravljen, ljubitelj večpredstavnostnih vsebin! MediaGoblin je ..." - -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -msgstr "Popolno mesto za vaše večpredstavnostne vsebine." - -#: mediagoblin/templates/mediagoblin/root.html:30 -msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Mesto, kjer ljudje lahko sodelujejo in razkazujejo originalne in predelane " -"stvaritve." -#: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" -msgstr "" -"Ustvarjen z namenom izboljšati svet, s pomočjo decentralizacije in (kmalu) " -"federacije." - -#: mediagoblin/templates/mediagoblin/root.html:33 -msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" -msgstr "" -"Zgrajen za razširjanje. (Kmalu bodo na voljo dodatne vrste vsebin, vključno " -"podpora za video)" - -#: mediagoblin/templates/mediagoblin/root.html:34 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Sad dela ljudi, kot ste vi. (Pri izboljševanju nam lahko " -"pomagate tudi vi.)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "" @@ -262,8 +260,12 @@ msgstr "" msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 @@ -293,22 +295,18 @@ msgstr "" msgid "Logging in failed!" msgstr "Prijava ni uspela." -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Še nimate računa?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Ustvarite si ga." -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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 "Ustvarite račun." @@ -354,9 +352,15 @@ msgstr "Shrani spremembe" msgid "Editing %(username)s's profile" msgstr "Urejanje profila – %(username)s" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Vsebina označena z:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -366,16 +370,16 @@ msgstr "Pošljite svojo vsebino" msgid "Submit" msgstr "Pošlji" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Vsebina uporabnika %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Oprostite, tega uporabnika ni bilo moč najti." - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -406,29 +410,39 @@ msgstr "V obdelavi ni nobene vsebine" msgid "These uploads failed to process:" msgstr "Teh vsebin ni bilo moč obdelati:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "Profil – %(username)s" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Oprostite, tega uporabnika ni bilo moč najti." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "Potrebna je potrditev prek e-pošte" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Skoraj ste zaključili. Svoj račun morate le še aktivirati." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "V kratkem bi morali prejeti e-pošto z navodili, kako to storiti." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "Če je ne prejmete:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Ponovno pošlji potrditveno e-pošto" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -436,7 +450,7 @@ msgstr "" "Nekdo je s tem uporabniškim imenom že registriral račun, vendar mora biti še" " aktiviran." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can prijavite in jo ponovno pošljete." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "Profil – %(username)s" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." msgstr "Na tem mestu lahko drugim poveste nekaj o sebi." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Uredi profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Ta uporabnik še ni izpolnil svojega profila." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Prikaži vso vsebino uporabnika %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "Tu bo prikazana vaša vsebina, a trenutno še niste dodali nič." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Dodaj vsebino" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Videti je, da tu še ni nobene vsebine ..." @@ -498,6 +507,14 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Komentar" @@ -506,15 +523,23 @@ msgstr "Komentar" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po index b4b2fb7b..0bdfc21c 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\n" "MIME-Version: 1.0\n" @@ -18,6 +18,10 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "" + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "" @@ -51,7 +55,7 @@ msgid "Sorry, a user with that name already exists." msgstr "" #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." +msgid "Sorry, a user with that email address already exists." msgstr "" #: mediagoblin/auth/views.py:179 @@ -64,11 +68,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -82,41 +94,61 @@ msgstr "" msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 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." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" msgstr "" #: mediagoblin/submit/forms.py:25 @@ -127,16 +159,16 @@ msgstr "" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:49 -msgid "The file doesn't seem to be an image!" +#: mediagoblin/submit/views.py:127 +msgid "Woohoo! Submitted!" msgstr "" -#: mediagoblin/submit/views.py:121 -msgid "Woohoo! Submitted!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." msgstr "" #: mediagoblin/templates/mediagoblin/404.html:21 @@ -157,29 +189,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -190,57 +222,32 @@ msgid "Explore" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:30 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +msgid "Don't have one yet? It's easy!" 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. (You can help us improve this" -" software!)" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:39 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "" @@ -248,8 +255,12 @@ msgstr "" msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 @@ -279,22 +290,18 @@ msgstr "" msgid "Logging in failed!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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 "" @@ -334,8 +341,14 @@ msgstr "" msgid "Editing %(username)s's profile" msgstr "" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 @@ -346,14 +359,14 @@ msgstr "" msgid "Submit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format -msgid "%(username)s's media" +msgid "%(username)s'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." +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 +#, python-format +msgid "%(username)s's media" msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -386,75 +399,80 @@ msgstr "" msgid "These uploads failed to process:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can log in 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -474,6 +492,14 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "" @@ -482,15 +508,23 @@ msgstr "" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po index 3ee44b18..37bd36c1 100644 --- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sv/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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n" "MIME-Version: 1.0\n" @@ -20,6 +20,10 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "Ogiltig fil för mediatypen." + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "Användarnamn" @@ -53,8 +57,8 @@ msgid "Sorry, a user with that name already exists." msgstr "En användare med det användarnamnet finns redan." #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." -msgstr "Den e-postadressen är redan tagen." +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -68,11 +72,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "Verifieringsnyckeln eller användar-IDt är fel." -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "Skickade ett nytt verifierings-email." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -88,42 +100,62 @@ msgstr "Titel" msgid "Tags" msgstr "Taggar" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "Sökvägsnamn" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "Sökvägsnamnet kan inte vara tomt" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "Sökvägstitlen för din media. Du brukar inte behöva ändra denna." -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "Presentation" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "Hemsida" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 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:85 +#: mediagoblin/edit/views.py:86 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:155 +#: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." msgstr "Var försiktig, du redigerar en annan användares profil." -#: mediagoblin/process_media/errors.py:44 -msgid "Invalid file given for media type." -msgstr "Ogiltig fil för mediatypen." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -133,18 +165,18 @@ msgstr "Fil" msgid "Description of this work" msgstr "Beskrivning av verket" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "Du måste ange en fil" -#: 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:121 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "Tjohoo! Upladdat!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "Ojoj!" @@ -165,29 +197,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "Bild av stressat 404-troll." -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "MediaGoblin-logotyp" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "Ladda upp" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "Verifiera din e-postadress!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Logga in" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -200,75 +232,32 @@ msgid "Explore" msgstr "Utforska" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "Hej där mediaentusiast, MediaGoblin..." - -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -msgstr "Är ett perfekt ställe för din media!" - -#: mediagoblin/templates/mediagoblin/root.html:30 -msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -"Är ett ställe för människor att samarbeta och visa upp originella och " -"härrörande verk." -#: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -"Är fritt som i frihet. (Vi är ju ett GNU-projekt.)" -#: mediagoblin/templates/mediagoblin/root.html:32 -msgid "" -"Aiming to make the world a better place through decentralization and " -"(eventually, coming soon!) federation!" -msgstr "" -"Arbetar för att göra världen till ett bättre ställe genom decentralisering " -"och (så småningom, kommer snart!) -- Google Translate säger " -"\"sammanslutning\", en: federation" -" " - -#: mediagoblin/templates/mediagoblin/root.html:33 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"Built for extensibility. (Multiple media types coming soon to the software," -" including video support!)" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" -"Byggd för utbyggbarhet. (Flera mediatyper kommer snart till MediaGoblin, " -"bland annat video!)" -#: mediagoblin/templates/mediagoblin/root.html:34 -msgid "" -"Powered by people like you. (You can help us improve this" -" software!)" +#: mediagoblin/templates/mediagoblin/root.html:31 +msgid "Don't have one yet? It's easy!" msgstr "" -"Drivs av människor som du. (Du kan hjälpa os forbättra " -"MediaGoblin!)" - -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "Nyfiken att gå med oss?" -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"Skapa ett konto gratis\n" -"\n" -" or\n" -" Installera MediaGoblin på din egen server" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "Senast medier" @@ -276,9 +265,13 @@ msgstr "Senast medier" msgid "Enter your new password" msgstr "Fyll i ditt lösenord" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" -msgstr "Fyll i ditt användarnamn eller lösenord" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -317,22 +310,18 @@ msgstr "" msgid "Logging in failed!" msgstr "Inloggning misslyckades!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "Har du inget konto än?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "Skapa ett här!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "Glömt ditt lösenord?" -#: mediagoblin/templates/mediagoblin/auth/login.html:52 -msgid "Change it!" -msgstr "Ändra!" - #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" msgstr "Skapa ett konto!" @@ -377,9 +366,15 @@ msgstr "Spara ändringar" msgid "Editing %(username)s's profile" msgstr "Redigerar %(username)ss profil" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "Media taggat med:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -389,16 +384,16 @@ msgstr "Ladda upp" msgid "Submit" msgstr "Skicka" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "%(username)ss media" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:52 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:32 -msgid "Sorry, no such user found." -msgstr "Ledsen, hittar ingen sådan användare." - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -429,30 +424,40 @@ msgstr "Ingen media under behandling" msgid "These uploads failed to process:" msgstr "De här behandlingarna misslyckades:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "%(username)ss profil" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "Ledsen, hittar ingen sådan användare." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "E-postadressverifiering krävs." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "Nästan klar! Ditt konto behöver bara aktiveras." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" "An email should arrive in a few moments with instructions on how to do so." msgstr "" "Ett e-postmeddelande med instruktioner kommer att hamna hos dig inom kort." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:51 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "Om det inte skulle göra det:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "Skicka ett nytt e-postmeddelande" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" "Someone has registered an account with this username, but it still has to be" " activated." @@ -460,7 +465,7 @@ msgstr "" "Någon har redan registrerat ett konto med det här användarnamnet men det har" " inte aktiverats." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can logga in och begära ett nytt." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "%(username)ss profil" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." msgstr "Här kan du berätta för andra om dig själv." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:90 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:108 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "Redigera profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "Den här användaren har inte fyllt i sin profilsida ännu." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "Se all media från %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." @@ -501,11 +501,11 @@ msgstr "" "Här kommer din media att dyka upp, du verkar inte ha lagt till någonting " "ännu." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:141 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "Lägg till media" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "Det verkar inte finnas någon media här ännu." @@ -525,6 +525,14 @@ msgstr "Nyare" msgid "Older" msgstr "Äldre" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "Kommentar" @@ -533,15 +541,23 @@ 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:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 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.po b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po index 289bddb5..064fa7d1 100644 --- a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/te/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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-03 14:08+0000\n" -"Last-Translator: veeven \n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,6 +19,10 @@ msgstr "" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "" + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "వాడుకరి పేరు" @@ -52,7 +56,7 @@ msgid "Sorry, a user with that name already exists." msgstr "" #: mediagoblin/auth/views.py:77 -msgid "Sorry, that email address has already been taken." +msgid "Sorry, a user with that email address already exists." msgstr "" #: mediagoblin/auth/views.py:179 @@ -65,11 +69,19 @@ msgstr "" msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -83,41 +95,61 @@ msgstr "శీర్షిక" msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 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." +#: mediagoblin/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" msgstr "" #: mediagoblin/submit/forms.py:25 @@ -128,16 +160,16 @@ msgstr "" msgid "Description of this work" msgstr "" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:49 -msgid "The file doesn't seem to be an image!" +#: mediagoblin/submit/views.py:127 +msgid "Woohoo! Submitted!" msgstr "" -#: mediagoblin/submit/views.py:121 -msgid "Woohoo! Submitted!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." msgstr "" #: mediagoblin/templates/mediagoblin/404.html:21 @@ -158,29 +190,29 @@ msgstr "" msgid "Image of 404 goblin stressing out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -191,57 +223,32 @@ msgid "Explore" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." +msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:30 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" +msgid "Don't have one yet? It's easy!" 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. (You can help us improve this" -" software!)" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "" - -#: mediagoblin/templates/mediagoblin/root.html:39 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "" @@ -249,8 +256,12 @@ msgstr "" msgid "Enter your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:29 -msgid "Enter your username or email" +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 @@ -280,22 +291,18 @@ msgstr "" msgid "Logging in failed!" msgstr "ప్రవేశం విఫలమయ్యింది!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "మీకు ఇంకా ఖాతా లేదా?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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 "" @@ -335,8 +342,14 @@ msgstr "మార్పులను భద్రపరచు" msgid "Editing %(username)s's profile" msgstr "" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 @@ -347,14 +360,14 @@ msgstr "" msgid "Submit" msgstr "దాఖలు చెయ్యి" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format -msgid "%(username)s's media" +msgid "%(username)s'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." +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 +#, python-format +msgid "%(username)s's media" msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -387,75 +400,80 @@ msgstr "" msgid "These uploads failed to process:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can log in 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -475,6 +493,14 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "వ్యాఖ్య" @@ -483,15 +509,23 @@ msgstr "వ్యాఖ్య" msgid "I am sure I want to delete this" msgstr "" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." msgstr "" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." +msgstr "" + +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po index c664adbe..5e406b41 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-11-01 23:14-0500\n" -"PO-Revision-Date: 2011-11-02 04:13+0000\n" +"POT-Creation-Date: 2011-11-27 15:25-0600\n" +"PO-Revision-Date: 2011-11-27 21:28+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -20,6 +20,10 @@ msgstr "" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0\n" +#: mediagoblin/processing.py:143 +msgid "Invalid file given for media type." +msgstr "指定錯誤的媒體類別!" + #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" msgstr "使用者名稱" @@ -53,8 +57,8 @@ 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 "抱歉,這個電子郵件已經被其他人使用了。" +msgid "Sorry, a user with that email address already exists." +msgstr "" #: mediagoblin/auth/views.py:179 msgid "" @@ -66,11 +70,19 @@ msgstr "你的電子郵件位址已被認證. 你現在就可以登入, 編輯 msgid "The verification key or user id is incorrect" msgstr "認證碼或是使用者帳號錯誤" -#: mediagoblin/auth/views.py:207 +#: mediagoblin/auth/views.py:203 +msgid "You must be logged in so we know who to send the email to!" +msgstr "" + +#: mediagoblin/auth/views.py:211 +msgid "You've already verified your email address!" +msgstr "" + +#: mediagoblin/auth/views.py:224 msgid "Resent your verification email." msgstr "重送認證信." -#: mediagoblin/auth/views.py:248 +#: mediagoblin/auth/views.py:265 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -84,42 +96,62 @@ msgstr "標題" msgid "Tags" msgstr "標籤" -#: mediagoblin/edit/forms.py:31 +#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 +msgid "Seperate tags by commas or spaces." +msgstr "" + +#: mediagoblin/edit/forms.py:33 msgid "Slug" msgstr "自訂字串" -#: mediagoblin/edit/forms.py:32 +#: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" msgstr "自訂字串不能空白" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "此媒體網址的名稱。你通常不需要變動這個的。" -#: mediagoblin/edit/forms.py:40 +#: mediagoblin/edit/forms.py:42 msgid "Bio" msgstr "自我介紹" -#: mediagoblin/edit/forms.py:43 +#: mediagoblin/edit/forms.py:45 msgid "Website" msgstr "網站" -#: mediagoblin/edit/views.py:64 +#: mediagoblin/edit/forms.py:49 +msgid "Old password" +msgstr "" + +#: mediagoblin/edit/forms.py:52 +msgid "New Password" +msgstr "" + +#: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." msgstr "這個自訂字串已經被其他人用了" -#: mediagoblin/edit/views.py:85 +#: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." msgstr "你正在編輯他人的媒體檔案. 請謹慎處理." -#: mediagoblin/edit/views.py:155 +#: mediagoblin/edit/views.py:156 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/edit/views.py:171 +msgid "Wrong password" +msgstr "" + +#: mediagoblin/edit/views.py:192 +msgid "Profile edited!" +msgstr "" + +#: mediagoblin/media_types/__init__.py:61 +msgid "Could not find any file extension in \"{filename}\"" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -129,18 +161,18 @@ msgstr "檔案" msgid "Description of this work" msgstr "這個作品的描述" -#: mediagoblin/submit/views.py:46 +#: mediagoblin/submit/views.py:49 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 +#: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" msgstr "呼呼! 送出去嚕!" +#: mediagoblin/submit/views.py:133 +msgid "Invalid file type." +msgstr "" + #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" msgstr "糟糕!" @@ -159,29 +191,29 @@ msgstr "如果你確定這個位址是正確的,或許你在找的網頁已經 msgid "Image of 404 goblin stressing out" msgstr "Image of 404 goblin stressing out" -#: mediagoblin/templates/mediagoblin/base.html:22 -msgid "GNU MediaGoblin" -msgstr "GNU MediaGoblin" - -#: mediagoblin/templates/mediagoblin/base.html:47 +#: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" msgstr "MediaGoblin 標誌" -#: mediagoblin/templates/mediagoblin/base.html:52 +#: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" msgstr "遞交媒體" -#: mediagoblin/templates/mediagoblin/base.html:63 -msgid "verify your email!" -msgstr "確認您的電子郵件!" +#: mediagoblin/templates/mediagoblin/base.html:65 +msgid "Verify your email!" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:73 +#: mediagoblin/templates/mediagoblin/base.html:72 +msgid "log out" +msgstr "" + +#: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 -#: mediagoblin/templates/mediagoblin/auth/login.html:35 +#: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "登入" -#: mediagoblin/templates/mediagoblin/base.html:89 +#: mediagoblin/templates/mediagoblin/base.html:91 msgid "" "Powered by MediaGoblin, a GNU project" @@ -194,62 +226,32 @@ msgid "Explore" msgstr "探索" #: mediagoblin/templates/mediagoblin/root.html:27 -msgid "Hi there, media lover! MediaGoblin is..." -msgstr "嗨!多媒體檔案愛好者!MediaGoblin是..." +msgid "Hi there, welcome to this MediaGoblin site!" +msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:29 -msgid "The perfect place for your media!" -msgstr "你的媒體檔案的最佳所在!" +#: mediagoblin/templates/mediagoblin/root.html:28 +msgid "Your finest source for all goblin-related media." +msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:30 +#: mediagoblin/templates/mediagoblin/root.html:29 msgid "" -"A place for people to collaborate and show off original and derived " -"creations!" -msgstr "這是一個可以讓人們共同展示他們的創作、衍生作品的地方!" +"To add your own media, place comments, save your favourites and more, you " +"can log in with your MediaGoblin account." +msgstr "" #: mediagoblin/templates/mediagoblin/root.html:31 -msgid "" -"Free, as in freedom. (We’re a GNU project, " -"after all.)" -msgstr "免費但是我們更重視自由 (畢竟我們是個 GNU 專案)" - -#: 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. (You can help us improve this" -" software!)" +msgid "Don't have one yet? It's easy!" msgstr "" -"由像你一樣的人們製作 (你可以幫我們改進軟體!)" -#: mediagoblin/templates/mediagoblin/root.html:38 -msgid "Excited to join us?" -msgstr "迫不亟待想要加入我們?" - -#: mediagoblin/templates/mediagoblin/root.html:39 +#: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" -"Create a free account\n" +"Create an account at this site\n" " or\n" -" Set up MediaGoblin on your own server" +" Set up MediaGoblin on your own server" msgstr "" -"建立一個免費帳號\n" -" 或是\n" -" 在你的伺服器上設立 MediaGoblin" -#: mediagoblin/templates/mediagoblin/root.html:53 +#: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" msgstr "最新的媒體" @@ -257,9 +259,13 @@ msgstr "最新的媒體" 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/forgot_password.html:27 +msgid "Recover password" +msgstr "" + +#: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 +msgid "Send instructions" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -295,22 +301,18 @@ msgstr "" msgid "Logging in failed!" msgstr "登入失敗!" -#: mediagoblin/templates/mediagoblin/auth/login.html:43 +#: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" msgstr "還沒有帳號嗎?" -#: mediagoblin/templates/mediagoblin/auth/login.html:46 +#: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" msgstr "在這裡建立一個吧!" -#: mediagoblin/templates/mediagoblin/auth/login.html:49 +#: mediagoblin/templates/mediagoblin/auth/login.html:42 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 "建立一個帳號!" @@ -355,9 +357,15 @@ msgstr "儲存變更" msgid "Editing %(username)s's profile" msgstr "編輯 %(username)s'的檔案中" -#: mediagoblin/templates/mediagoblin/listings/tag.html:31 -msgid "Media tagged with:" -msgstr "媒體檔案被標籤為:" +#: mediagoblin/templates/mediagoblin/listings/tag.html:30 +#: mediagoblin/templates/mediagoblin/listings/tag.html:35 +#, python-format +msgid "Media tagged with: %(tag_name)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +msgid "Original" +msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -367,16 +375,16 @@ msgstr "遞交你的媒體檔案" msgid "Submit" msgstr "送出" -#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:32 +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 +#, python-format +msgid "%(username)s's media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "%(username)s的媒體檔案" -#: 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?" @@ -407,75 +415,80 @@ msgstr "沒有正在處理中的媒體" msgid "These uploads failed to process:" msgstr "無法處理這些更新" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:39 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:59 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:31 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:89 +#, python-format +msgid "%(username)s's profile" +msgstr "%(username)s的個人檔案" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:43 +msgid "Sorry, no such user found." +msgstr "抱歉,找不到這個使用者." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:50 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" msgstr "需要認證電子郵件" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:42 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." msgstr "幾乎完成了!但你的帳號仍然需要被啟用。" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:47 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" msgstr "假設它無法:" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:54 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" msgstr "重送認證信" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:62 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:73 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format msgid "" "If you are that person but you've lost your verification email, you can log in and resend it." msgstr "如果你就是那個人, 但是遺失了認證信, 你可以登入 然後重送一次." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:78 -#, python-format -msgid "%(username)s's profile" -msgstr "%(username)s的個人檔案" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:85 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:101 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 msgid "Edit profile" msgstr "編輯個人檔案" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:96 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." msgstr "這個使用者還沒(來得及)填寫個人檔案。" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:122 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format msgid "View all of %(username)s's media" msgstr "查看%(username)s的全部媒體檔案" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:135 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 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 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" msgstr "新增媒體檔案" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:147 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." msgstr "似乎還沒有任何的媒體檔案..." @@ -495,6 +508,14 @@ msgstr "新一點" msgid "Older" msgstr "舊一點" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "Tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "and" +msgstr "" + #: mediagoblin/user_pages/forms.py:24 msgid "Comment" msgstr "評論" @@ -503,15 +524,23 @@ msgstr "評論" msgid "I am sure I want to delete this" msgstr "我確定我想要刪除" -#: mediagoblin/user_pages/views.py:142 +#: mediagoblin/user_pages/views.py:155 msgid "Empty comments are not allowed." -msgstr "" +msgstr "評論不能空白。" -#: mediagoblin/user_pages/views.py:148 +#: mediagoblin/user_pages/views.py:161 msgid "Comment posted!" +msgstr "評論已經張貼!" + +#: mediagoblin/user_pages/views.py:183 +msgid "You deleted the media." +msgstr "" + +#: mediagoblin/user_pages/views.py:190 +msgid "The media was not deleted because you didn't check that you were sure." msgstr "" -#: mediagoblin/user_pages/views.py:181 +#: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "你在刪除其他人的媒體檔案。請小心處理喔。" -- cgit v1.2.3 From a3663b407997cb8e2d45086641b7eb9f4efd476c Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 28 Nov 2011 09:45:15 +0100 Subject: Mark two strings for translation 1. "Go to page:" in pagination 2. "Submit" in the forget password form --- mediagoblin/templates/mediagoblin/auth/change_fp.html | 2 +- mediagoblin/templates/mediagoblin/utils/pagination.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html index fa972085..5677949c 100644 --- a/mediagoblin/templates/mediagoblin/auth/change_fp.html +++ b/mediagoblin/templates/mediagoblin/auth/change_fp.html @@ -30,7 +30,7 @@ {{ wtforms_util.render_divs(cp_form) }}
- +
diff --git a/mediagoblin/templates/mediagoblin/utils/pagination.html b/mediagoblin/templates/mediagoblin/utils/pagination.html index 84336103..3c12f93c 100644 --- a/mediagoblin/templates/mediagoblin/utils/pagination.html +++ b/mediagoblin/templates/mediagoblin/utils/pagination.html @@ -47,7 +47,7 @@ Next page {% endif %}
- Go to page: + {% trans %}Go to page:{% endtrans %} {%- for page in pagination.iter_pages() %} {% if page %} {% if page != pagination.page %} -- cgit v1.2.3 From 813be2938ae8036573b04cd6ab7beac06efe8f16 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 1 Dec 2011 15:21:15 -0600 Subject: Don't barf on templates that use the autoescaping extension --- babel.ini | 3 +++ 1 file changed, 3 insertions(+) diff --git a/babel.ini b/babel.ini index a4e3267a..1a8231f5 100644 --- a/babel.ini +++ b/babel.ini @@ -4,9 +4,12 @@ [jinja2: mediagoblin/templates/**.html] # Extract jinja templates (html) encoding = utf-8 +extensions = jinja2.ext.autoescape + [jinja2: mediagoblin/templates/**.txt] # Extract jinja templates (text) encoding = utf-8 +extensions = jinja2.ext.autoescape # # Extraction from JavaScript files # [javascript: mediagoblin/static/js/**.js] -- cgit v1.2.3 From 9754802d4bca036b8fb0b50db948dd2eb8f64bd6 Mon Sep 17 00:00:00 2001 From: Elrond Date: Thu, 1 Dec 2011 23:33:47 +0100 Subject: fixture_add_user: Factoring a unit test tool Some unit tests need a user in the database, especially to act as that user. Some routines did that on their own. So factored this whole thing into a new function and use it around. --- mediagoblin/tests/test_auth.py | 8 ++------ mediagoblin/tests/test_edit.py | 21 ++++----------------- mediagoblin/tests/test_submission.py | 12 +++--------- mediagoblin/tests/tools.py | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index 153c6e53..acef3d26 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -20,7 +20,7 @@ import datetime from nose.tools import assert_equal from mediagoblin.auth import lib as auth_lib -from mediagoblin.tests.tools import setup_fresh_app +from mediagoblin.tests.tools import setup_fresh_app, fixture_add_user from mediagoblin import mg_globals from mediagoblin.tools import template, mail @@ -332,11 +332,7 @@ def test_authentication_views(test_app): Test logging in and logging out """ # Make a new user - test_user = mg_globals.database.User() - test_user['username'] = u'chris' - test_user['email'] = u'chris@example.com' - test_user['pw_hash'] = auth_lib.bcrypt_gen_password_hash('toast') - test_user.save() + test_user = fixture_add_user(active_user=False) # Get login # --------- diff --git a/mediagoblin/tests/test_edit.py b/mediagoblin/tests/test_edit.py index 3637b046..c29ddfe9 100644 --- a/mediagoblin/tests/test_edit.py +++ b/mediagoblin/tests/test_edit.py @@ -15,23 +15,16 @@ # along with this program. If not, see . from mediagoblin import mg_globals -from mediagoblin.tests.tools import setup_fresh_app +from mediagoblin.tests.tools import setup_fresh_app, fixture_add_user from mediagoblin.tools import template -from mediagoblin.auth.lib import bcrypt_check_password, \ - bcrypt_gen_password_hash +from mediagoblin.auth.lib import bcrypt_check_password @setup_fresh_app def test_change_password(test_app): """Test changing password correctly and incorrectly""" # set up new user - test_user = mg_globals.database.User() - test_user['username'] = u'chris' - test_user['email'] = u'chris@example.com' - test_user['email_verified'] = True - test_user['status'] = u'active' - test_user['pw_hash'] = bcrypt_gen_password_hash('toast') - test_user.save() + test_user = fixture_add_user() test_app.post( '/auth/login/', { @@ -73,13 +66,7 @@ def test_change_password(test_app): def change_bio_url(test_app): """Test changing bio and URL""" # set up new user - test_user = mg_globals.database.User() - test_user['username'] = u'chris' - test_user['email'] = u'chris@example.com' - test_user['email_verified'] = True - test_user['status'] = u'active' - test_user['pw_hash'] = bcrypt_gen_password_hash('toast') - test_user.save() + test_user = fixture_add_user() # test changing the bio and the URL properly test_app.post( diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py index eea5747f..7ea6c4bc 100644 --- a/mediagoblin/tests/test_submission.py +++ b/mediagoblin/tests/test_submission.py @@ -19,8 +19,8 @@ import pkg_resources 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.tests.tools import setup_fresh_app, get_test_app, \ + fixture_add_user from mediagoblin import mg_globals from mediagoblin.tools import template, common @@ -45,13 +45,7 @@ class TestSubmission: # TODO: Possibly abstract into a decorator like: # @as_authenticated_user('chris') - test_user = mg_globals.database.User() - test_user['username'] = u'chris' - test_user['email'] = u'chris@example.com' - test_user['email_verified'] = True - test_user['status'] = u'active' - test_user['pw_hash'] = auth_lib.bcrypt_gen_password_hash('toast') - test_user.save() + test_user = fixture_add_user() self.test_user = test_user diff --git a/mediagoblin/tests/tools.py b/mediagoblin/tests/tools.py index 01813e96..49a3d33e 100644 --- a/mediagoblin/tests/tools.py +++ b/mediagoblin/tests/tools.py @@ -27,6 +27,7 @@ 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 from mediagoblin.meddleware import BaseMeddleware +from mediagoblin.auth.lib import bcrypt_gen_password_hash MEDIAGOBLIN_TEST_DB_NAME = u'__mediagoblin_tests__' @@ -200,3 +201,19 @@ def assert_db_meets_expected(db, expected): document = collection.find_one({'_id': expected_document['_id']}) assert document is not None # make sure it exists assert document == expected_document # make sure it matches + + +def fixture_add_user(username = u'chris', password = 'toast', + active_user = True): + test_user = mg_globals.database.User() + test_user.username = username + test_user.email = username + u'@example.com' + if password is not None: + test_user.pw_hash = bcrypt_gen_password_hash(password) + if active_user: + test_user.email_verified = True + test_user.status = u'active' + + test_user.save() + + return test_user -- cgit v1.2.3 From c7e1fee1b8eab3c01266c9a349812db598ca8f07 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Thu, 1 Dec 2011 16:58:56 -0600 Subject: Should be 404 for 404s, not 400 :) --- mediagoblin/tools/response.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/tools/response.py b/mediagoblin/tools/response.py index b01d31a2..c905097c 100644 --- a/mediagoblin/tools/response.py +++ b/mediagoblin/tools/response.py @@ -30,7 +30,7 @@ def render_404(request): Render a 404. """ return render_to_response( - request, 'mediagoblin/404.html', {}, status=400) + request, 'mediagoblin/404.html', {}, status=404) def redirect(request, *args, **kwargs): -- cgit v1.2.3 From 93e4622491ff6bed339267cea2a0a98a7af3c8d8 Mon Sep 17 00:00:00 2001 From: Elrond Date: Fri, 2 Dec 2011 00:09:13 +0100 Subject: Expect 404 in unit tests, if we now use 404. Our unit tests for auth were expecting a 400. Well, now we give a 404. So expect that! I'm not completely sure, if the 404 is the right thing here, but that's another topic. --- mediagoblin/tests/test_auth.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index 153c6e53..ee085761 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -280,16 +280,16 @@ def test_register_views(test_app): 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' + new_user._id), status=404) + assert_equal(response.status, '404 Not Found') ## Try using an expired token to change password, shouldn't work template.clear_test_template_context() real_token_expiration = new_user['fp_token_expire'] new_user['fp_token_expire'] = datetime.datetime.now() new_user.save() - response = test_app.get("%s?%s" % (path, get_params), status=400) - assert response.status == '400 Bad Request' + response = test_app.get("%s?%s" % (path, get_params), status=404) + assert_equal(response.status, '404 Not Found') new_user['fp_token_expire'] = real_token_expiration new_user.save() -- cgit v1.2.3 From 92417fc535c32d905957b4f5ef0fd2cfd8d78609 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 2 Dec 2011 21:17:55 +0100 Subject: First push with jQuery library --- extlib/jquery/MIT.txt | 20 ++++++++++++++++++++ extlib/jquery/jquery.js | 4 ++++ mediagoblin/static/js/extlib/jquery.js | 1 + 3 files changed, 25 insertions(+) create mode 100644 extlib/jquery/MIT.txt create mode 100644 extlib/jquery/jquery.js create mode 120000 mediagoblin/static/js/extlib/jquery.js diff --git a/extlib/jquery/MIT.txt b/extlib/jquery/MIT.txt new file mode 100644 index 00000000..5a2aeb47 --- /dev/null +++ b/extlib/jquery/MIT.txt @@ -0,0 +1,20 @@ +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/extlib/jquery/jquery.js b/extlib/jquery/jquery.js new file mode 100644 index 00000000..198b3ff0 --- /dev/null +++ b/extlib/jquery/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/mediagoblin/static/js/extlib/jquery.js b/mediagoblin/static/js/extlib/jquery.js new file mode 120000 index 00000000..d78f5cc3 --- /dev/null +++ b/mediagoblin/static/js/extlib/jquery.js @@ -0,0 +1 @@ +../../../../extlib/jquery/jquery.js \ No newline at end of file -- cgit v1.2.3 From 1e9d1acc03aa42ff979c8d15162d51441b81ec5d Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 2 Dec 2011 16:13:14 -0600 Subject: We should use the variable local_templates instead of user_template_path --- mediagoblin/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/app.py b/mediagoblin/app.py index 7f087ed9..04eb2acc 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -63,7 +63,7 @@ class MediaGoblinApp(object): # Get the template environment self.template_loader = get_jinja_loader( - app_config.get('user_template_path')) + app_config.get('local_templates')) # Set up storage systems self.public_store, self.queue_store = setup_storage() -- cgit v1.2.3 From 0d6e5dddeb38f6af7972485ae186532449719243 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 2 Dec 2011 23:48:40 +0100 Subject: Add show-password checkbox and make it work --- mediagoblin/auth/forms.py | 10 +--------- mediagoblin/templates/mediagoblin/auth/register.html | 20 ++++++++++++++++++++ mediagoblin/templates/mediagoblin/base.html | 3 ++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py index dcb6766c..4cd3e9d8 100644 --- a/mediagoblin/auth/forms.py +++ b/mediagoblin/auth/forms.py @@ -29,15 +29,7 @@ class RegistrationForm(wtforms.Form): password = wtforms.PasswordField( _('Password'), [wtforms.validators.Required(), - wtforms.validators.Length(min=6, max=30), - wtforms.validators.EqualTo( - 'confirm_password', - _('Passwords must match.'))]) - confirm_password = wtforms.PasswordField( - _('Confirm password'), - [wtforms.validators.Required()], - description=_( - u"Type it again here to make sure there are no spelling mistakes.")) + wtforms.validators.Length(min=6, max=30)]) email = wtforms.TextField( _('Email address'), [wtforms.validators.Required(), diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html index a0d0a277..bded1d7e 100644 --- a/mediagoblin/templates/mediagoblin/auth/register.html +++ b/mediagoblin/templates/mediagoblin/auth/register.html @@ -19,6 +19,26 @@ {% import "/mediagoblin/utils/wtforms.html" as wtforms_util %} +{% block mediagoblin_head %} + +{% endblock mediagoblin_head %} + {% block mediagoblin_content %} + {% block mediagoblin_head %} {% endblock mediagoblin_head %} - {% block mediagoblin_body %}
-- cgit v1.2.3 From eae7d0585fc0348a47087919c04e2372d15d244c Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sat, 3 Dec 2011 01:19:15 +0100 Subject: Changed comment error message wording slightly. Btw, should we translate these things? --- mediagoblin/user_pages/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 3d9735f7..779394c7 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -152,13 +152,13 @@ def media_post_comment(request, media): messages.add_message( request, messages.ERROR, - _("Empty comments are not allowed.")) + _("Oops, your comment was empty.")) else: comment.save() messages.add_message( request, messages.SUCCESS, - _('Comment posted!')) + _('Your comment has been posted!')) return exc.HTTPFound( location=media.url_for_self(request.urlgen)) -- cgit v1.2.3 From d463055317e5518adf7c5a99b4724f4e66830b3c Mon Sep 17 00:00:00 2001 From: Manuel Urbano Santos Date: Sat, 3 Dec 2011 14:29:28 +0100 Subject: Change adduser arguments from positional to --keyword style. --- mediagoblin/gmg_commands/users.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py index 4c4b0c1b..a4d85aa4 100644 --- a/mediagoblin/gmg_commands/users.py +++ b/mediagoblin/gmg_commands/users.py @@ -21,14 +21,14 @@ from mediagoblin import mg_globals def adduser_parser_setup(subparser): subparser.add_argument( - 'username', + '--username','-u', help="Username used to login") subparser.add_argument( - 'password', - help="Your supersecret word to login") + '--password','-p', + help="Your supersecret word to login, beware of storing it in bash history") subparser.add_argument( - 'email', - help="Email to recieve notifications") + '--email','-e', + help="Email to receive notifications") def adduser(args): -- cgit v1.2.3 From 7d98005a6b2469134adcf84b7a7417a24968bd8d Mon Sep 17 00:00:00 2001 From: Manuel Urbano Santos Date: Sat, 3 Dec 2011 15:36:02 +0100 Subject: Prompt for arguments in adduser if not present (I created a function in util.py to check and prompt for arguments). --- mediagoblin/gmg_commands/users.py | 5 ++++- mediagoblin/gmg_commands/util.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py index a4d85aa4..b437e839 100644 --- a/mediagoblin/gmg_commands/users.py +++ b/mediagoblin/gmg_commands/users.py @@ -18,7 +18,6 @@ from mediagoblin.gmg_commands import util as commands_util from mediagoblin.auth import lib as auth_lib from mediagoblin import mg_globals - def adduser_parser_setup(subparser): subparser.add_argument( '--username','-u', @@ -35,6 +34,10 @@ def adduser(args): #TODO: Lets trust admins this do not validate Emails :) commands_util.setup_app(args) + args.username = commands_util.prompt_if_not_set(args.username, "Username:") + args.password = commands_util.prompt_if_not_set(args.password, "Password:",True) + args.email = commands_util.prompt_if_not_set(args.email, "Email:") + db = mg_globals.database users_with_username = \ db.User.find({ diff --git a/mediagoblin/gmg_commands/util.py b/mediagoblin/gmg_commands/util.py index 168a0760..af172105 100644 --- a/mediagoblin/gmg_commands/util.py +++ b/mediagoblin/gmg_commands/util.py @@ -16,6 +16,7 @@ from mediagoblin import app +import getpass def setup_app(args): @@ -25,3 +26,15 @@ def setup_app(args): mgoblin_app = app.MediaGoblinApp(args.conf_file) return mgoblin_app + +def prompt_if_not_set(variable,text,password=False): + """ + Checks if the variable is None and prompt for a value if it is + """ + if (variable==None): + if not password: + variable=raw_input(text+' ') + else: + variable=getpass.getpass(text) + + return variable -- cgit v1.2.3 From 968dd9e735eeeee9da0d1c10735e9bba2817e7c0 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 3 Dec 2011 16:45:33 +0100 Subject: Bug #685: Add failing unit test The simplest way to reproduce Bug #685 is to ask for a non existent page. This should return a proper 404. It currently doesn't. So add a unit test exactly for this. This unit test fails currently! It will fail until the bug gets fixed. --- mediagoblin/tests/test_misc.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 mediagoblin/tests/test_misc.py diff --git a/mediagoblin/tests/test_misc.py b/mediagoblin/tests/test_misc.py new file mode 100644 index 00000000..09623355 --- /dev/null +++ b/mediagoblin/tests/test_misc.py @@ -0,0 +1,26 @@ +# 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 . + +from nose.tools import assert_equal + +from mediagoblin.tests.tools import setup_fresh_app + + +@setup_fresh_app +def test_404_for_non_existent(test_app): + assert_equal(test_app.get('/does-not-exist/', + expect_errors=True).status_int, + 404) -- cgit v1.2.3 From 71c6c432a5fe8fe0f96dac284562a8e1b981d669 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 3 Dec 2011 21:20:11 +0100 Subject: Bug #685: only provide CSRF token if it exists This was suggested by Nathan Yergler in the bug logs. Just implementing it. - Let render_csrf_form_token return None, if the CSRF_TOKEN is not available in the environ, because the process_request part of the meddleware has not yet run. - In render_template: If the returned value from above is None, then do not add the csrf_token to the templates context. --- mediagoblin/meddleware/csrf.py | 3 +++ mediagoblin/tools/template.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mediagoblin/meddleware/csrf.py b/mediagoblin/meddleware/csrf.py index 16541bee..a4e4e5c6 100644 --- a/mediagoblin/meddleware/csrf.py +++ b/mediagoblin/meddleware/csrf.py @@ -50,6 +50,9 @@ def render_csrf_form_token(request): """Render the CSRF token in a format suitable for inclusion in a form.""" + if 'CSRF_TOKEN' not in request.environ: + return None + form = CsrfForm(csrf_token=request.environ['CSRF_TOKEN']) return form.csrf_token diff --git a/mediagoblin/tools/template.py b/mediagoblin/tools/template.py index f48b7c2e..d0400347 100644 --- a/mediagoblin/tools/template.py +++ b/mediagoblin/tools/template.py @@ -79,7 +79,9 @@ def render_template(request, template_path, context): template = request.template_env.get_template( template_path) context['request'] = request - context['csrf_token'] = render_csrf_form_token(request) + rendered_csrf_token = render_csrf_form_token(request) + if rendered_csrf_token is not None: + context['csrf_token'] = render_csrf_form_token(request) rendered = template.render(context) if common.TESTS_ENABLED: -- cgit v1.2.3 From a6f065632a8410dc7e032267fd3ef16ae5d9576c Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 3 Dec 2011 16:59:20 -0600 Subject: Updated translations --- mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo | Bin 12268 -> 12629 bytes mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo | Bin 10826 -> 11417 bytes mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo | Bin 11119 -> 11684 bytes mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po | 70 +++++++++---- mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po | 50 +++++++-- mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo | Bin 10809 -> 11489 bytes mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po | 70 +++++++++---- mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo | Bin 11329 -> 11967 bytes mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po | 103 ++++++++++++------ mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo | Bin 11583 -> 12215 bytes mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po | 114 +++++++++++++------- mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo | Bin 10530 -> 11150 bytes mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo | Bin 11026 -> 11534 bytes mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo | Bin 11224 -> 11791 bytes mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo | Bin 10695 -> 11306 bytes mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo | Bin 10287 -> 10845 bytes mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po | 56 ++++++++-- mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo | Bin 10945 -> 11508 bytes mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo | Bin 11067 -> 11761 bytes mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po | 121 ++++++++++++++-------- mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo | Bin 13899 -> 14235 bytes mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po | 56 ++++++++-- mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo | Bin 11267 -> 11701 bytes mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po | 56 ++++++++-- mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo | Bin 10764 -> 11351 bytes mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo | Bin 10627 -> 11247 bytes mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo | Bin 11015 -> 11450 bytes mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo | Bin 10812 -> 11439 bytes mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po | 52 ++++++++-- mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo | Bin 10509 -> 11108 bytes mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po | 107 ++++++++++++------- 41 files changed, 1056 insertions(+), 319 deletions(-) diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo index 4e4e8863..aa6eacac 100644 Binary files a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po index 40e8b1cd..e1188ac9 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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -102,7 +102,7 @@ msgid "Tags" msgstr "الوسوم" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -265,6 +265,11 @@ msgstr "أحدث الوسائط" msgid "Enter your new password" msgstr "أدخل كلمة سرك الجديدة" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "أرسل" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -378,10 +383,6 @@ msgstr "" msgid "Submit yer media" msgstr "انشر وسائطك" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "أرسل" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -392,6 +393,35 @@ msgstr "" msgid "%(username)s's media" msgstr "وسائط %(username)s" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -517,6 +547,10 @@ msgstr "الأحدث" msgid "Older" msgstr "الأقدم" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -534,11 +568,11 @@ msgid "I am sure I want to delete this" msgstr "أنا متأكد من رغبتي بحذف هذا العمل" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo index 9b9e7e3b..203114fc 100644 Binary files a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po index f07ab2d6..a05dc5c0 100644 --- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ca/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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -100,7 +100,7 @@ msgid "Tags" msgstr "Etiquetes" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -262,6 +262,11 @@ msgstr "" msgid "Enter your new password" msgstr "" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Envia" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -368,10 +373,6 @@ msgstr "" 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:30 #, python-format msgid "%(username)s's media" @@ -382,6 +383,35 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)s's media" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -509,6 +539,10 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -526,11 +560,11 @@ msgid "I am sure I want to delete this" msgstr "" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo index 056e3eca..4747bd76 100644 Binary files a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index f5907eda..fc78ed7c 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po @@ -16,8 +16,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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: German (http://www.transifex.net/projects/p/mediagoblin/team/de/)\n" "MIME-Version: 1.0\n" @@ -109,7 +109,7 @@ msgid "Tags" msgstr "Markierungen" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -137,11 +137,11 @@ msgstr "Webseite" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "Altes Passwort" #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "Neues Passwort" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -157,7 +157,7 @@ msgstr "Du bearbeitest das Profil eines Anderen. Bitte sei vorsichtig." #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "Falsches Passwort" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" @@ -217,11 +217,11 @@ msgstr "Medien hochladen" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "Bitte bestätige deine E-Mail-Adresse!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "Abmelden" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -275,6 +275,11 @@ msgstr "Neuste Medien" msgid "Enter your new password" msgstr "Neues Passwort eingeben" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Bestätigen" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -389,20 +394,45 @@ msgstr "" msgid "Submit yer media" msgstr "Medien hochladen" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Bestätigen" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "%(username)ss Medien" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "%(username)ss Medien" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -535,13 +565,17 @@ msgstr "Neuere" msgid "Older" msgstr "Ältere" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "und" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -552,12 +586,12 @@ msgid "I am sure I want to delete this" msgstr "Ja, wirklich löschen" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." -msgstr "Leere Kommentare sind nicht erlaubt." +msgid "Oops, your comment was empty." +msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" -msgstr "Kommentar hinzugefügt!" +msgid "Your comment has been posted!" +msgstr "" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po index c1f3fd7f..3732705c 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-11-27 15:25-0600\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -94,7 +94,7 @@ msgid "Tags" msgstr "" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -256,6 +256,11 @@ msgstr "" msgid "Enter your new password" msgstr "" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -355,10 +360,6 @@ msgstr "" msgid "Submit yer media" msgstr "" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -369,6 +370,35 @@ msgstr "" msgid "%(username)s's media" msgstr "" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -490,6 +520,10 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -507,11 +541,11 @@ msgid "I am sure I want to delete this" msgstr "" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo index c537c65e..02d09486 100644 Binary files a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po index 2cffe874..cfc81d11 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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -102,7 +102,7 @@ msgid "Tags" msgstr "Etikedoj" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -130,11 +130,11 @@ msgstr "Retejo" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "La malnova pasvorto" #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "La nova pasvorto" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -150,7 +150,7 @@ msgstr "Vi redaktas profilon de alia uzanto. Agu singardeme." #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "Malĝusta pasvorto" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" @@ -214,7 +214,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "elsaluti" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -236,7 +236,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Saluton, kaj bonvenon al ĉi tiu MediaGoblina retpaĝaro!" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "Your finest source for all goblin-related media." @@ -268,6 +268,11 @@ msgstr "Plej nove aldonitaj dosieroj" msgid "Enter your new password" msgstr "Enigu vian novan pasvorton" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Alŝuti" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -376,16 +381,12 @@ msgstr "" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" -msgstr "" +msgstr "Originalo" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" msgstr "Alŝutu vian aŭd-vid-dosieron" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Alŝuti" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -396,6 +397,35 @@ msgstr "" msgid "%(username)s's media" msgstr "Dosieroj de %(username)s" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -527,13 +557,17 @@ msgstr "Plinovaj" msgid "Older" msgstr "Malplinovaj" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "kaj" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -544,12 +578,12 @@ msgid "I am sure I want to delete this" msgstr "Mi estas certa, ke mi volas forigi ĉi tion" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." -msgstr "Malplenaj komentoj ne estas afiŝeblaj." +msgid "Oops, your comment was empty." +msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" -msgstr "La komento estas afiŝita!" +msgid "Your comment has been posted!" +msgstr "" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo index 2d2b9243..dba37f0a 100644 Binary files a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po index 6ab070af..88bd4da7 100644 --- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po @@ -14,8 +14,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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mediagoblin/team/es/)\n" "MIME-Version: 1.0\n" @@ -64,7 +64,7 @@ msgstr "Lo sentimos, ya existe un usuario con ese nombre." #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "Lo sentimos, ya existe un usuario con esa dirección de email." #: mediagoblin/auth/views.py:179 msgid "" @@ -82,10 +82,12 @@ msgstr "" #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" msgstr "" +"Debes iniciar sesión para que podamos saber a quién le enviamos el correo " +"electrónico!" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "Ya haz verificado tu dirección de email!" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -109,7 +111,7 @@ msgid "Tags" msgstr "Etiquetas" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -137,11 +139,11 @@ msgstr "Sitio web" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "Vieja contraseña" #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "Nueva contraseña" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -157,15 +159,15 @@ msgstr "Estás editando un perfil de usuario. Proceder con precaución." #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "Contraseña incorrecta" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "Perfil editado!" #: mediagoblin/media_types/__init__.py:61 msgid "Could not find any file extension in \"{filename}\"" -msgstr "" +msgstr "No se pudo encontrar la extensión del archivo en \"{filename}\"" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -185,7 +187,7 @@ msgstr "¡Woohoo! ¡Enviado!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "Tipo de archivo inválido." #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" @@ -217,11 +219,11 @@ msgstr "Enviar contenido" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "Verifica tu email!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "Cerrar sesión" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -243,21 +245,23 @@ msgstr "Explorar" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Hola, bienvenido a este sitio de MediaGoblin!" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "Your finest source for all goblin-related media." -msgstr "" +msgstr "Tu mejor fuente de contenidos relacionados con goblins." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" +"Para añadir tus propios contenidos, dejar comentarios, guardar tus favoritos" +" y más, puedes iniciar sesión con tu cuenta de MediaGoblin." #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "Aún no tienes una? Es fácil!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -266,6 +270,9 @@ msgid "" " or\n" " Set up MediaGoblin on your own server" msgstr "" +"Crea una cuenta en este sitio\n" +" o\n" +" Instala MediaGoblin en tu propio servidor" #: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" @@ -275,13 +282,18 @@ msgstr "El contenido más reciente" msgid "Enter your new password" msgstr "Ingrese su nueva contraseña" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Enviar" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Recuperar contraseña" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" +msgstr "Enviar instrucciones" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -376,30 +388,55 @@ msgstr "Editando el perfil de %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr "Contenido etiquetado con: %(tag_name)s" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" -msgstr "" +msgstr "Original" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" msgstr "Envía tu contenido" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Enviar" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "Contenidos de %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Contenido de %(username)s's" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -532,13 +569,17 @@ msgstr "Recientes" msgid "Older" msgstr "Antiguas" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" -msgstr "" +msgstr "Etiquetado con" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "y" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -549,20 +590,20 @@ msgid "I am sure I want to delete this" msgstr "Estoy seguro de que quiero borrar esto" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Eliminaste el contenido" #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." -msgstr "" +msgstr "El contenido no se eliminó porque no marcaste que estabas seguro." #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo index 90e83303..c7f5701f 100644 Binary files a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po index b37f5217..0bff6c37 100644 --- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po @@ -13,8 +13,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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -64,7 +64,7 @@ msgstr "Un utilisateur existe déjà avec ce nom, désolé." #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "Désolé, il existe déjà un utilisateur ayant cette adresse e-mail." #: mediagoblin/auth/views.py:179 msgid "" @@ -81,10 +81,11 @@ msgstr "La clé de vérification ou le nom d'utilisateur est incorrect." #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" msgstr "" +"Vous devez être authentifié afin que nous sachions à qui envoyer l'e-mail !" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "Votre adresse e-mail a déjà été vérifiée !" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -107,7 +108,7 @@ msgid "Tags" msgstr "Tags" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -135,11 +136,11 @@ msgstr "Site web" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "Ancien mot de passe." #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "Nouveau mot de passe" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -159,15 +160,15 @@ msgstr "" #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "Mauvais mot de passe" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "Profile mis à jour !" #: mediagoblin/media_types/__init__.py:61 msgid "Could not find any file extension in \"{filename}\"" -msgstr "" +msgstr "Impossible d'extraire une extension de fichier de \"{nomfichier}\"" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -187,11 +188,11 @@ msgstr "Youhou, c'est envoyé !" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "Type de fichier invalide." #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" -msgstr "Zut!" +msgstr "Zut !" #: mediagoblin/templates/mediagoblin/404.html:24 msgid "There doesn't seem to be a page at this address. Sorry!" @@ -219,11 +220,11 @@ msgstr "Soumettre un média" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "Vérifiez votre adresse e-mail !" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "déconnexion" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -245,21 +246,23 @@ msgstr "Explorer" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Bonjour, et bienvenu sur ce site MediaGoblin !" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "Your finest source for all goblin-related media." -msgstr "" +msgstr "Là où ce trouve tout vos \"goblinesque\" media." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" +"Ajoutez vos propres medias, commentez ceux des autres, sauvegardez vos " +"préférés et plus encore ! Faites tout cela depuis votre compte MediaGoblin." #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "Vous n'en avez pas ? C'est facile !" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -268,6 +271,9 @@ msgid "" " or\n" " Set up MediaGoblin on your own server" msgstr "" +"Créez un compte sur ce site\n" +" ou\n" +" Déployez MediaGoblin sur votre propre serveur" #: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" @@ -277,13 +283,18 @@ msgstr "Tout derniers media" msgid "Enter your new password" msgstr "Entrez un nouveau mot de passe" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Soumettre" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Récupérer le mot de passe" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" +msgstr "Envoyer les instructions" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -326,11 +337,11 @@ msgstr "La connexion a échoué!" #: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" -msgstr "Pas encore de compte?" +msgstr "Pas encore de compte ?" #: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" -msgstr "Créez-en un ici!" +msgstr "Créez-en un ici !" #: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" @@ -338,7 +349,7 @@ msgstr "Vous avez oublié votre mot de passe ?" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" -msgstr "Créer un compte!" +msgstr "Créer un compte !" #: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" @@ -384,30 +395,55 @@ msgstr "Modification du profil de %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr "Médias taggés avec : %(tag_name)s " #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" -msgstr "" +msgstr "Original" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" msgstr "Soumettez ce média" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Soumettre" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "Medias de %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Médias de %(username)s" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -542,13 +578,17 @@ msgstr "Nouveaux" msgid "Older" msgstr "Anciens" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" -msgstr "" +msgstr "Taggé avec" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "et" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -559,20 +599,22 @@ msgid "I am sure I want to delete this" msgstr "Je suis sûr de vouloir supprimer cela" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." -msgstr "Les commentaires vides ne sont pas autorisés." +msgid "Oops, your comment was empty." +msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" -msgstr "Votre commentaire a été posté !" +msgid "Your comment has been posted!" +msgstr "" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Vous avez supprimé le media." #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." msgstr "" +"Ce media n'a pas été supprimé car vous n'avez pas confirmer que vous étiez " +"sur." #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo index feb156ff..55802ee2 100644 Binary files a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po index a4f1f8d7..7dd3a4f1 100644 --- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ia/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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -96,7 +96,7 @@ msgid "Tags" msgstr "" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -256,6 +256,11 @@ msgstr "" msgid "Enter your new password" msgstr "" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -356,10 +361,6 @@ msgstr "" msgid "Submit yer media" msgstr "" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -370,6 +371,35 @@ msgstr "" msgid "%(username)s's media" msgstr "" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -493,6 +523,10 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -510,11 +544,11 @@ msgid "I am sure I want to delete this" msgstr "" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo index cc0ccbfa..77bfbee9 100644 Binary files a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po index 25700f8f..dc9ec274 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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -98,7 +98,7 @@ msgid "Tags" msgstr "Tags" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -264,6 +264,11 @@ msgstr "Documenti multimediali più recenti" msgid "Enter your new password" msgstr "Inserisci la tua nuova password" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Conferma" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -369,10 +374,6 @@ msgstr "" msgid "Submit yer media" msgstr "Inoltra documento multimediale" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Conferma" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -383,6 +384,35 @@ msgstr "" msgid "%(username)s's media" msgstr "Documenti multimediali di %(username)s" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -513,6 +543,10 @@ msgstr "Più nuovo" msgid "Older" msgstr "Più vecchio" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -530,11 +564,11 @@ msgid "I am sure I want to delete this" msgstr "Sono sicuro di volerlo cancellare" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo index 5267eddc..e2a241a8 100644 Binary files a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po index f2989e0e..5dcf7377 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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -96,7 +96,7 @@ msgid "Tags" msgstr "タグ" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -256,6 +256,11 @@ msgstr "" msgid "Enter your new password" msgstr "" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "送信" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -361,10 +366,6 @@ msgstr "" msgid "Submit yer media" msgstr "コンテンツを投稿" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "送信" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -375,6 +376,35 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)sさんのコンテンツ" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -498,6 +528,10 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -515,11 +549,11 @@ msgid "I am sure I want to delete this" msgstr "" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo index e6d1976b..d7ba8ef6 100644 Binary files a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po index 84957014..dad00867 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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -98,7 +98,7 @@ msgid "Tags" msgstr "Etiket" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -261,6 +261,11 @@ msgstr "" msgid "Enter your new password" msgstr "" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Voeg toe" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -363,10 +368,6 @@ msgstr "" msgid "Submit yer media" msgstr "Voeg media toe" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Voeg toe" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -377,6 +378,35 @@ msgstr "" msgid "%(username)s's media" msgstr "Media van %(username)s " +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -504,6 +534,10 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -521,11 +555,11 @@ msgid "I am sure I want to delete this" msgstr "" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo index ba427c29..a75d86a7 100644 Binary files a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po index 21cfdda5..10fad192 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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -99,7 +99,7 @@ msgid "Tags" msgstr "Merkelappar" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -263,6 +263,11 @@ msgstr "Nyaste mediefiler" msgid "Enter your new password" msgstr "Fyll inn passord" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Send" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -377,10 +382,6 @@ msgstr "" msgid "Submit yer media" msgstr "Last opp" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Send" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -391,6 +392,35 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)s sine mediefiler" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -516,6 +546,10 @@ msgstr "Nyare" msgid "Older" msgstr "Eldre" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -533,12 +567,12 @@ msgid "I am sure I want to delete this" msgstr "Eg er sikker eg vil sletta dette" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." -msgstr "Du må skriva noko i innspelet." +msgid "Oops, your comment was empty." +msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" -msgstr "Innspel lagt til." +msgid "Your comment has been posted!" +msgstr "" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo index 31cb860c..e78b8e3b 100644 Binary files a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po index c4f77f8a..0512f43d 100644 --- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/pt_BR/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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/mediagoblin/team/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -102,7 +102,7 @@ msgid "Tags" msgstr "Etiquetas" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -267,6 +267,11 @@ msgstr "Mídia mais recente" msgid "Enter your new password" msgstr "Digite sua nova senha" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Enviar" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -382,10 +387,6 @@ msgstr "" msgid "Submit yer media" msgstr "Envie sua mídia" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Enviar" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -396,6 +397,35 @@ msgstr "" msgid "%(username)s's media" msgstr "Mídia de %(username)s " +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -526,6 +556,10 @@ msgstr "Mais novo" msgid "Older" msgstr "Mais velho" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -543,11 +577,11 @@ msgid "I am sure I want to delete this" msgstr "Eu tenho certeza de que quero pagar isso" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo index 2ab9cf8b..c2044ccb 100644 Binary files a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po index 96fd46d8..5401c046 100644 --- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ro/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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -57,14 +57,14 @@ msgstr "Ne pare rău, există deja un utilizator cu același nume." #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "Există deja un utilizator înregistrat cu această adresă de e-mail." #: mediagoblin/auth/views.py:179 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" -"Adresa ta de e-mail a fost confirmată. Poți să te autentifici, să îți " +"Adresa ta de e-mail a fost verificată. Poți să te autentifici, să îți " "completezi profilul și să trimiți imagini!" #: mediagoblin/auth/views.py:185 @@ -73,11 +73,11 @@ msgstr "Cheie de verificare sau user ID incorect." #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" -msgstr "" +msgstr "Trebuie să fii autentificat ca să știm cui să trimitem mesajul!" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "Adresa ta de e-mail a fost deja verificată!" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -89,7 +89,7 @@ msgid "" "account's email address has not been verified." msgstr "" "E-mailul pentru recuperarea parolei nu a putut fi trimis deoarece contul tău" -" e inactiv sau adresa ta de e-mail nu a fost confirmată." +" e inactiv sau adresa ta de e-mail nu a fost verificată." #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" @@ -97,10 +97,10 @@ msgstr "Titlu" #: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 msgid "Tags" -msgstr "Etichete" +msgstr "Tag-uri" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -128,11 +128,11 @@ msgstr "Sit Web" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "Vechea parolă" #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "Noua parolă" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -149,15 +149,15 @@ msgstr "Editezi profilul unui utilizator. Se recomandă prudență." #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "Parolă incorectă" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "Profilul a fost modificat!" #: mediagoblin/media_types/__init__.py:61 msgid "Could not find any file extension in \"{filename}\"" -msgstr "" +msgstr "Nu pot extrage extensia din „{filename}”" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -173,19 +173,19 @@ msgstr "Trebuie să selectezi un fișier." #: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" -msgstr "Gata, trimis!" +msgstr "Ura! Trimis!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "Tip de fișier incompatibil." #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" -msgstr "Oops!" +msgstr "Hopa!" #: mediagoblin/templates/mediagoblin/404.html:24 msgid "There doesn't seem to be a page at this address. Sorry!" -msgstr "Ne pare rău, nu există nicio pagină la această adresă." +msgstr "Nu există nicio pagină la această adresă. Ne pare rău!" #: mediagoblin/templates/mediagoblin/404.html:26 msgid "" @@ -209,11 +209,11 @@ msgstr "Transmite un fișier media" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "Verifică adresa de e-mail!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "ieșire" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -235,21 +235,23 @@ msgstr "Explorează" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Salut, bine ai venit pe acest site MediaGoblin!" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "Your finest source for all goblin-related media." -msgstr "" +msgstr "Locul unde elfii își transmit fișierele media." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" +"Ca să adăugi propriile tale fișiere, să scrii comentarii, să salvezi " +"favoritele tale și multe altele, autentifică-te cu contul tău MediaGoblin." #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "Încă nu ai unul? E simplu!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -258,6 +260,9 @@ msgid "" " or\n" " Set up MediaGoblin on your own server" msgstr "" +"Creează un cont pe acest site\n" +" sau\n" +" Instalează MediaGoblin pe propriul tău server" #: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" @@ -267,13 +272,18 @@ msgstr "Cele mai recente fișiere" msgid "Enter your new password" msgstr "Introdu noua parolă" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Trimite" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Recuperează parola" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" +msgstr "Trimite instrucțiuni" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -371,30 +381,55 @@ msgstr "Editare profil %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr "Fișier etichetat cu tag-urile: %(tag_name)s" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" -msgstr "" +msgstr "Original" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" msgstr "Trimite fișierele tale media" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Trimite" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "Fișierele lui %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Fișierele media ale lui %(username)s" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -438,7 +473,7 @@ msgstr "Ne pare rău, nu am găsit utilizatorul căutat." #: mediagoblin/templates/mediagoblin/user_pages/user.html:50 #: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" -msgstr "Este necesară confirmarea adresei de e-mail" +msgstr "Este necesară verificarea adresei de e-mail" #: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." @@ -524,13 +559,17 @@ msgstr "Mai noi" msgid "Older" msgstr "Mai vechi" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" -msgstr "" +msgstr "Tag-uri" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "și" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -541,20 +580,20 @@ msgid "I am sure I want to delete this" msgstr "Sunt sigur că doresc să șterg" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." -msgstr "Comentariul trebuie să aibă un conținut." +msgid "Oops, your comment was empty." +msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" -msgstr "Comentariul a fost transmis." +msgid "Your comment has been posted!" +msgstr "" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Ai șters acest fișier" #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." -msgstr "" +msgstr "Fișierul nu a fost șters deoarece nu ai confirmat că ești sigur." #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo index 4b5481e0..19765967 100644 Binary files a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po index 9fb1ce08..cee135ca 100644 --- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ru/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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -101,7 +101,7 @@ msgid "Tags" msgstr "Метки" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -266,6 +266,11 @@ msgstr "Самые новые файлы" msgid "Enter your new password" msgstr "Введите свой новый пароль" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Подтвердить" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -382,10 +387,6 @@ msgstr "" msgid "Submit yer media" msgstr "Загрузить файл(ы)" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Подтвердить" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -396,6 +397,35 @@ msgstr "" msgid "%(username)s's media" msgstr "Файлы пользователя %(username)s" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -525,6 +555,10 @@ msgstr "Более новые" msgid "Older" msgstr "Более старые" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -542,12 +576,12 @@ msgid "I am sure I want to delete this" msgstr "Я уверен, что хочу удалить это" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." -msgstr "Empty comments are not allowed." +msgid "Oops, your comment was empty." +msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" -msgstr "Комментарий размещён!" +msgid "Your comment has been posted!" +msgstr "" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo index 684c850a..10699d0b 100644 Binary files a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po index bee7b3b5..30622dee 100644 --- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sk/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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -100,7 +100,7 @@ msgid "Tags" msgstr "Štítky" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -264,6 +264,11 @@ msgstr "Najčerstvejšie výtvory" msgid "Enter your new password" msgstr "Vlož svoje nové heslo" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Vložiť" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -380,10 +385,6 @@ msgstr "" 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:30 #, python-format msgid "%(username)s's media" @@ -394,6 +395,35 @@ msgstr "" msgid "%(username)s's media" msgstr "Výtvory, ktoré vlastní %(username)s" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -522,6 +552,10 @@ msgstr "Novšie" msgid "Older" msgstr "Staršie" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -539,12 +573,12 @@ msgid "I am sure I want to delete this" msgstr "Jednoznačne to chcem odstrániť" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." -msgstr "Komentáre bez obsahu nepovolené." +msgid "Oops, your comment was empty." +msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" -msgstr "Komentár odoslaný!" +msgid "Your comment has been posted!" +msgstr "" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo index 52e3d632..5d6a0fe2 100644 Binary files a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po index 77273ebe..568a5f73 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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -98,7 +98,7 @@ msgid "Tags" msgstr "Oznake" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -260,6 +260,11 @@ msgstr "" msgid "Enter your new password" msgstr "" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Pošlji" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -366,10 +371,6 @@ msgstr "" msgid "Submit yer media" msgstr "Pošljite svojo vsebino" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Pošlji" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -380,6 +381,35 @@ msgstr "" msgid "%(username)s's media" msgstr "Vsebina uporabnika %(username)s" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -507,6 +537,10 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -524,11 +558,11 @@ msgid "I am sure I want to delete this" msgstr "" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo index d2649938..deb56104 100644 Binary files a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po index 0bdfc21c..63f92fdc 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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\n" "MIME-Version: 1.0\n" @@ -95,7 +95,7 @@ msgid "Tags" msgstr "" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -255,6 +255,11 @@ msgstr "" msgid "Enter your new password" msgstr "" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -355,10 +360,6 @@ msgstr "" msgid "Submit yer media" msgstr "" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -369,6 +370,35 @@ msgstr "" msgid "%(username)s's media" msgstr "" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -492,6 +522,10 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -509,11 +543,11 @@ msgid "I am sure I want to delete this" msgstr "" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo index 2ae7c510..b2194da9 100644 Binary files a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po index 37bd36c1..0e48dc53 100644 --- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sv/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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n" "MIME-Version: 1.0\n" @@ -101,7 +101,7 @@ msgid "Tags" msgstr "Taggar" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -265,6 +265,11 @@ msgstr "Senast medier" msgid "Enter your new password" msgstr "Fyll i ditt lösenord" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "Skicka" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -380,10 +385,6 @@ msgstr "" msgid "Submit yer media" msgstr "Ladda upp" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Skicka" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -394,6 +395,35 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)ss media" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -525,6 +555,10 @@ msgstr "Nyare" msgid "Older" msgstr "Äldre" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -542,11 +576,11 @@ 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:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo index b0d8d3fc..2ac4c41c 100644 Binary files a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po index 064fa7d1..816f2580 100644 --- a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/te/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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -96,7 +96,7 @@ msgid "Tags" msgstr "" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -256,6 +256,11 @@ msgstr "" msgid "Enter your new password" msgstr "" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "దాఖలు చెయ్యి" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" msgstr "" @@ -356,10 +361,6 @@ msgstr "" msgid "Submit yer media" msgstr "" -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "దాఖలు చెయ్యి" - #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" @@ -370,6 +371,35 @@ msgstr "" msgid "%(username)s's media" msgstr "" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -493,6 +523,10 @@ msgstr "" msgid "Older" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" msgstr "" @@ -510,11 +544,11 @@ msgid "I am sure I want to delete this" msgstr "" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." +msgid "Oops, your comment was empty." msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" +msgid "Your comment has been posted!" msgstr "" #: mediagoblin/user_pages/views.py:183 diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo index e3751aeb..33400cef 100644 Binary files a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po index 5e406b41..6bc7a717 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-11-27 15:25-0600\n" -"PO-Revision-Date: 2011-11-27 21:28+0000\n" +"POT-Creation-Date: 2011-12-03 16:57-0600\n" +"PO-Revision-Date: 2011-12-03 22:56+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -58,7 +58,7 @@ msgstr "抱歉, 這個使用者名稱已經存在." #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "抱歉,此電子郵件已被註冊了。" #: mediagoblin/auth/views.py:179 msgid "" @@ -72,11 +72,11 @@ msgstr "認證碼或是使用者帳號錯誤" #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" -msgstr "" +msgstr "你必須登入,我們才知道信要送給誰!" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "你的電子郵件已經確認了!" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -97,7 +97,7 @@ msgid "Tags" msgstr "標籤" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas or spaces." +msgid "Seperate tags by commas." msgstr "" #: mediagoblin/edit/forms.py:33 @@ -123,11 +123,11 @@ msgstr "網站" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "舊的密碼" #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "新的密碼" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -143,15 +143,15 @@ msgstr "你正在編輯一位用戶的檔案. 請謹慎處理." #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "密碼錯誤" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "個人資料已被編輯了!" #: mediagoblin/media_types/__init__.py:61 msgid "Could not find any file extension in \"{filename}\"" -msgstr "" +msgstr "找不到任何 \"{filename}\" 的附檔名。" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -171,7 +171,7 @@ msgstr "呼呼! 送出去嚕!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "不正確的檔案格式" #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" @@ -201,11 +201,11 @@ msgstr "遞交媒體" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "確認你的電子郵件" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "登出" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -227,21 +227,21 @@ msgstr "探索" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "嘿!歡迎來到 媒體怪獸(MediaGoblin) 網站" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "Your finest source for all goblin-related media." -msgstr "" +msgstr "你是媒體怪獸的相關媒體最珍貴的來源。" #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." -msgstr "" +msgstr "你可以用 媒體怪獸 帳號登入,加入你自己的媒體檔案,加入評語,把你的最愛儲存起來。" #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "還沒有嗎?其實非常簡單!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -250,6 +250,9 @@ msgid "" " or\n" " Set up MediaGoblin on your own server" msgstr "" +"在這網站建立帳號\n" +" 或是\n" +" 建立一個自己的媒體怪獸(MedaiGoblin)" #: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" @@ -259,13 +262,18 @@ msgstr "最新的媒體" msgid "Enter your new password" msgstr "輸入你的新密碼" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Submit" +msgstr "送出" + #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "找回密碼" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" +msgstr "送出指示" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -361,30 +369,55 @@ msgstr "編輯 %(username)s'的檔案中" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr "此媒體被標識為:%(tag_name)s" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" -msgstr "" +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:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "%(username)s的媒體" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "%(username)s的媒體檔案" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#, python-format +msgid "By %(username)s on %(date)s" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +msgid "Post a comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +msgid "Post comment!" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +msgid "Edit" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 +msgid "Sorry, no such media found." +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -508,13 +541,17 @@ msgstr "新一點" msgid "Older" msgstr "舊一點" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +msgid "Go to page:" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" -msgstr "" +msgstr "被標籤為" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "且" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -525,20 +562,20 @@ msgid "I am sure I want to delete this" msgstr "我確定我想要刪除" #: mediagoblin/user_pages/views.py:155 -msgid "Empty comments are not allowed." -msgstr "評論不能空白。" +msgid "Oops, your comment was empty." +msgstr "" #: mediagoblin/user_pages/views.py:161 -msgid "Comment posted!" -msgstr "評論已經張貼!" +msgid "Your comment has been posted!" +msgstr "" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "你已刪除此媒體檔案。" #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." -msgstr "" +msgstr "此媒體檔案尚未被刪除因為你還沒有確認你真的要刪除。" #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." -- cgit v1.2.3 From cc4f83faabda361301210a6ba66c3ae5c7305a6a Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 3 Dec 2011 21:38:45 -0600 Subject: Raise a slightly useful exception when we can't find the media type. --- mediagoblin/media_types/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index 61786562..25f3d255 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -51,6 +51,10 @@ def get_media_manager(_media_type = None): if media_type in _media_type: return manager + # Nope? Then raise an error + raise FileTypeNotSupported( + "MediaManager not in enabled types. Check media_types in config?") + def get_media_type_and_manager(filename): for media_type, manager in get_media_managers(): -- cgit v1.2.3 From bbac7663f4b05430592ac5d39f056029dc11db92 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 3 Dec 2011 21:56:30 -0600 Subject: PEP-8'ifying prompt_if_not_set --- mediagoblin/gmg_commands/util.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mediagoblin/gmg_commands/util.py b/mediagoblin/gmg_commands/util.py index af172105..004f9e49 100644 --- a/mediagoblin/gmg_commands/util.py +++ b/mediagoblin/gmg_commands/util.py @@ -27,13 +27,13 @@ def setup_app(args): return mgoblin_app -def prompt_if_not_set(variable,text,password=False): +def prompt_if_not_set(variable, text, password=False): """ Checks if the variable is None and prompt for a value if it is """ - if (variable==None): + if variable is None: if not password: - variable=raw_input(text+' ') + variable=raw_input(text + u' ') else: variable=getpass.getpass(text) -- cgit v1.2.3 From bb20c179c43cc9aec2cb7a3160dc734e58961609 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 3 Dec 2011 21:59:52 -0600 Subject: Most users won't see this but having space after prompt still nice for passwords. --- mediagoblin/gmg_commands/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/gmg_commands/util.py b/mediagoblin/gmg_commands/util.py index 004f9e49..3e26c53f 100644 --- a/mediagoblin/gmg_commands/util.py +++ b/mediagoblin/gmg_commands/util.py @@ -35,6 +35,6 @@ def prompt_if_not_set(variable, text, password=False): if not password: variable=raw_input(text + u' ') else: - variable=getpass.getpass(text) + variable=getpass.getpass(text + u' ') return variable -- cgit v1.2.3 From 21e84329569a356deab73ed2b98d16b91af16b0f Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 4 Dec 2011 10:21:58 -0600 Subject: Change "Your finest source of goblin related media" to something else We don't want to insist everyone hold a goblin-related gallery :) --- mediagoblin/templates/mediagoblin/root.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html index 25ce9e96..0f769f2f 100644 --- a/mediagoblin/templates/mediagoblin/root.html +++ b/mediagoblin/templates/mediagoblin/root.html @@ -25,7 +25,7 @@ {% else %}

{% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}

-

{% trans %}Your finest source for all goblin-related media.{% endtrans %}

+

{% trans %}This site is running MediaGoblin, an extraordinarily great piece of media hosting software.{% endtrans %}

{% trans %}To add your own media, place comments, save your favourites and more, you can log in with your MediaGoblin account.{% endtrans %}

{% if allow_registration %}

{% trans %}Don't have one yet? It's easy!{% endtrans %}

-- cgit v1.2.3 From f80f5b58a818dfcbbf984fc3e580df5fbf04917b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 4 Dec 2011 10:24:42 -0600 Subject: Removing the conditional that checks if there's a media in media.html If there isn't a media, we shouldn't hit that template! The view should ensure that. --- .../templates/mediagoblin/user_pages/media.html | 246 ++++++++++----------- 1 file changed, 121 insertions(+), 125 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 7434664c..caa99eb7 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -23,143 +23,139 @@ {% block title %}{{ media.title }} — {{ super() }}{% endblock %} {% block mediagoblin_content %} - {% if media %} -
-
- {% block mediagoblin_media %} - {% set display_media = request.app.public_store.file_url( - media.get_display_media(media.media_files)) %} +
+
+ {% block mediagoblin_media %} + {% set display_media = request.app.public_store.file_url( + media.get_display_media(media.media_files)) %} - {# if there's a medium file size, that means the medium size - # isn't the original... so link to the original! - #} - {% if media['media_files'].has_key('medium') %} - - Image for {{ media.title }} - - {% else %} + {# if there's a medium file size, that means the medium size + # isn't the original... so link to the original! + #} + {% if media['media_files'].has_key('medium') %} + Image for {{ media.title }} - {% endif %} - {% endblock %} -
+ + {% else %} + Image for {{ media.title }} + {% endif %} + {% endblock %} +
-

- {{ media.title }} -

- {% autoescape False %} -

{{ media.description_html }}

- {% endautoescape %} -

- {% trans date=media.created.strftime("%Y-%m-%d"), - user_url=request.urlgen( - 'mediagoblin.user_pages.user_home', - user=media.get_uploader().username), - username=media.get_uploader().username -%} - By {{ username }} on {{ date }} - {%- endtrans %} -

-

- {% if request.user and comments.count() %} -

{% trans %}Post a comment{% endtrans %}

- {% endif %} - {% if comments %} - {% for comment in comments %} - {% set comment_author = comment.author() %} - {% if pagination.active_id == comment._id %} -
- - {% else %} -
- {% endif %} +

+ {{ media.title }} +

+ {% autoescape False %} +

{{ media.description_html }}

+ {% endautoescape %} +

+ {% trans date=media.created.strftime("%Y-%m-%d"), + user_url=request.urlgen( + 'mediagoblin.user_pages.user_home', + user=media.get_uploader().username), + username=media.get_uploader().username -%} + By {{ username }} on {{ date }} + {%- endtrans %} +

+

+ {% if request.user and comments.count() %} +

{% trans %}Post a comment{% endtrans %}

+ {% endif %} + {% if comments %} + {% for comment in comments %} + {% set comment_author = comment.author() %} + {% if pagination.active_id == comment._id %} +
+ + {% else %} +
+ {% endif %} -
{% autoescape False %}{{ comment.content_html }} - {% endautoescape %} - - - {{ comment_author['username'] }} - {% trans %}at{% endtrans %} - - {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }} - -
+
{% autoescape False %}{{ comment.content_html }} + {% endautoescape %} + + + {{ comment_author['username'] }} + {% trans %}at{% endtrans %} + + {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }} +
- {% endfor %} +
+ {% endfor %} - {% if request.user %} - - {{ wtforms_util.render_divs(comment_form) }} -
- - {{ csrf_token }} -
- - {% endif %} + {% if request.user %} +
+ {{ wtforms_util.render_divs(comment_form) }} +
+ + {{ csrf_token }} +
+ + {% endif %} - {{ render_pagination(request, pagination, - request.urlgen('mediagoblin.user_pages.media_home', - user = media.get_uploader().username, - media = media._id)) }} -
- {% endif %} + {{ render_pagination(request, pagination, + request.urlgen('mediagoblin.user_pages.media_home', + user = media.get_uploader().username, + media = media._id)) }} +
+ {% endif %} -
- {% include "mediagoblin/utils/prev_next.html" %} +
+ {% include "mediagoblin/utils/prev_next.html" %} - {% if media['uploader'] == request.user._id or - request.user['is_admin'] %} -

- {% set edit_url = request.urlgen('mediagoblin.edit.edit_media', - user= media.get_uploader().username, - media= media._id) %} - {% trans %}Edit{% endtrans %} -

-

- {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', - user= media.get_uploader().username, - media= media._id) %} - {% trans %}Delete{% endtrans %} -

- {% endif %} + {% if media['uploader'] == request.user._id or + request.user['is_admin'] %} +

+ {% set edit_url = request.urlgen('mediagoblin.edit.edit_media', + user= media.get_uploader().username, + media= media._id) %} + {% trans %}Edit{% endtrans %} +

+

+ {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', + user= media.get_uploader().username, + media= media._id) %} + {% trans %}Delete{% endtrans %} +

+ {% endif %} - {% if media.attachment_files|count %} -

Attachments

- - {% endif %} + {% if media.attachment_files|count %} +

Attachments

+ + {% endif %} - {% if app_config['allow_attachments'] - and (media['uploader'] == request.user._id - or request.user['is_admin']) %} -

- Add attachment -

- {% endif %} + {% if app_config['allow_attachments'] + and (media['uploader'] == request.user._id + or request.user['is_admin']) %} +

+ Add attachment +

+ {% endif %} - {% if media.tags %} - {% include "mediagoblin/utils/tags.html" %} - {% endif %} -
- {% else %} -

{% trans %}Sorry, no such media found.{% endtrans %}

- {% endif %} + {% if media.tags %} + {% include "mediagoblin/utils/tags.html" %} + {% endif %} +

{% endblock %} -- cgit v1.2.3 From b25b00d26e41158591822f5570c15f1baf2bc30b Mon Sep 17 00:00:00 2001 From: tycho garen Date: Sun, 4 Dec 2011 14:51:00 -0500 Subject: DOCS: update to deployment documentation and new production deployments doc --- docs/source/deploying.rst | 10 +++---- docs/source/production-deployments.rst | 48 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 docs/source/production-deployments.rst diff --git a/docs/source/deploying.rst b/docs/source/deploying.rst index b944a3d3..9c0acf30 100644 --- a/docs/source/deploying.rst +++ b/docs/source/deploying.rst @@ -244,7 +244,7 @@ Production MediaGoblin Deployments with Paste The instance configured with ``lazyserver`` is not ideal for a production MediaGoblin deployment. Ideally, you should be able to use -a a control script (i.e. init script.) to launch and restart the +a control script (i.e. init script.) to launch and restart the MediaGoblin process. Use the following command as the basis for such a script: :: @@ -252,13 +252,13 @@ Use the following command as the basis for such a script: :: CELERY_ALWAYS_EAGER=true \ /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \ /srv/mediagoblin.example.org/mediagoblin/paste.ini \ - --pid-file=/tmp/mediagoblin.pid \ + --pid-file=/var/run/mediagoblin.pid \ --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 \ .. note:: The above configuration places MediaGoblin in "always eager" mode with Celery. This is fine for development and smaller - deployments. However, if you're getting into the really large - deployment category, consider reading the section of this manual on - Celery. + deployments. However, for larger production deployments with larger + processing requirements, see the ":doc:`production-deployments`" + documentation. diff --git a/docs/source/production-deployments.rst b/docs/source/production-deployments.rst new file mode 100644 index 00000000..37251734 --- /dev/null +++ b/docs/source/production-deployments.rst @@ -0,0 +1,48 @@ +========================================= +Considerations for Production Deployments +========================================= + +This document contains a number of suggestions for deploying +MediaGoblin in actual production environments. Consider +":doc:`deploying`" for a basic overview of how to deploy Media +Goblin. + +Celery +------ + +While the ``./lazyserer.sh`` configuration provides an efficient way to +start using a MediaGoblin instance, it is not suitable for production +deployments for several reasons: + +1. In nearly every scenario, work on the Celery queue will need to + balance with the demands of other processes, and cannot proceed + synchronously. This is a particularly relevant problem if you use + MediaGoblin to host Video content. + +2. Processing with Celery ought to be operationally separate from the + MediaGoblin application itself, this simplifies management and + support better workload distribution. + +3. ... additional reason here. .... + +Build an :ref:`init script ` around the following +command. + + CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery ./bin/celeryd + +Modify your existing MediaGoblin and application init scripts, if +necessary, to prevent them from starting their own ``celeryd`` +processes. + +.. _init-script: + +Use an Init Script +------------------- + +TODO insert init script here + +Other Concerns +-------------- + +TODO What are they? + -- cgit v1.2.3 From b3efea3c79097ab5ea080f4c39ea59c2994fca5c Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 4 Dec 2011 13:56:55 -0600 Subject: Updated translations --- mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po | 42 +++++---- mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po | 24 +++-- mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po | 88 ++++++++++--------- mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po | 54 ++++++------ mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po | 28 +++--- mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po | 53 +++++------ mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po | 102 ++++++++++++---------- mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po | 26 +++--- mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po | 28 +++--- 21 files changed, 371 insertions(+), 386 deletions(-) diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po index e1188ac9..61abc63f 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -156,7 +156,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -236,7 +236,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -393,35 +395,31 @@ msgstr "" msgid "%(username)s's media" msgstr "وسائط %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po index a05dc5c0..9609cb34 100644 --- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ca/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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -152,7 +152,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -233,7 +233,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -383,35 +385,31 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)s's media" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index fc78ed7c..7d7e0ee9 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po @@ -16,9 +16,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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" -"Last-Translator: cwebber \n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:26+0000\n" +"Last-Translator: elrond \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" @@ -65,7 +65,7 @@ msgstr "Leider gibt es bereits einen Benutzer mit diesem Namen." #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "Leider gibt es bereits einen Benutzer mit dieser E-Mail-Adresse." #: mediagoblin/auth/views.py:179 msgid "" @@ -85,7 +85,7 @@ msgstr "" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "Deine E-Mail-Adresse wurde bereits bestätigt." #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -161,9 +161,9 @@ msgstr "Falsches Passwort" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "Das Profil wurde aktualisiert" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -246,7 +246,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -384,7 +386,7 @@ msgstr "%(username)ss Profil bearbeiten" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr ": %(tag_name)s" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" @@ -404,34 +406,30 @@ msgstr "%(username)ss Medien" msgid "%(username)s's media" msgstr "%(username)ss Medien" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "Bearbeiten" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" +msgstr "Löschen" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -571,7 +569,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" -msgstr "" +msgstr "Markiert mit" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po index 3732705c..17e6873c 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-12-03 16:57-0600\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -145,7 +145,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -224,7 +224,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, " +"an extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -370,35 +372,31 @@ msgstr "" msgid "%(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po index cfc81d11..e5c6356e 100644 --- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po @@ -10,9 +10,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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" -"Last-Translator: cwebber \n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 19:15+0000\n" +"Last-Translator: aleksejrs \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -59,7 +59,7 @@ msgstr "Bedaŭrinde, uzanto kun tiu nomo jam ekzistas." #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "Ni bedaŭras, sed konto kun tiu retpoŝtadreso jam ekzistas." #: mediagoblin/auth/views.py:179 msgid "" @@ -75,11 +75,11 @@ msgstr "La kontrol-kodo aŭ la uzantonomo ne estas korekta" #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" -msgstr "" +msgstr "Vi devas esti ensalutita, por ke ni sciu, al kiu sendi la retleteron!" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "Vi jam konfirmis vian retpoŝtadreson!" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -103,7 +103,7 @@ msgstr "Etikedoj" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "" +msgstr "Dividu la etikedojn per komoj." #: mediagoblin/edit/forms.py:33 msgid "Slug" @@ -154,11 +154,11 @@ msgstr "Malĝusta pasvorto" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "La profilŝanĝo faritas!" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" -msgstr "" +msgstr "Ŝajnas, ke en «{filename}» mankas dosiernoma finaĵo" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -178,7 +178,7 @@ msgstr "Hura! Alŝutitas!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "Netaŭga dosiertipo." #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" @@ -210,7 +210,7 @@ msgstr "Alŝuti aŭd-vid-dosieron" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "Konfirmu viecon de la retpoŝtadreso!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" @@ -232,25 +232,32 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:24 msgid "Explore" -msgstr "" +msgstr "Ĉirkaŭrigardi" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Saluton, kaj bonvenon al ĉi tiu MediaGoblina retpaĝaro!" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" +"Ĉi tiu retpaĝaro funkcias per MediaGoblin, eksterordinare bonega " +"programaro por gastigado de aŭd‐vid‐dosieroj." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" +"Por aldoni viajn proprajn dosierojn, fari liston de plej plaĉantaj por vi, " +"ks, vi povas ensaluti je via MediaGoblina konto." #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "Ĉu vi ankoraŭ ne havas tian? Ne malĝoju!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -259,6 +266,9 @@ msgid "" " or\n" " Set up MediaGoblin on your own server" msgstr "" +"Kreu konton en ĉi tiu retejo\n" +" aŭ\n" +" Ekfunkciigu MediaGoblin’on en via propra servilo" #: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" @@ -275,11 +285,11 @@ msgstr "Alŝuti" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Ekhavo de nova pasvorto" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" +msgstr "Sendi instrukcion" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -377,7 +387,7 @@ msgstr "Redaktado de l’profilo de %(username)s'" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr "Dosieroj kun etikedo: %(tag_name)s" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" @@ -390,41 +400,37 @@ msgstr "Alŝutu vian aŭd-vid-dosieron" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "Dosieroj de %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Dosieroj de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" -msgstr "" +msgstr "Afiŝita de %(username)s je %(date)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" -msgstr "" +msgstr "Afiŝi komenton" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" -msgstr "" +msgstr "je" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" -msgstr "" +msgstr "Afiŝi la komenton!" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "Ŝanĝi" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" +msgstr "Forigi" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -559,11 +565,11 @@ msgstr "Malplinovaj" #: mediagoblin/templates/mediagoblin/utils/pagination.html:50 msgid "Go to page:" -msgstr "" +msgstr "Iri al paĝo:" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" -msgstr "" +msgstr "Markita per: " #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" @@ -579,19 +585,21 @@ msgstr "Mi estas certa, ke mi volas forigi ĉi tion" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Oj, via komento estis malplena." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "Via komento estis afiŝita!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Vi forigis la dosieron." #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." msgstr "" +"La dosiero ne estis forigita, ĉar vi ne konfirmis vian certecon per la " +"markilo." #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po index 88bd4da7..460c074c 100644 --- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po @@ -10,13 +10,14 @@ # , 2011. # , 2011. # Mario Rodriguez , 2011. +# , 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" -"Last-Translator: cwebber \n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:49+0000\n" +"Last-Translator: manolinux \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mediagoblin/team/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -112,7 +113,7 @@ msgstr "Etiquetas" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "" +msgstr "Separar etiquetas por comas." #: mediagoblin/edit/forms.py:33 msgid "Slug" @@ -165,7 +166,7 @@ msgstr "Contraseña incorrecta" msgid "Profile edited!" msgstr "Perfil editado!" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "No se pudo encontrar la extensión del archivo en \"{filename}\"" @@ -248,8 +249,13 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Hola, bienvenido a este sitio de MediaGoblin!" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." -msgstr "Tu mejor fuente de contenidos relacionados con goblins." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." +msgstr "" +"Este sitio está montado con MediaGoblin, un programa libre buenísimo" +" para gestionar contenido multimedia." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" @@ -408,34 +414,30 @@ msgstr "Contenidos de %(username)s" msgid "%(username)s's media" msgstr "Contenido de %(username)s's" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" -msgstr "" +msgstr "Por %(username)s en %(date)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" -msgstr "" +msgstr "Pon un comentario." -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" -msgstr "" +msgstr "en" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" -msgstr "" +msgstr "¡Pon un comentario!" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "Editar" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" +msgstr "Borrar" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -571,7 +573,7 @@ msgstr "Antiguas" #: mediagoblin/templates/mediagoblin/utils/pagination.html:50 msgid "Go to page:" -msgstr "" +msgstr "Ir a la página:" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" @@ -591,11 +593,11 @@ msgstr "Estoy seguro de que quiero borrar esto" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Ups, tu comentario estaba vacío." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "¡Tu comentario ha sido publicado!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po index 0bff6c37..8d1e2711 100644 --- a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po @@ -13,8 +13,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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -166,7 +166,7 @@ msgstr "Mauvais mot de passe" msgid "Profile edited!" msgstr "Profile mis à jour !" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "Impossible d'extraire une extension de fichier de \"{nomfichier}\"" @@ -249,8 +249,10 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Bonjour, et bienvenu sur ce site MediaGoblin !" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." -msgstr "Là où ce trouve tout vos \"goblinesque\" media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." +msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" @@ -415,35 +417,31 @@ msgstr "Medias de %(username)s" msgid "%(username)s's media" msgstr "Médias de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po index 7dd3a4f1..512635e3 100644 --- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ia/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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -148,7 +148,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -227,7 +227,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -371,35 +373,31 @@ msgstr "" msgid "%(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po index dc9ec274..96d1f0a2 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -152,7 +152,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -235,7 +235,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -384,35 +386,31 @@ msgstr "" msgid "%(username)s's media" msgstr "Documenti multimediali di %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po index 5dcf7377..3198eed9 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -148,7 +148,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -227,7 +227,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -376,35 +378,31 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)sさんのコンテンツ" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po index dad00867..c1778676 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -153,7 +153,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -232,7 +232,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -378,35 +380,31 @@ msgstr "" msgid "%(username)s's media" msgstr "Media van %(username)s " -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po index 10fad192..0b0c2a27 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -151,7 +151,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -234,7 +234,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -392,35 +394,31 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)s sine mediefiler" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po index 0512f43d..daa65e0f 100644 --- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/pt_BR/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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/mediagoblin/team/pt_BR/)\n" "MIME-Version: 1.0\n" @@ -155,7 +155,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -238,7 +238,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -397,35 +399,31 @@ msgstr "" msgid "%(username)s's media" msgstr "Mídia de %(username)s " -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po index 5401c046..b747fc3a 100644 --- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po @@ -4,13 +4,14 @@ # # Translators: # , 2011. +# George Pop , 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" -"Last-Translator: cwebber \n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 18:41+0000\n" +"Last-Translator: gap \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -101,7 +102,7 @@ msgstr "Tag-uri" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "" +msgstr "Desparte tag-urile prin virgulă." #: mediagoblin/edit/forms.py:33 msgid "Slug" @@ -155,7 +156,7 @@ msgstr "Parolă incorectă" msgid "Profile edited!" msgstr "Profilul a fost modificat!" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "Nu pot extrage extensia din „{filename}”" @@ -238,8 +239,12 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Salut, bine ai venit pe acest site MediaGoblin!" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." -msgstr "Locul unde elfii își transmit fișierele media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." +msgstr "" +"Acest site folosește MediaGoblin, un " +"software excepțional pentru găzduirea fișierelor media." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" @@ -401,34 +406,30 @@ msgstr "Fișierele lui %(username)s" msgid "%(username)s's media" msgstr "Fișierele media ale lui %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" -msgstr "" +msgstr "De %(username)s la %(date)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" -msgstr "" +msgstr "Scrie un comentariu" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" -msgstr "" +msgstr "la" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" -msgstr "" +msgstr "Trimite comentariul" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "Editare" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" +msgstr "Șterge" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -561,7 +562,7 @@ msgstr "Mai vechi" #: mediagoblin/templates/mediagoblin/utils/pagination.html:50 msgid "Go to page:" -msgstr "" +msgstr "Salt la pagina:" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" @@ -581,11 +582,11 @@ msgstr "Sunt sigur că doresc să șterg" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Hopa, ai uitat să scrii comentariul." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "Comentariul tău a fost trimis!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po index cee135ca..c615cde2 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" -"Last-Translator: cwebber \n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 17:53+0000\n" +"Last-Translator: aleksejrs \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -58,6 +58,8 @@ msgstr "Извините, пользователь с этим именем уж #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." msgstr "" +"Сожалеем, но на этот адрес электронной почты уже зарегистрирована другая " +"учётная запись." #: mediagoblin/auth/views.py:179 msgid "" @@ -73,11 +75,11 @@ msgstr "Неверный ключ проверки или идентификат #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" -msgstr "" +msgstr "Вам надо представиться, чтобы мы знали, кому отправлять сообщение!" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "Вы уже потвердили свой адрес электронной почты!" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -102,7 +104,7 @@ msgstr "Метки" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "" +msgstr "Разделяйте метки запятыми." #: mediagoblin/edit/forms.py:33 msgid "Slug" @@ -129,11 +131,11 @@ msgstr "Сайт" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "Старый пароль" #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "Новый пароль" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -150,15 +152,15 @@ msgstr "Вы редактируете профиль пользователя. #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "Неправильный пароль" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "Профиль изменён!" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" -msgstr "" +msgstr "В «{filename}» не обнаружено расширение имени файла" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -178,7 +180,7 @@ msgstr "Ура! Файл загружен!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "Неподходящий тип файла." #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" @@ -208,11 +210,11 @@ msgstr "Загрузить файл" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "Подтвердите ваш адрес электронной почты!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "завершение сеанса" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -230,25 +232,32 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:24 msgid "Explore" -msgstr "" +msgstr "Смотреть" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Привет! Добро пожаловать на наш MediaGoblin’овый сайт!" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" +"Этот сайт работает на MediaGoblin, " +"необыкновенно замечательном ПО для хостинга мультимедийных файлов." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" +"Для добавления собственных файлов, комментирования, ведения списка любиых " +"файлов и т. п. вы можете представиться с помощью вашей MediaGoblin’овой " +"учётной записи." #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "У вас её ещё нет? Не проблема!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -257,6 +266,9 @@ msgid "" " or\n" " Set up MediaGoblin on your own server" msgstr "" +"Создайте учётную запись на этом сайте\n" +" или\n" +" Установите MediaGoblin на собственный сервер" #: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" @@ -273,11 +285,11 @@ msgstr "Подтвердить" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Сброс пароля" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" +msgstr "Отправить инструкцию" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -377,11 +389,11 @@ msgstr "Редактирование профиля %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr "Файлы с меткой: %(tag_name)s" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" -msgstr "" +msgstr "Оригинал" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -390,41 +402,37 @@ msgstr "Загрузить файл(ы)" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "Файлы %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Файлы пользователя %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" -msgstr "" +msgstr "Загружено %(username)s %(date)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" -msgstr "" +msgstr "Оставить комментарий" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" -msgstr "" +msgstr "в" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" -msgstr "" +msgstr "Разместить комментарий!" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "Изменить" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" +msgstr "Удалить" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -557,15 +565,15 @@ msgstr "Более старые" #: mediagoblin/templates/mediagoblin/utils/pagination.html:50 msgid "Go to page:" -msgstr "" +msgstr "Перейти к странице:" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" -msgstr "" +msgstr "Метки:" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "и" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -577,19 +585,19 @@ msgstr "Я уверен, что хочу удалить это" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Ой, ваш комментарий был пуст." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "Ваш комментарий размещён!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Вы удалили файл." #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." -msgstr "" +msgstr "Файл не удалён, так как вы не подтвердили свою уверенность галочкой." #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po index 30622dee..a44f7866 100644 --- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sk/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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -152,7 +152,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -235,7 +235,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -395,35 +397,31 @@ msgstr "" msgid "%(username)s's media" msgstr "Výtvory, ktoré vlastní %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po index 568a5f73..ffd2c04c 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -150,7 +150,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -231,7 +231,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -381,35 +383,31 @@ msgstr "" msgid "%(username)s's media" msgstr "Vsebina uporabnika %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po index 63f92fdc..942f7203 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\n" "MIME-Version: 1.0\n" @@ -147,7 +147,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -226,7 +226,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -370,35 +372,31 @@ msgstr "" msgid "%(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po index 0e48dc53..e195ad70 100644 --- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sv/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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n" "MIME-Version: 1.0\n" @@ -153,7 +153,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -236,7 +236,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -395,35 +397,31 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)ss media" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po index 816f2580..f7bbd6ac 100644 --- a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/te/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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -148,7 +148,7 @@ msgstr "" msgid "Profile edited!" msgstr "" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "" @@ -227,7 +227,9 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 @@ -371,35 +373,31 @@ msgstr "" msgid "%(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po index 6bc7a717..70622590 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-12-03 16:57-0600\n" -"PO-Revision-Date: 2011-12-03 22:56+0000\n" +"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"PO-Revision-Date: 2011-12-04 16:23+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -149,7 +149,7 @@ msgstr "密碼錯誤" msgid "Profile edited!" msgstr "個人資料已被編輯了!" -#: mediagoblin/media_types/__init__.py:61 +#: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" msgstr "找不到任何 \"{filename}\" 的附檔名。" @@ -230,8 +230,10 @@ msgid "Hi there, welcome to this MediaGoblin site!" msgstr "嘿!歡迎來到 媒體怪獸(MediaGoblin) 網站" #: mediagoblin/templates/mediagoblin/root.html:28 -msgid "Your finest source for all goblin-related media." -msgstr "你是媒體怪獸的相關媒體最珍貴的來源。" +msgid "" +"This site is running MediaGoblin, an " +"extraordinarily great piece of media hosting software." +msgstr "" #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" @@ -389,35 +391,31 @@ msgstr "%(username)s的媒體" msgid "%(username)s's media" msgstr "%(username)s的媒體檔案" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:58 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:68 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:86 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:103 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:125 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:131 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:163 -msgid "Sorry, no such media found." -msgstr "" - #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" -- cgit v1.2.3 From 5b972a192e923dffde4660ca44e8bfbc74aa0c2f Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 4 Dec 2011 13:57:35 -0600 Subject: Compiled the .mo files too --- mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo | Bin 12629 -> 12717 bytes mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo | Bin 11417 -> 11505 bytes mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo | Bin 11684 -> 11805 bytes mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo | Bin 11489 -> 11754 bytes mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo | Bin 11967 -> 12093 bytes mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo | Bin 12215 -> 12304 bytes mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo | Bin 11150 -> 11238 bytes mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo | Bin 11534 -> 11622 bytes mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo | Bin 11791 -> 11879 bytes mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo | Bin 11306 -> 11394 bytes mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo | Bin 10845 -> 10933 bytes mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo | Bin 11508 -> 11596 bytes mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo | Bin 11761 -> 11882 bytes mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo | Bin 14235 -> 15455 bytes mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo | Bin 11701 -> 11789 bytes mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo | Bin 11351 -> 11439 bytes mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo | Bin 11247 -> 11335 bytes mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo | Bin 11450 -> 11538 bytes mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo | Bin 11439 -> 11527 bytes mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo | Bin 11108 -> 11190 bytes 20 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo index aa6eacac..02dfa29a 100644 Binary files a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo index 203114fc..34179a53 100644 Binary files a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo index 4747bd76..f7562eaa 100644 Binary files a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo index 02d09486..8f37922f 100644 Binary files a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo index dba37f0a..bed6aab8 100644 Binary files a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo index c7f5701f..ed1ea35d 100644 Binary files a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo index 55802ee2..c0a1ecb6 100644 Binary files a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo index 77bfbee9..1319a605 100644 Binary files a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo index e2a241a8..39f3595b 100644 Binary files a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo index d7ba8ef6..842bfb9b 100644 Binary files a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo index a75d86a7..c07f42be 100644 Binary files a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo index e78b8e3b..95d6d0ae 100644 Binary files a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo index c2044ccb..e0a70ea9 100644 Binary files a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo index 19765967..0e34144d 100644 Binary files a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo index 10699d0b..4e71eaa7 100644 Binary files a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo index 5d6a0fe2..9ad54a83 100644 Binary files a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo index deb56104..ece8989f 100644 Binary files a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo index b2194da9..c6cf0df9 100644 Binary files a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo index 2ac4c41c..cd9fab9f 100644 Binary files a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo index 33400cef..6dda94b7 100644 Binary files a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo differ -- cgit v1.2.3 From 2ef0679790ca6ee15fea2c8e25449d5c54cf5036 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 4 Dec 2011 14:39:42 -0600 Subject: Fix button word-wrapping issue --- mediagoblin/static/css/base.css | 1 + 1 file changed, 1 insertion(+) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 12d88ffa..961a51fc 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -129,6 +129,7 @@ a.mediagoblin_logo{ font-style: normal; font-weight: bold; font-size: 1em; + display: inline-block; } .button_action_highlight{ -- cgit v1.2.3 From 4752fdcf06764965d2f926d99f3831a968d8ea8d Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 4 Dec 2011 15:27:00 -0600 Subject: Filled in reason #3 to submit separate out celery. --- docs/source/production-deployments.rst | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/source/production-deployments.rst b/docs/source/production-deployments.rst index 37251734..75acf9cf 100644 --- a/docs/source/production-deployments.rst +++ b/docs/source/production-deployments.rst @@ -23,7 +23,16 @@ deployments for several reasons: MediaGoblin application itself, this simplifies management and support better workload distribution. -3. ... additional reason here. .... +3. If your user submits something complex and it needs to process, + that's extra time your user has to sit around waiting when they + could get back immediately to doing things on the site. + Furthermore, if that processing step takes a long time, as it + certainly will for video, your user won't just be left waiting, + their connection will probably time out. + +Basically, if you're doing anything other than trivial images for a +small set of users (or something similarly trivial, like ascii art), +you want to switch over to doing a separate celery process. Build an :ref:`init script ` around the following command. -- cgit v1.2.3 From a085dda5d29a1353eaf7df3ddfc3a7c500af9186 Mon Sep 17 00:00:00 2001 From: tycho garen Date: Sun, 4 Dec 2011 17:06:54 -0500 Subject: DOCS:: #675 revision to deployment and production documents --- docs/source/deploying.rst | 25 ++-------- docs/source/index.rst | 1 + docs/source/production-deployments.rst | 83 ++++++++++++++++++++++------------ 3 files changed, 59 insertions(+), 50 deletions(-) diff --git a/docs/source/deploying.rst b/docs/source/deploying.rst index 9c0acf30..70b1a6af 100644 --- a/docs/source/deploying.rst +++ b/docs/source/deploying.rst @@ -239,26 +239,9 @@ example: :: Visit the site you've set up in your browser by visiting . You should see MediaGoblin! -Production MediaGoblin Deployments with Paste -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The instance configured with ``lazyserver`` is not ideal for a -production MediaGoblin deployment. Ideally, you should be able to use -a control script (i.e. init script.) to launch and restart the -MediaGoblin process. - -Use the following command as the basis for such a script: :: - - CELERY_ALWAYS_EAGER=true \ - /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \ - /srv/mediagoblin.example.org/mediagoblin/paste.ini \ - --pid-file=/var/run/mediagoblin.pid \ - --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 \ - .. note:: - The above configuration places MediaGoblin in "always eager" mode - with Celery. This is fine for development and smaller - deployments. However, for larger production deployments with larger - processing requirements, see the ":doc:`production-deployments`" - documentation. + The configuration described above is sufficient for development and + smaller deployments. However, for larger production deployments + with larger processing requirements, see the + ":doc:`production-deployments`" documentation. diff --git a/docs/source/index.rst b/docs/source/index.rst index e9f3993e..6ffe0974 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -14,6 +14,7 @@ Table of Contents: foreword about deploying + production-deployments configuration help theming diff --git a/docs/source/production-deployments.rst b/docs/source/production-deployments.rst index 75acf9cf..7bf26169 100644 --- a/docs/source/production-deployments.rst +++ b/docs/source/production-deployments.rst @@ -7,32 +7,54 @@ MediaGoblin in actual production environments. Consider ":doc:`deploying`" for a basic overview of how to deploy Media Goblin. -Celery ------- +Deploy with Paste +----------------- + +The instance configured with ``./lazyserver.sh`` is not ideal for a +production MediaGoblin deployment. Ideally, you should be able to use +an "init" or "control" script to launch and restart the MediaGoblin +process. + +Use the following command as the basis for such a script: :: + + CELERY_ALWAYS_EAGER=true \ + /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \ + /srv/mediagoblin.example.org/mediagoblin/paste.ini \ + --pid-file=/var/run/mediagoblin.pid \ + --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 \ + +The above configuration places MediaGoblin in "always eager" mode +with Celery, this means that submissions of content will be processed +synchronously, and the user will advance to the next page only after +processing is complete. If we take Celery out of "always eager mode," +the user will be able to immediately return to the MediaGoblin site +while processing is ongoing. In these cases, use the following command +as the basis for your script: :: + + CELERY_ALWAYS_EAGER=false \ + /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \ + /srv/mediagoblin.example.org/mediagoblin/paste.ini \ + --pid-file=/var/run/mediagoblin.pid \ + --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 \ + +Separate Celery +--------------- While the ``./lazyserer.sh`` configuration provides an efficient way to start using a MediaGoblin instance, it is not suitable for production deployments for several reasons: -1. In nearly every scenario, work on the Celery queue will need to - balance with the demands of other processes, and cannot proceed - synchronously. This is a particularly relevant problem if you use - MediaGoblin to host Video content. +In nearly every scenario, work on the Celery queue will need to +balance with the demands of other processes, and cannot proceed +synchronously. This is a particularly relevant problem if you use +MediaGoblin to host video content. Processing with Celery ought to be +operationally separate from the MediaGoblin application itself, this +simplifies management and support better workload distribution. -2. Processing with Celery ought to be operationally separate from the - MediaGoblin application itself, this simplifies management and - support better workload distribution. - -3. If your user submits something complex and it needs to process, - that's extra time your user has to sit around waiting when they - could get back immediately to doing things on the site. - Furthermore, if that processing step takes a long time, as it - certainly will for video, your user won't just be left waiting, - their connection will probably time out. - -Basically, if you're doing anything other than trivial images for a -small set of users (or something similarly trivial, like ascii art), -you want to switch over to doing a separate celery process. +Basically, if you're doing anything beyond a trivial workload, such as +image hosting for a small set of users, or have limited media types +such as "ASCII art" or icon sharing, you will need to run ``celeryd`` +as a separate process. Build an :ref:`init script ` around the following command. @@ -46,12 +68,15 @@ processes. .. _init-script: Use an Init Script -------------------- - -TODO insert init script here - -Other Concerns --------------- - -TODO What are they? - +------------------ + +Look in your system's ``/etc/init.d/`` or ``/etc/rc.d/`` directory for +examples of how to build scripts that will start, stop, and restart +MediaGoblin and Celery. These scripts will vary by +distribution/operating system. In the future, MediaGoblin will provide +example scripts as examples. + +.. TODO insert init script here +.. TODO are additional concernts ? + .. Other Concerns + .. -------------- -- cgit v1.2.3 From 38f102515a84c1da25a9dab56d2fe7731412f4f5 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sun, 4 Dec 2011 23:58:58 -0600 Subject: Cloudfiles not actually a dependency, removing from setup.py If users want cloudfiles, they can always ./bin/easy_install it. --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index ec672dd2..293f3f03 100644 --- a/setup.py +++ b/setup.py @@ -61,7 +61,6 @@ setup( 'webtest', 'ConfigObj', 'Markdown', - 'python-cloudfiles', ## For now we're expecting that users will install this from ## their package managers. # 'lxml', -- cgit v1.2.3 From bcc9ee3205dfc6bc2b5e5dacb09de89121eb3782 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 5 Dec 2011 08:35:42 -0600 Subject: Update the delete item to use the _id after all... it's the safest way. See http://bugs.foocorp.net/issues/695 --- mediagoblin/decorators.py | 2 +- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 +- .../templates/mediagoblin/user_pages/media_confirm_delete.html | 2 +- mediagoblin/tests/test_submission.py | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index 56dddb44..269b0c2e 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -58,7 +58,7 @@ def user_may_delete_media(controller): """ def wrapper(request, *args, **kwargs): uploader = request.db.MediaEntry.find_one( - {'slug': request.matchdict['media']}).get_uploader() + {'_id': ObjectId(request.matchdict['media'])}).get_uploader() if not (request.user['is_admin'] or request.user._id == uploader._id): return exc.HTTPForbidden() diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index c7818012..5039fb30 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -126,7 +126,7 @@

{% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', user= media.get_uploader().username, - media= media.slug) %} + media= media._id) %} {% trans %}Delete{% endtrans %}

{% endif %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html index e36891d6..058351a5 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html @@ -23,7 +23,7 @@

diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py index a3453f2f..7ea6c4bc 100644 --- a/mediagoblin/tests/test_submission.py +++ b/mediagoblin/tests/test_submission.py @@ -171,7 +171,7 @@ class TestSubmission: request.urlgen('mediagoblin.user_pages.media_confirm_delete', # No work: user=media.uploader().username, user=self.test_user['username'], - media=media.slug), + media=media._id), # no value means no confirm {}) @@ -191,7 +191,7 @@ class TestSubmission: request.urlgen('mediagoblin.user_pages.media_confirm_delete', # No work: user=media.uploader().username, user=self.test_user['username'], - media=media.slug), + media=media._id), {'confirm': 'y'}) response.follow() -- cgit v1.2.3 From 5b5b67cd5c82e743f7c656616c92841fae31b36f Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 5 Dec 2011 08:37:20 -0600 Subject: Update comment URLs to use the media slug. --- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 5039fb30..b811d161 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -86,7 +86,7 @@ + media = media.slug) }}#comment"> {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }}

-- cgit v1.2.3 From 5a4e3ff1e2a0f2ed451bc191c1d44bcd694b8e75 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 14 Nov 2011 15:39:57 +0100 Subject: Dot-Notation for Users.username --- mediagoblin/auth/lib.py | 4 ++-- mediagoblin/auth/views.py | 10 +++++----- mediagoblin/db/models.py | 8 ++++---- mediagoblin/decorators.py | 2 +- mediagoblin/edit/views.py | 2 +- mediagoblin/gmg_commands/users.py | 2 +- mediagoblin/listings/views.py | 2 +- mediagoblin/submit/views.py | 2 +- mediagoblin/templates/mediagoblin/base.html | 6 +++--- mediagoblin/templates/mediagoblin/edit/edit_profile.html | 4 ++-- mediagoblin/templates/mediagoblin/user_pages/media.html | 4 ++-- mediagoblin/tests/test_submission.py | 4 ++-- mediagoblin/tests/test_tests.py | 2 +- mediagoblin/user_pages/views.py | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/mediagoblin/auth/lib.py b/mediagoblin/auth/lib.py index cf4a2b83..ee1ce12d 100644 --- a/mediagoblin/auth/lib.py +++ b/mediagoblin/auth/lib.py @@ -105,7 +105,7 @@ def send_verification_email(user, request): """ rendered_email = render_template( request, 'mediagoblin/auth/verification_email.txt', - {'username': user['username'], + {'username': user.username, 'verification_url': EMAIL_VERIFICATION_TEMPLATE.format( host=request.host, uri=request.urlgen('mediagoblin.auth.verify_email'), @@ -140,7 +140,7 @@ def send_fp_verification_email(user, request): """ rendered_email = render_template( request, 'mediagoblin/auth/fp_verification_email.txt', - {'username': user['username'], + {'username': user.username, 'verification_url': EMAIL_FP_VERIFICATION_TEMPLATE.format( host=request.host, uri=request.urlgen('mediagoblin.auth.verify_forgot_password'), diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index d01861d1..dab95b17 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -80,7 +80,7 @@ def register(request): if extra_validation_passes: # Create the user user = request.db.User() - user['username'] = username + user.username = username user['email'] = email user['pw_hash'] = auth_lib.bcrypt_gen_password_hash( request.POST['password']) @@ -98,7 +98,7 @@ def register(request): # message waiting for them to verify their email return redirect( request, 'mediagoblin.user_pages.user_home', - user=user['username']) + user=user.username) return render_to_response( request, @@ -186,7 +186,7 @@ def verify_email(request): return redirect( request, 'mediagoblin.user_pages.user_home', - user=user['username']) + user=user.username) def resend_activation(request): @@ -224,7 +224,7 @@ def resend_activation(request): _('Resent your verification email.')) return redirect( request, 'mediagoblin.user_pages.user_home', - user=request.user['username']) + user=request.user.username) def forgot_password(request): @@ -268,7 +268,7 @@ def forgot_password(request): return redirect( request, 'mediagoblin.user_pages.user_home', - user=user['username']) + user=user.username) # do not reveal whether or not there is a matching user return redirect(request, 'mediagoblin.auth.fp_email_sent') diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 265fe36d..4af996b8 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -268,12 +268,12 @@ class MediaEntry(Document): if self.get('slug'): return urlgen( 'mediagoblin.user_pages.media_home', - user=uploader['username'], + user=uploader.username, media=self['slug']) else: return urlgen( 'mediagoblin.user_pages.media_home', - user=uploader['username'], + user=uploader.username, media=unicode(self._id)) def url_to_prev(self, urlgen): @@ -286,7 +286,7 @@ class MediaEntry(Document): '_id', ASCENDING).limit(1) if cursor.count(): return urlgen('mediagoblin.user_pages.media_home', - user=self.get_uploader()['username'], + user=self.get_uploader().username, media=unicode(cursor[0]['slug'])) def url_to_next(self, urlgen): @@ -300,7 +300,7 @@ class MediaEntry(Document): if cursor.count(): return urlgen('mediagoblin.user_pages.media_home', - user=self.get_uploader()['username'], + user=self.get_uploader().username, media=unicode(cursor[0]['slug'])) def get_uploader(self): diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index 269b0c2e..d6a054f8 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -40,7 +40,7 @@ def require_active_login(controller): request.user.get('status') == u'needs_email_verification': return redirect( request, 'mediagoblin.user_pages.user_home', - user=request.user['username']) + user=request.user.username) elif not request.user or request.user.get('status') != u'active': return exc.HTTPFound( location="%s?next=%s" % ( diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 673409bd..61a61d4c 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -147,7 +147,7 @@ def edit_attachments(request, media): def edit_profile(request): # admins may edit any user profile given a username in the querystring edit_username = request.GET.get('username') - if request.user['is_admin'] and request.user['username'] != edit_username: + if request.user['is_admin'] and request.user.username != edit_username: user = request.db.User.find_one({'username': edit_username}) # No need to warn again if admin just submitted an edited profile if request.method != 'POST': diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py index b437e839..e8426272 100644 --- a/mediagoblin/gmg_commands/users.py +++ b/mediagoblin/gmg_commands/users.py @@ -50,7 +50,7 @@ def adduser(args): else: # Create the user entry = db.User() - entry['username'] = unicode(args.username.lower()) + entry.username = unicode(args.username.lower()) entry['email'] = unicode(args.email) entry['pw_hash'] = auth_lib.bcrypt_gen_password_hash(args.password) entry['status'] = u'active' diff --git a/mediagoblin/listings/views.py b/mediagoblin/listings/views.py index 5a09de43..6b83ffcf 100644 --- a/mediagoblin/listings/views.py +++ b/mediagoblin/listings/views.py @@ -86,7 +86,7 @@ def tag_atom_feed(request): feed.add(entry.get('title'), entry.get('description_html'), content_type='html', - author=entry.get_uploader()['username'], + author=entry.get_uploader().username, updated=entry.get('created'), url=entry.url_for_self(request.urlgen)) diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 3def44ce..6beb6b18 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -127,7 +127,7 @@ def submit_start(request): add_message(request, SUCCESS, _('Woohoo! Submitted!')) return redirect(request, "mediagoblin.user_pages.user_home", - user=request.user['username']) + user=request.user.username) except InvalidFileType, exc: submit_form.file.errors.append( _(u'Invalid file type.')) diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 29639026..c06addd0 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -60,14 +60,14 @@ {# the following link should only appear when verification is needed #} {% if request.user.status == "needs_email_verification" %} {% trans %}Verify your email!{% endtrans %} {% endif %} - {{ request.user['username'] }} + user= request.user.username) }}"> + {{ request.user.username }} ({% trans %}log out{% endtrans %}) {% else %} diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html index bf8fe5c1..2d5daa95 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit_profile.html +++ b/mediagoblin/templates/mediagoblin/edit/edit_profile.html @@ -22,11 +22,11 @@ {% block mediagoblin_content %}

- {%- trans username=user['username'] -%} + {%- trans username=user.username -%} Editing {{ username }}'s profile {%- endtrans %}

diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index b811d161..7fc60c3f 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -80,8 +80,8 @@ {% endautoescape %} - {{ comment_author['username'] }} + user = comment_author.username) }}"> + {{ comment_author.username }} {% trans %}at{% endtrans %} Date: Mon, 14 Nov 2011 18:54:52 +0100 Subject: Dot-Notation for Users.email_verified --- mediagoblin/auth/views.py | 6 +++--- mediagoblin/gmg_commands/users.py | 2 +- mediagoblin/tests/test_auth.py | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 63bf9a91..2d29d0a5 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -168,7 +168,7 @@ def verify_email(request): if user and user['verification_key'] == unicode(request.GET['token']): user[u'status'] = u'active' - user[u'email_verified'] = True + user.email_verified = True user[u'verification_key'] = None user.save() @@ -249,7 +249,7 @@ def forgot_password(request): {'email': request.POST['username']}) if user: - if user['email_verified'] and user['status'] == 'active': + if user.email_verified and user['status'] == 'active': user[u'fp_verification_key'] = unicode(uuid.uuid4()) user[u'fp_token_expire'] = datetime.datetime.now() + \ datetime.timedelta(days=10) @@ -304,7 +304,7 @@ def verify_forgot_password(request): if ((user and user['fp_verification_key'] and user['fp_verification_key'] == unicode(formdata_token) and datetime.datetime.now() < user['fp_token_expire'] - and user['email_verified'] and user['status'] == 'active')): + and user.email_verified and user['status'] == 'active')): cp_form = auth_forms.ChangePassForm(formdata_vars) diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py index 6084f9d7..88895661 100644 --- a/mediagoblin/gmg_commands/users.py +++ b/mediagoblin/gmg_commands/users.py @@ -54,7 +54,7 @@ def adduser(args): entry.email = unicode(args.email) entry.pw_hash = auth_lib.bcrypt_gen_password_hash(args.password) entry['status'] = u'active' - entry['email_verified'] = True + entry.email_verified = True entry.save(validate=True) print "User created (and email marked as verified)" diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index 2faf0f25..ad9a5bca 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -163,7 +163,7 @@ def test_register_views(test_app): {'username': 'happygirl'}) assert new_user assert new_user['status'] == u'needs_email_verification' - assert new_user['email_verified'] == False + assert new_user.email_verified == False ## Make sure user is logged in request = template.TEMPLATE_TEST_CONTEXT[ @@ -203,7 +203,7 @@ def test_register_views(test_app): {'username': 'happygirl'}) assert new_user assert new_user['status'] == u'needs_email_verification' - assert new_user['email_verified'] == False + assert new_user.email_verified == False ## Verify the email activation works template.clear_test_template_context() @@ -217,7 +217,7 @@ def test_register_views(test_app): {'username': 'happygirl'}) assert new_user assert new_user['status'] == u'active' - assert new_user['email_verified'] == True + assert new_user.email_verified == True # Uniqueness checks # ----------------- -- cgit v1.2.3 From 7a3d00ec217cc3fd44788b9d8c63ab9f7b1d05a7 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 14 Nov 2011 19:01:26 +0100 Subject: Dot-Notation for Users.status --- mediagoblin/auth/views.py | 6 +++--- mediagoblin/gmg_commands/users.py | 2 +- mediagoblin/templates/mediagoblin/base.html | 2 +- mediagoblin/tests/test_auth.py | 6 +++--- mediagoblin/user_pages/views.py | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 2d29d0a5..caf9835a 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -167,7 +167,7 @@ def verify_email(request): {'_id': ObjectId(unicode(request.GET['userid']))}) if user and user['verification_key'] == unicode(request.GET['token']): - user[u'status'] = u'active' + user.status = u'active' user.email_verified = True user[u'verification_key'] = None @@ -249,7 +249,7 @@ def forgot_password(request): {'email': request.POST['username']}) if user: - if user.email_verified and user['status'] == 'active': + if user.email_verified and user.status == 'active': user[u'fp_verification_key'] = unicode(uuid.uuid4()) user[u'fp_token_expire'] = datetime.datetime.now() + \ datetime.timedelta(days=10) @@ -304,7 +304,7 @@ def verify_forgot_password(request): if ((user and user['fp_verification_key'] and user['fp_verification_key'] == unicode(formdata_token) and datetime.datetime.now() < user['fp_token_expire'] - and user.email_verified and user['status'] == 'active')): + and user.email_verified and user.status == 'active')): cp_form = auth_forms.ChangePassForm(formdata_vars) diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py index 88895661..7b23ba34 100644 --- a/mediagoblin/gmg_commands/users.py +++ b/mediagoblin/gmg_commands/users.py @@ -53,7 +53,7 @@ def adduser(args): entry.username = unicode(args.username.lower()) entry.email = unicode(args.email) entry.pw_hash = auth_lib.bcrypt_gen_password_hash(args.password) - entry['status'] = u'active' + entry.status = u'active' entry.email_verified = True entry.save(validate=True) diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index c06addd0..16569f03 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -48,7 +48,7 @@ >{% trans %}MediaGoblin logo{% endtrans %} {% endblock %} - {% if request.user and request.user['status'] == 'active' %} + {% if request.user and request.user.status == 'active' %} {% trans %}Submit media{% endtrans %} diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index ad9a5bca..bd79a407 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -162,7 +162,7 @@ def test_register_views(test_app): new_user = mg_globals.database.User.find_one( {'username': 'happygirl'}) assert new_user - assert new_user['status'] == u'needs_email_verification' + assert new_user.status == u'needs_email_verification' assert new_user.email_verified == False ## Make sure user is logged in @@ -202,7 +202,7 @@ def test_register_views(test_app): new_user = mg_globals.database.User.find_one( {'username': 'happygirl'}) assert new_user - assert new_user['status'] == u'needs_email_verification' + assert new_user.status == u'needs_email_verification' assert new_user.email_verified == False ## Verify the email activation works @@ -216,7 +216,7 @@ def test_register_views(test_app): new_user = mg_globals.database.User.find_one( {'username': 'happygirl'}) assert new_user - assert new_user['status'] == u'active' + assert new_user.status == u'active' assert new_user.email_verified == True # Uniqueness checks diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index ad33479b..4b311822 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -40,7 +40,7 @@ def user_home(request, page): 'username': request.matchdict['user']}) if not user: return render_404(request) - elif user['status'] != u'active': + elif user.status != u'active': return render_to_response( request, 'mediagoblin/user_pages/user.html', @@ -254,7 +254,7 @@ def processing_panel(request): # Make sure the user exists and is active if not user: return render_404(request) - elif user['status'] != u'active': + elif user.status != u'active': return render_to_response( request, 'mediagoblin/user_pages/user.html', -- cgit v1.2.3 From 00bb95502e01f8c8fcaa5652889a5ed423051d7c Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 14 Nov 2011 19:04:13 +0100 Subject: Dot-Notation for Users.verification_key --- mediagoblin/auth/lib.py | 2 +- mediagoblin/auth/views.py | 6 +++--- mediagoblin/tests/test_auth.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mediagoblin/auth/lib.py b/mediagoblin/auth/lib.py index 24992094..d03f7af0 100644 --- a/mediagoblin/auth/lib.py +++ b/mediagoblin/auth/lib.py @@ -110,7 +110,7 @@ def send_verification_email(user, request): host=request.host, uri=request.urlgen('mediagoblin.auth.verify_email'), userid=unicode(user._id), - verification_key=user['verification_key'])}) + verification_key=user.verification_key)}) # TODO: There is no error handling in place send_email( diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index caf9835a..d7e8d1bf 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -166,10 +166,10 @@ def verify_email(request): user = request.db.User.find_one( {'_id': ObjectId(unicode(request.GET['userid']))}) - if user and user['verification_key'] == unicode(request.GET['token']): + if user and user.verification_key == unicode(request.GET['token']): user.status = u'active' user.email_verified = True - user[u'verification_key'] = None + user.verification_key = None user.save() @@ -212,7 +212,7 @@ def resend_activation(request): return redirect(request, "mediagoblin.user_pages.user_home", user=request.user['username']) - request.user[u'verification_key'] = unicode(uuid.uuid4()) + request.user.verification_key = unicode(uuid.uuid4()) request.user.save() email_debug_message(request) diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index bd79a407..7cb867d7 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -187,7 +187,7 @@ def test_register_views(test_app): assert parsed_get_params['userid'] == [ unicode(new_user._id)] assert parsed_get_params['token'] == [ - new_user['verification_key']] + new_user.verification_key] ## Try verifying with bs verification key, shouldn't work template.clear_test_template_context() -- cgit v1.2.3 From bec591d85b1e4695024b54bbd902559ec7727ea6 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 14 Nov 2011 19:08:43 +0100 Subject: Dot-Notation for Users.is_admin --- mediagoblin/decorators.py | 2 +- mediagoblin/edit/lib.py | 2 +- mediagoblin/edit/views.py | 4 ++-- mediagoblin/gmg_commands/users.py | 2 +- mediagoblin/templates/mediagoblin/user_pages/media.html | 4 ++-- mediagoblin/templates/mediagoblin/user_pages/user.html | 2 +- mediagoblin/user_pages/views.py | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index d6a054f8..229664d7 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -59,7 +59,7 @@ def user_may_delete_media(controller): def wrapper(request, *args, **kwargs): uploader = request.db.MediaEntry.find_one( {'_id': ObjectId(request.matchdict['media'])}).get_uploader() - if not (request.user['is_admin'] or + if not (request.user.is_admin or request.user._id == uploader._id): return exc.HTTPForbidden() diff --git a/mediagoblin/edit/lib.py b/mediagoblin/edit/lib.py index 458b704e..4ce2d42f 100644 --- a/mediagoblin/edit/lib.py +++ b/mediagoblin/edit/lib.py @@ -19,6 +19,6 @@ def may_edit_media(request, media): """Check, if the request's user may edit the media details""" if media['uploader'] == request.user._id: return True - if request.user['is_admin']: + if request.user.is_admin: return True return False diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 61a61d4c..e766b6d8 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -78,7 +78,7 @@ def edit_media(request, media): return exc.HTTPFound( location=media.url_for_self(request.urlgen)) - if request.user['is_admin'] \ + if request.user.is_admin \ and media['uploader'] != request.user._id \ and request.method != 'POST': messages.add_message( @@ -147,7 +147,7 @@ def edit_attachments(request, media): def edit_profile(request): # admins may edit any user profile given a username in the querystring edit_username = request.GET.get('username') - if request.user['is_admin'] and request.user.username != edit_username: + if request.user.is_admin and request.user.username != edit_username: user = request.db.User.find_one({'username': edit_username}) # No need to warn again if admin just submitted an edited profile if request.method != 'POST': diff --git a/mediagoblin/gmg_commands/users.py b/mediagoblin/gmg_commands/users.py index 7b23ba34..4bfe30a5 100644 --- a/mediagoblin/gmg_commands/users.py +++ b/mediagoblin/gmg_commands/users.py @@ -73,7 +73,7 @@ def makeadmin(args): user = db.User.one({'username': unicode(args.username.lower())}) if user: - user['is_admin'] = True + user.is_admin = True user.save() print 'The user is now Admin' else: diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 7fc60c3f..89fd104d 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -116,7 +116,7 @@ {% include "mediagoblin/utils/prev_next.html" %} {% if media['uploader'] == request.user._id or - request.user['is_admin'] %} + request.user.is_admin %}

{% set edit_url = request.urlgen('mediagoblin.edit.edit_media', user= media.get_uploader().username, @@ -146,7 +146,7 @@ {% if app_config['allow_attachments'] and (media['uploader'] == request.user._id - or request.user['is_admin']) %} + or request.user.is_admin) %}

{% include "mediagoblin/utils/profile.html" %} - {% if request.user._id == user._id or request.user['is_admin'] %} + {% if request.user._id == user._id or request.user.is_admin %} {%- trans %}Edit profile{% endtrans -%} diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 4b311822..dc549567 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -191,7 +191,7 @@ def media_confirm_delete(request, media): return exc.HTTPFound( location=media.url_for_self(request.urlgen)) - if ((request.user[u'is_admin'] and + if ((request.user.is_admin and request.user._id != media.get_uploader()._id)): messages.add_message( request, messages.WARNING, -- cgit v1.2.3 From a24e5133ed9ee0845e854478da9a88f85e755f70 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 14 Nov 2011 19:16:02 +0100 Subject: Dot-Notation for Users.url --- mediagoblin/edit/views.py | 2 +- mediagoblin/templates/mediagoblin/user_pages/user.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index e766b6d8..cbae9cc3 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -176,7 +176,7 @@ def edit_profile(request): {'user': user, 'form': form}) - user['url'] = unicode(request.POST['url']) + user.url = unicode(request.POST['url']) user['bio'] = unicode(request.POST['bio']) if password_matches: diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index d0f3bced..b952e88c 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -89,7 +89,7 @@ {%- trans username=user.username %}{{ username }}'s profile{% endtrans -%} - {% if not user['url'] and not user['bio'] %} + {% if not user.url and not user.bio %} {% if request.user._id == user._id %}

-- cgit v1.2.3 From 4b77f86ab46c54a41a250ad1d8cec82214b67545 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 14 Nov 2011 19:19:54 +0100 Subject: Dot-Notation for Users.bio and .bio_html --- mediagoblin/edit/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index cbae9cc3..4e8c3686 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -177,13 +177,13 @@ def edit_profile(request): 'form': form}) user.url = unicode(request.POST['url']) - user['bio'] = unicode(request.POST['bio']) + user.bio = unicode(request.POST['bio']) if password_matches: user['pw_hash'] = auth_lib.bcrypt_gen_password_hash( request.POST['new_password']) - user['bio_html'] = cleaned_markdown_conversion(user['bio']) + user.bio_html = cleaned_markdown_conversion(user['bio']) user.save() -- cgit v1.2.3 From dc39e4555c9e104ae9d7b38f231a848fe106d1a0 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 14 Nov 2011 19:21:33 +0100 Subject: Dot-Notation for Users.fp_verification_key --- mediagoblin/auth/lib.py | 2 +- mediagoblin/auth/views.py | 8 ++++---- mediagoblin/tests/test_auth.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mediagoblin/auth/lib.py b/mediagoblin/auth/lib.py index d03f7af0..c0af3b5b 100644 --- a/mediagoblin/auth/lib.py +++ b/mediagoblin/auth/lib.py @@ -145,7 +145,7 @@ def send_fp_verification_email(user, request): host=request.host, uri=request.urlgen('mediagoblin.auth.verify_forgot_password'), userid=unicode(user._id), - fp_verification_key=user['fp_verification_key'])}) + fp_verification_key=user.fp_verification_key)}) # TODO: There is no error handling in place send_email( diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index d7e8d1bf..633ceef4 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -250,7 +250,7 @@ def forgot_password(request): if user: if user.email_verified and user.status == 'active': - user[u'fp_verification_key'] = unicode(uuid.uuid4()) + user.fp_verification_key = unicode(uuid.uuid4()) user[u'fp_token_expire'] = datetime.datetime.now() + \ datetime.timedelta(days=10) user.save() @@ -301,8 +301,8 @@ def verify_forgot_password(request): return render_404(request) # check if we have a real user and correct token - if ((user and user['fp_verification_key'] and - user['fp_verification_key'] == unicode(formdata_token) and + if ((user and user.fp_verification_key and + user.fp_verification_key == unicode(formdata_token) and datetime.datetime.now() < user['fp_token_expire'] and user.email_verified and user.status == 'active')): @@ -311,7 +311,7 @@ def verify_forgot_password(request): if request.method == 'POST' and cp_form.validate(): user.pw_hash = auth_lib.bcrypt_gen_password_hash( request.POST['password']) - user[u'fp_verification_key'] = None + user.fp_verification_key = None user[u'fp_token_expire'] = None user.save() diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index 7cb867d7..2dcb5c14 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -270,7 +270,7 @@ def test_register_views(test_app): # user should have matching parameters new_user = mg_globals.database.User.find_one({'username': 'happygirl'}) assert parsed_get_params['userid'] == [unicode(new_user._id)] - assert parsed_get_params['token'] == [new_user['fp_verification_key']] + assert parsed_get_params['token'] == [new_user.fp_verification_key] ### The forgotten password token should be set to expire in ~ 10 days # A few ticks have expired so there are only 9 full days left... -- cgit v1.2.3 From 2d540fed8b511c76819a836da3d62875d20b6547 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 14 Nov 2011 19:24:15 +0100 Subject: Dot-Notation for Users.fp_token_expire --- mediagoblin/auth/views.py | 6 +++--- mediagoblin/tests/test_auth.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 633ceef4..919aa3cd 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -251,7 +251,7 @@ def forgot_password(request): if user: if user.email_verified and user.status == 'active': user.fp_verification_key = unicode(uuid.uuid4()) - user[u'fp_token_expire'] = datetime.datetime.now() + \ + user.fp_token_expire = datetime.datetime.now() + \ datetime.timedelta(days=10) user.save() @@ -303,7 +303,7 @@ def verify_forgot_password(request): # check if we have a real user and correct token if ((user and user.fp_verification_key and user.fp_verification_key == unicode(formdata_token) and - datetime.datetime.now() < user['fp_token_expire'] + datetime.datetime.now() < user.fp_token_expire and user.email_verified and user.status == 'active')): cp_form = auth_forms.ChangePassForm(formdata_vars) @@ -312,7 +312,7 @@ def verify_forgot_password(request): user.pw_hash = auth_lib.bcrypt_gen_password_hash( request.POST['password']) user.fp_verification_key = None - user[u'fp_token_expire'] = None + user.fp_token_expire = None user.save() return redirect(request, 'mediagoblin.auth.fp_changed_success') diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index 2dcb5c14..d3b8caf1 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -274,7 +274,7 @@ def test_register_views(test_app): ### The forgotten password token should be set to expire in ~ 10 days # A few ticks have expired so there are only 9 full days left... - assert (new_user['fp_token_expire'] - datetime.datetime.now()).days == 9 + assert (new_user.fp_token_expire - datetime.datetime.now()).days == 9 ## Try using a bs password-changing verification key, shouldn't work template.clear_test_template_context() @@ -285,12 +285,12 @@ def test_register_views(test_app): ## Try using an expired token to change password, shouldn't work template.clear_test_template_context() - real_token_expiration = new_user['fp_token_expire'] - new_user['fp_token_expire'] = datetime.datetime.now() + real_token_expiration = new_user.fp_token_expire + new_user.fp_token_expire = datetime.datetime.now() new_user.save() response = test_app.get("%s?%s" % (path, get_params), status=404) assert_equal(response.status, '404 Not Found') - new_user['fp_token_expire'] = real_token_expiration + new_user.fp_token_expire = real_token_expiration new_user.save() ## Verify step 1 of password-change works -- can see form to change password -- cgit v1.2.3 From 4ec5717a173803e6ccebf7fced1e5127c8b52caa Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 21 Nov 2011 12:56:26 +0100 Subject: Dot-Notation: tests/test_edit.py convert tests/test_edit.py over to Dot-Notation. It only accesses the User object. --- mediagoblin/tests/test_edit.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mediagoblin/tests/test_edit.py b/mediagoblin/tests/test_edit.py index c29ddfe9..0cf71e9b 100644 --- a/mediagoblin/tests/test_edit.py +++ b/mediagoblin/tests/test_edit.py @@ -44,7 +44,7 @@ def test_change_password(test_app): # test_user has to be fetched again in order to have the current values test_user = mg_globals.database.User.one({'username': 'chris'}) - assert bcrypt_check_password('123456', test_user['pw_hash']) + assert bcrypt_check_password('123456', test_user.pw_hash) # test that the password cannot be changed if the given old_password # is wrong @@ -59,7 +59,7 @@ def test_change_password(test_app): test_user = mg_globals.database.User.one({'username': 'chris'}) - assert not bcrypt_check_password('098765', test_user['pw_hash']) + assert not bcrypt_check_password('098765', test_user.pw_hash) @setup_fresh_app @@ -76,8 +76,8 @@ def change_bio_url(test_app): test_user = mg_globals.database.User.one({'username': 'chris'}) - assert test_user['bio'] == u'I love toast!' - assert test_user['url'] == u'http://dustycloud.org/' + assert test_user.bio == u'I love toast!' + assert test_user.url == u'http://dustycloud.org/' # test changing the bio and the URL inproperly too_long_bio = 150 * 'T' + 150 * 'o' + 150 * 'a' + 150 * 's' + 150* 't' -- cgit v1.2.3 From 0547843020643febbdcbfa33377fd48f92c568c8 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 14 Nov 2011 18:39:18 +0100 Subject: Dot-Notation for MediaEntry.created --- mediagoblin/templates/mediagoblin/user_pages/processing_panel.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html index 9b4adeb5..307a0027 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html +++ b/mediagoblin/templates/mediagoblin/user_pages/processing_panel.html @@ -37,7 +37,7 @@ {% for media_entry in processing_entries %}

- + {% endfor %} -- cgit v1.2.3 From 1ceb4fc8682dd00c15376b75a3d9222cac6fb5bd Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 21 Nov 2011 20:18:38 +0100 Subject: Dot-Notation for MediaEntry.uploader --- mediagoblin/db/models.py | 6 +++--- mediagoblin/edit/lib.py | 2 +- mediagoblin/edit/views.py | 4 ++-- mediagoblin/submit/views.py | 2 +- mediagoblin/templates/mediagoblin/user_pages/media.html | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 795cba6a..f1f56dd1 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -281,7 +281,7 @@ class MediaEntry(Document): Provide a url to the previous entry from this user, if there is one """ cursor = self.db.MediaEntry.find({'_id': {"$gt": self._id}, - 'uploader': self['uploader'], + 'uploader': self.uploader, 'state': 'processed'}).sort( '_id', ASCENDING).limit(1) if cursor.count(): @@ -294,7 +294,7 @@ class MediaEntry(Document): Provide a url to the next entry from this user, if there is one """ cursor = self.db.MediaEntry.find({'_id': {"$lt": self._id}, - 'uploader': self['uploader'], + 'uploader': self.uploader, 'state': 'processed'}).sort( '_id', DESCENDING).limit(1) @@ -304,7 +304,7 @@ class MediaEntry(Document): media=unicode(cursor[0]['slug'])) def get_uploader(self): - return self.db.User.find_one({'_id': self['uploader']}) + return self.db.User.find_one({'_id': self.uploader}) def get_fail_exception(self): """ diff --git a/mediagoblin/edit/lib.py b/mediagoblin/edit/lib.py index 4ce2d42f..a199cbf7 100644 --- a/mediagoblin/edit/lib.py +++ b/mediagoblin/edit/lib.py @@ -17,7 +17,7 @@ def may_edit_media(request, media): """Check, if the request's user may edit the media details""" - if media['uploader'] == request.user._id: + if media.uploader == request.user._id: return True if request.user.is_admin: return True diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 4e8c3686..0b84f639 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -57,7 +57,7 @@ def edit_media(request, media): # and userid. existing_user_slug_entries = request.db.MediaEntry.find( {'slug': request.POST['slug'], - 'uploader': media['uploader'], + 'uploader': media.uploader, '_id': {'$ne': media._id}}).count() if existing_user_slug_entries: @@ -79,7 +79,7 @@ def edit_media(request, media): location=media.url_for_self(request.urlgen)) if request.user.is_admin \ - and media['uploader'] != request.user._id \ + and media.uploader != request.user._id \ and request.method != 'POST': messages.add_message( request, messages.WARNING, diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 6beb6b18..64d4b541 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -64,7 +64,7 @@ def submit_start(request): entry['description_html'] = cleaned_markdown_conversion( entry['description']) - entry['uploader'] = request.user['_id'] + entry.uploader = request.user._id # Process the user's folksonomy "tags" entry['tags'] = convert_to_tag_list_of_dicts( diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 89fd104d..d7d510d4 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -115,7 +115,7 @@ - + @@ -57,7 +57,7 @@ {% for media_entry in failed_entries %} - + diff --git a/mediagoblin/templates/mediagoblin/utils/object_gallery.html b/mediagoblin/templates/mediagoblin/utils/object_gallery.html index e1b8cc9b..65ff09a4 100644 --- a/mediagoblin/templates/mediagoblin/utils/object_gallery.html +++ b/mediagoblin/templates/mediagoblin/utils/object_gallery.html @@ -33,9 +33,9 @@ - {% if entry['title'] %} + {% if entry.title %}
- {{ entry['title'] }} + {{ entry.title }} {% endif %} {% endfor %} -- cgit v1.2.3 From 5da0bf901be7551e9708dd248319ff57d7b29a57 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 4 Dec 2011 19:57:42 +0100 Subject: Dot-Notation for MediaEntry.slug --- mediagoblin/db/models.py | 12 ++++++------ mediagoblin/edit/views.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 7af76b9f..aeee69dd 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -249,13 +249,13 @@ class MediaEntry(Document): pass def generate_slug(self): - self['slug'] = url.slugify(self.title) + self.slug = url.slugify(self.title) duplicate = mg_globals.database.media_entries.find_one( - {'slug': self['slug']}) + {'slug': self.slug}) if duplicate: - self['slug'] = "%s-%s" % (self._id, self['slug']) + self.slug = "%s-%s" % (self._id, self.slug) def url_for_self(self, urlgen): """ @@ -269,7 +269,7 @@ class MediaEntry(Document): return urlgen( 'mediagoblin.user_pages.media_home', user=uploader.username, - media=self['slug']) + media=self.slug) else: return urlgen( 'mediagoblin.user_pages.media_home', @@ -287,7 +287,7 @@ class MediaEntry(Document): if cursor.count(): return urlgen('mediagoblin.user_pages.media_home', user=self.get_uploader().username, - media=unicode(cursor[0]['slug'])) + media=unicode(cursor[0].slug)) def url_to_next(self, urlgen): """ @@ -301,7 +301,7 @@ class MediaEntry(Document): if cursor.count(): return urlgen('mediagoblin.user_pages.media_home', user=self.get_uploader().username, - media=unicode(cursor[0]['slug'])) + media=unicode(cursor[0].slug)) def get_uploader(self): return self.db.User.find_one({'_id': self.uploader}) diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index feda397d..51661a21 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -44,7 +44,7 @@ def edit_media(request, media): defaults = dict( title=media.title, - slug=media['slug'], + slug=media.slug, description=media['description'], tags=media_tags_as_string(media['tags'])) @@ -72,7 +72,7 @@ def edit_media(request, media): media['description_html'] = cleaned_markdown_conversion( media['description']) - media['slug'] = unicode(request.POST['slug']) + media.slug = unicode(request.POST['slug']) media.save() return exc.HTTPFound( -- cgit v1.2.3 From 1d9399660416fe5a04d322303986434815bc15f0 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 4 Dec 2011 20:06:42 +0100 Subject: Dot-Notation for MediaEntry.description(_html) --- mediagoblin/edit/views.py | 8 ++++---- mediagoblin/submit/views.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 51661a21..4cb98c15 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -45,7 +45,7 @@ def edit_media(request, media): defaults = dict( title=media.title, slug=media.slug, - description=media['description'], + description=media.description, tags=media_tags_as_string(media['tags'])) form = forms.EditForm( @@ -65,12 +65,12 @@ def edit_media(request, media): _(u'An entry with that slug already exists for this user.')) else: media.title = unicode(request.POST['title']) - media['description'] = unicode(request.POST.get('description')) + media.description = unicode(request.POST.get('description')) media['tags'] = convert_to_tag_list_of_dicts( request.POST.get('tags')) - media['description_html'] = cleaned_markdown_conversion( - media['description']) + media.description_html = cleaned_markdown_conversion( + media.description) media.slug = unicode(request.POST['slug']) media.save() diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 1805e293..8da71341 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -60,9 +60,9 @@ def submit_start(request): unicode(request.POST['title']) or unicode(splitext(filename)[0])) - entry['description'] = unicode(request.POST.get('description')) - entry['description_html'] = cleaned_markdown_conversion( - entry['description']) + entry.description = unicode(request.POST.get('description')) + entry.description_html = cleaned_markdown_conversion( + entry.description) entry.uploader = request.user._id -- cgit v1.2.3 From f4ee839939e4215820df3132b62c51f721510f77 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 4 Dec 2011 20:16:01 +0100 Subject: Dot-Notation for MediaEntry.media_type --- mediagoblin/processing.py | 4 ++-- mediagoblin/submit/views.py | 2 +- mediagoblin/user_pages/views.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mediagoblin/processing.py b/mediagoblin/processing.py index 89c4ac89..7dd5cc7d 100644 --- a/mediagoblin/processing.py +++ b/mediagoblin/processing.py @@ -55,8 +55,8 @@ class ProcessMedia(Task): # Try to process, and handle expected errors. try: - #__import__(entry['media_type']) - manager = get_media_manager(entry['media_type']) + #__import__(entry.media_type) + manager = get_media_manager(entry.media_type) manager['processor'](entry) except BaseProcessingFail, exc: mark_entry_failed(entry._id, exc) diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 8da71341..4e4c7c43 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -55,7 +55,7 @@ def submit_start(request): # create entry and save in database entry = request.db.MediaEntry() entry['_id'] = ObjectId() - entry['media_type'] = unicode(media_type) + entry.media_type = unicode(media_type) entry.title = ( unicode(request.POST['title']) or unicode(splitext(filename)[0])) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index dc549567..87b82c74 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -122,7 +122,7 @@ def media_home(request, media, page, **kwargs): comment_form = user_forms.MediaCommentForm(request.POST) - media_template_name = get_media_manager(media['media_type'])['display_template'] + media_template_name = get_media_manager(media.media_type)['display_template'] return render_to_response( request, -- cgit v1.2.3 From ddc1cae9ea4c80415557ec0408a56a3a1c60423b Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 4 Dec 2011 20:26:36 +0100 Subject: Dot-Notation for MediaEntry.media_data --- mediagoblin/db/models.py | 4 ++-- mediagoblin/media_types/video/processing.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index aeee69dd..569c3600 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -131,7 +131,7 @@ class MediaEntry(Document): For example, images might contain some EXIF data that's not appropriate to other formats. You might store it like: - mediaentry['media_data']['exif'] = { + mediaentry.media_data['exif'] = { 'manufacturer': 'CASIO', 'model': 'QV-4000', 'exposure_time': .659} @@ -139,7 +139,7 @@ class MediaEntry(Document): Alternately for video you might store: # play length in seconds - mediaentry['media_data']['play_length'] = 340 + mediaentry.media_data['play_length'] = 340 ... so what's appropriate here really depends on the media type. diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index 6125e49c..93f16e86 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -75,7 +75,7 @@ def process_video(entry): entry['media_files']['webm_640'] = medium_filepath # Save the width and height of the transcoded video - entry['media_data']['video'] = { + entry.media_data['video'] = { u'width': transcoder.dst_data.videowidth, u'height': transcoder.dst_data.videoheight} -- cgit v1.2.3 From 4535f7597f112443d8997bbd6b8a445612c2440d Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Tue, 6 Dec 2011 23:05:47 +0100 Subject: Bug 681 - Comments from reviewing the new video merge in mediagoblin.media_types and submodules - Moved VideoThumbnailer.errors initialization to VideoThumbnailer.__init__ - Cleaned up the image.processing imports - Removed default ``None`` from get_media_manager(_media_type) in mediagoblin.views - Removed media_types import - Removed sys import, and passing of sys to root.html template --- mediagoblin/media_types/__init__.py | 21 ++++++++++++++++++--- mediagoblin/media_types/image/processing.py | 9 ++------- mediagoblin/media_types/video/transcoders.py | 4 ++-- mediagoblin/views.py | 6 +----- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index 61786562..4fa56bc3 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -30,7 +30,7 @@ class InvalidFileType(Exception): def get_media_types(): """ - Generator that returns the available media types + Generator, yields the available media types """ for media_type in mg_globals.app_config['media_types']: yield media_type @@ -38,7 +38,7 @@ def get_media_types(): def get_media_managers(): ''' - Generator that returns all available media managers + Generator, yields all enabled media managers ''' for media_type in get_media_types(): __import__(media_type) @@ -46,20 +46,35 @@ def get_media_managers(): yield media_type, sys.modules[media_type].MEDIA_MANAGER -def get_media_manager(_media_type = None): +def get_media_manager(_media_type): + ''' + Get the MEDIA_MANAGER based on a media type string + + Example:: + get_media_type('mediagoblin.media_types.image') + ''' + if not _media_type: + return False + for media_type, manager in get_media_managers(): if media_type in _media_type: return manager def get_media_type_and_manager(filename): + ''' + Get the media type and manager based on a filename + ''' for media_type, manager in get_media_managers(): if filename.find('.') > 0: + # Get the file extension ext = os.path.splitext(filename)[1].lower() else: raise InvalidFileType( _('Could not find any file extension in "{filename}"').format( filename=filename)) + # Omit the dot from the extension and match it against + # the media manager if ext[1:] in manager['accepted_extensions']: return media_type, manager diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py index 5b8259fc..e493eb2b 100644 --- a/mediagoblin/media_types/image/processing.py +++ b/mediagoblin/media_types/image/processing.py @@ -17,15 +17,10 @@ import Image import os -from celery.task import Task -from celery import registry - -from mediagoblin.db.util import ObjectId from mediagoblin import mg_globals as mgg -from mediagoblin.processing import BaseProcessingFail, \ - mark_entry_failed, BadMediaFail, create_pub_filepath, THUMB_SIZE, \ - MEDIUM_SIZE +from mediagoblin.processing import BadMediaFail, \ + create_pub_filepath, THUMB_SIZE, MEDIUM_SIZE ################################ # Media processing initial steps diff --git a/mediagoblin/media_types/video/transcoders.py b/mediagoblin/media_types/video/transcoders.py index d7ed14ca..7071b887 100644 --- a/mediagoblin/media_types/video/transcoders.py +++ b/mediagoblin/media_types/video/transcoders.py @@ -74,14 +74,14 @@ class VideoThumbnailer: buffer_probes = {} - errors = [] - def __init__(self, source_path, dest_path): ''' Set up playbin pipeline in order to get video properties. Initializes and runs the gobject.MainLoop() ''' + self.errors = [] + self.source_path = source_path self.dest_path = dest_path diff --git a/mediagoblin/views.py b/mediagoblin/views.py index cd6aba9b..1e1db6c3 100644 --- a/mediagoblin/views.py +++ b/mediagoblin/views.py @@ -14,14 +14,11 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import sys - from mediagoblin import mg_globals 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 -from mediagoblin import media_types @@ -36,8 +33,7 @@ def root_view(request, page): request, 'mediagoblin/root.html', {'media_entries': media_entries, 'allow_registration': mg_globals.app_config["allow_registration"], - 'pagination': pagination, - 'sys': sys}) + 'pagination': pagination}) def simple_template_render(request): -- cgit v1.2.3 From 3f45d9fbe8ed8cad2f3fc9a8e2a68a77ace0a958 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Wed, 7 Dec 2011 22:15:48 +0100 Subject: Move author text, "By X", to the sidebar --- mediagoblin/templates/mediagoblin/user_pages/media.html | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 7434664c..95197c15 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -55,12 +55,8 @@

{{ media.description_html }}

{% endautoescape %}

- {% trans date=media.created.strftime("%Y-%m-%d"), - user_url=request.urlgen( - 'mediagoblin.user_pages.user_home', - user=media.get_uploader().username), - username=media.get_uploader().username -%} - By {{ username }} on {{ date }} + {% trans date=media.created.strftime("%Y-%m-%d") -%} + {{ date }} {%- endtrans %}

@@ -114,6 +110,13 @@ {% endif %}
+ {% trans user_url=request.urlgen( + 'mediagoblin.user_pages.user_home', + user=media.get_uploader().username), + username=media.get_uploader().username -%} +

❖ Browsing media by {{ username }}

+ {%- endtrans %} + {% include "mediagoblin/utils/prev_next.html" %} {% if media['uploader'] == request.user._id or -- cgit v1.2.3 From 75a12d632dd281d4d74b93f9014000a3efdc3169 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 9 Dec 2011 22:37:20 +0100 Subject: Lots of changes to media page; rearranged things, added new styles, added jquery bits, gave the comment section a refresh --- mediagoblin/static/css/base.css | 29 ++++++-- .../templates/mediagoblin/user_pages/media.html | 79 +++++++++++++--------- mediagoblin/user_pages/forms.py | 2 +- 3 files changed, 69 insertions(+), 41 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 12d88ffa..bbc04342 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -117,7 +117,7 @@ a.mediagoblin_logo{ /* common website elements */ -.button_action, .button_action_highlight{ +.button_action, .button_action_highlight { color: #c3c3c3; background-color: #363636; border: 1px solid; @@ -128,16 +128,16 @@ a.mediagoblin_logo{ text-decoration: none; font-style: normal; font-weight: bold; - font-size: 1em; + font-size: 16px; + cursor: pointer; } -.button_action_highlight{ +.button_action_highlight { background-color: #86D4B1; border-color: #A2DEC3 #6CAA8E #5C9179; color: #283F35; } - .button_form, .cancel_link { height: 32px; min-width: 99px; @@ -171,15 +171,15 @@ a.mediagoblin_logo{ background-image: linear-gradient(top, #D2D2D2, #aaa); } -.pagination{ +.pagination { text-align: center; } -.pagination_arrow{ +.pagination_arrow { margin: 5px; } -.empty_space{ +.empty_space { background-image: url("../images/empty_back.png"); font-style: italic; text-align: center; @@ -187,6 +187,21 @@ text-align: center; padding-top: 70px; } +.right_align { + float: right; +} + +textarea { + border: none; + background-color: #f1f1f1; + padding: 3px; +} + +textarea#comment_content { + width: 634px; + height: 90px; +} + /* forms */ .form_box { diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 95197c15..12039473 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -22,11 +22,25 @@ {% block title %}{{ media.title }} — {{ super() }}{% endblock %} +{% block mediagoblin_head %} + +{% endblock mediagoblin_head %} + {% block mediagoblin_content %} {% if media %}
- {% block mediagoblin_media %} + {% block mediagoblin_media %} {% set display_media = request.app.public_store.file_url( media.get_display_media(media.media_files)) %} @@ -45,7 +59,7 @@ src="{{ display_media }}" alt="Image for {{ media.title }}" /> {% endif %} - {% endblock %} + {% endblock %}

@@ -59,9 +73,36 @@ {{ date }} {%- endtrans %}

-

- {% if request.user and comments.count() %} -

{% trans %}Post a comment{% endtrans %}

+ + {% if media['uploader'] == request.user._id or + request.user['is_admin'] %} +

+ {% set edit_url = request.urlgen('mediagoblin.edit.edit_media', + user= media.get_uploader().username, + media= media._id) %} + {% trans %}Edit{% endtrans %} +

+

+ {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', + user= media.get_uploader().username, + media= media._id) %} + {% trans %}Delete{% endtrans %} +

+ {% endif %} + +

{% trans %}23 comments{% endtrans %}

+ {# 0 comments. Be the first to add one! #} + {% if request.user %} + +

{% trans %}Type your comment here. You can use Markdown for formatting.{% endtrans %}

+ {{ wtforms_util.render_divs(comment_form) }} +
+ + {{ csrf_token }} +
+ {% endif %} {% if comments %} {% for comment in comments %} @@ -90,18 +131,6 @@
{% endfor %} - {% if request.user %} -
- {{ wtforms_util.render_divs(comment_form) }} -
- - {{ csrf_token }} -
- - {% endif %} - {{ render_pagination(request, pagination, request.urlgen('mediagoblin.user_pages.media_home', user = media.get_uploader().username, @@ -119,22 +148,6 @@ {% include "mediagoblin/utils/prev_next.html" %} - {% if media['uploader'] == request.user._id or - request.user['is_admin'] %} -

- {% set edit_url = request.urlgen('mediagoblin.edit.edit_media', - user= media.get_uploader().username, - media= media._id) %} - {% trans %}Edit{% endtrans %} -

-

- {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', - user= media.get_uploader().username, - media= media._id) %} - {% trans %}Delete{% endtrans %} -

- {% endif %} - {% if media.attachment_files|count %}

Attachments

    diff --git a/mediagoblin/user_pages/forms.py b/mediagoblin/user_pages/forms.py index 301f1f0a..e04fd559 100644 --- a/mediagoblin/user_pages/forms.py +++ b/mediagoblin/user_pages/forms.py @@ -21,7 +21,7 @@ from mediagoblin.tools.translate import fake_ugettext_passthrough as _ class MediaCommentForm(wtforms.Form): comment_content = wtforms.TextAreaField( - _('Comment'), + _(''), [wtforms.validators.Required()]) -- cgit v1.2.3 From 9c6d8d77fba60a355b2b60d4c0a48de8bd58f2fa Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 9 Dec 2011 22:45:26 +0100 Subject: Only apply textarea style to comment box --- mediagoblin/static/css/base.css | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index bbc04342..89988c8b 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -191,15 +191,12 @@ text-align: center; float: right; } -textarea { - border: none; - background-color: #f1f1f1; - padding: 3px; -} - textarea#comment_content { width: 634px; height: 90px; + border: none; + background-color: #f1f1f1; + padding: 3px; } /* forms */ -- cgit v1.2.3 From 8f25d91b1ee8672afa2ebdfb9c938dd1e3439149 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 9 Dec 2011 22:48:20 +0100 Subject: Open Markdown link in new windows; I know _blank is sometimes frowned upon but it may be useful here --- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 12039473..000b1b80 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -96,7 +96,7 @@
    -

    {% trans %}Type your comment here. You can use Markdown for formatting.{% endtrans %}

    +

    {% trans %}Type your comment here. You can use Markdown for formatting.{% endtrans %}

    {{ wtforms_util.render_divs(comment_form) }}
    -- cgit v1.2.3 From de73724066d0fb49b77b53332c80d3cbc5f59221 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 9 Dec 2011 23:47:11 +0100 Subject: Change wording in tags.html --- mediagoblin/templates/mediagoblin/utils/tags.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html index c7dfc8eb..1f587411 100644 --- a/mediagoblin/templates/mediagoblin/utils/tags.html +++ b/mediagoblin/templates/mediagoblin/utils/tags.html @@ -17,12 +17,12 @@ #} {% block tags_content -%} -

    {% trans %}Tagged with{% endtrans %} +

    {% trans %}View more media tagged with{% endtrans %} {% for tag in media.tags %} {% if loop.last %} {# the 'and' should only appear if there is more than one tag #} {% if media.tags|length > 1 %} - {% trans %}and{% endtrans %} + {% trans %}or{% endtrans %} {% endif %} Previous page - {% trans %}Newer{% endtrans %} + {% trans %}← Newer{% endtrans %} {% endif %} {% if pagination.has_next %} {% set next_url = pagination.get_page_url_explicit( base_url, get_params, pagination.page + 1) %} - {% trans %}Older{% endtrans %} - Next page + {% trans %}Older →{% endtrans %} {% endif %}
    {% trans %}Go to page:{% endtrans %} -- cgit v1.2.3 From b27067371d6cb99cf21c7c0970b664e970d9a22d Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sat, 10 Dec 2011 21:03:18 +0100 Subject: Style changes for media_uploader (now media_specs); removed margins from button_action buttons --- mediagoblin/static/css/base.css | 16 ++++++++++------ mediagoblin/templates/mediagoblin/user_pages/media.html | 16 +++++----------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 89988c8b..c1239abb 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -96,6 +96,7 @@ input, textarea { a.mediagoblin_logo{ color: #fff; font-weight: bold; + margin-right: 8px; } .mediagoblin_footer { @@ -123,7 +124,6 @@ a.mediagoblin_logo{ border: 1px solid; border-color: #464646 #2B2B2B #252525; border-radius: 4px; - margin: 8px; padding: 3px 8px; text-decoration: none; font-style: normal; @@ -285,24 +285,28 @@ textarea#comment_content { /* media detail */ -h2.media_title{ +h2.media_title { margin-bottom: 0px; } -p.media_uploader{ +p.media_specs { font-size: 0.9em; + border-top: 1px solid #222; + border-bottom: 1px solid #222; + padding: 10px 0px; + color: #888; } /* icons */ -img.media_icon{ +img.media_icon { margin: 0 4px; vertical-align: sub; } /* navigation */ -.navigation_button{ +.navigation_button { width: 135px; display: block; float: left; @@ -317,7 +321,7 @@ img.media_icon{ margin: 0 0 20px } -.navigation_left{ +.navigation_left { margin-right: 6px; } diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 000b1b80..1a19443c 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -68,28 +68,22 @@ {% autoescape False %}

    {{ media.description_html }}

    {% endautoescape %} -

    +

    {% trans date=media.created.strftime("%Y-%m-%d") -%} - {{ date }} + Added on {{ date }}. Licensed under an X license. {%- endtrans %} -

    - - {% if media['uploader'] == request.user._id or + {% if media['uploader'] == request.user._id or request.user['is_admin'] %} -

    {% set edit_url = request.urlgen('mediagoblin.edit.edit_media', user= media.get_uploader().username, media= media._id) %} {% trans %}Edit{% endtrans %} -

    -

    {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', user= media.get_uploader().username, media= media._id) %} {% trans %}Delete{% endtrans %} -

    - {% endif %} - + {% endif %} +

    {% trans %}23 comments{% endtrans %}

    {# 0 comments. Be the first to add one! #} {% if request.user %} -- cgit v1.2.3 From ed1840ee64eca680581fd764369f81063dd72831 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 12 Dec 2011 07:35:47 -0600 Subject: Mark "newer/older" buttons for translation --- mediagoblin/templates/mediagoblin/utils/prev_next.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/utils/prev_next.html b/mediagoblin/templates/mediagoblin/utils/prev_next.html index 3363891b..b0c01963 100644 --- a/mediagoblin/templates/mediagoblin/utils/prev_next.html +++ b/mediagoblin/templates/mediagoblin/utils/prev_next.html @@ -25,23 +25,23 @@ {# There are no previous entries for the very first media entry #} {% if prev_entry_url %} - ← newer + ← {% trans %}newer{% endtrans %} {% else %} {# This is the first entry. display greyed-out 'previous' image #} {% endif %} {# Likewise, this could be the very last media entry #} {% if next_entry_url %} - older → + {% trans %}older{% endtrans %} → {% else %} {# This is the last entry. display greyed-out 'next' image #} {% endif %}
    -- cgit v1.2.3 From 23caf305f28d1e8baf5196703ac316cfe4e740dc Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 12 Dec 2011 08:10:10 -0600 Subject: Allow administrators to disable keeping the original. That's the new default! --- mediagoblin/config_spec.ini | 5 +++++ mediagoblin/media_types/video/processing.py | 29 +++++++++++++++-------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini index 13ce925e..eb22bc1b 100644 --- a/mediagoblin/config_spec.ini +++ b/mediagoblin/config_spec.ini @@ -61,6 +61,11 @@ storage_class = string(default="mediagoblin.storage.filestorage:BasicFileStorage base_dir = string(default="%(here)s/user_dev/media/queue") +# Should we keep the original file? +[media_type:mediagoblin.media_types.video] +keep_original = boolean(default=False) + + [beaker.cache] type = string(default="file") data_dir = string(default="%(here)s/user_dev/beaker/cache/data") diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index 6125e49c..c0a3fb67 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -41,6 +41,8 @@ def process_video(entry): and attaches callbacks to that child process, hopefully, the entry-complete callback will be called when the video is done. """ + video_config = mgg.global_config['media_type:mediagoblin.media_types.video'] + workbench = mgg.workbench_manager.create_workbench() queued_filepath = entry['queued_media_file'] @@ -94,25 +96,24 @@ def process_video(entry): entry['media_files']['thumb'] = thumbnail_filepath + if video_config['keep_original']: + # Push original file to public storage + queued_file = file(queued_filename, 'rb') - # Push original file to public storage - queued_file = file(queued_filename, 'rb') - - with queued_file: - original_filepath = create_pub_filepath( - entry, - queued_filepath[-1]) + with queued_file: + original_filepath = create_pub_filepath( + entry, + queued_filepath[-1]) - with mgg.public_store.get_file(original_filepath, 'wb') as \ - original_file: - _log.debug('Saving original...') - original_file.write(queued_file.read()) - _log.debug('Saved original') + with mgg.public_store.get_file(original_filepath, 'wb') as \ + original_file: + _log.debug('Saving original...') + original_file.write(queued_file.read()) + _log.debug('Saved original') - entry['media_files']['original'] = original_filepath + entry['media_files']['original'] = original_filepath mgg.queue_store.delete_file(queued_filepath) - # Save the MediaEntry entry.save() -- cgit v1.2.3 From 438dd8cd8f79f32609cce15d70ef6a93f1531a3b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 12 Dec 2011 08:13:46 -0600 Subject: Add a note on how to up the upload size limit --- docs/source/deploying.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/source/deploying.rst b/docs/source/deploying.rst index 70b1a6af..14b2c9cf 100644 --- a/docs/source/deploying.rst +++ b/docs/source/deploying.rst @@ -196,6 +196,9 @@ this ``nginx.conf`` file should be modeled on the following: :: # This is the section you should read ##################################### + # Change this to update the upload size limit for your users + client_max_body_size 8m; + server_name mediagoblin.example.org www.mediagoblin.example.org; access_log /var/log/nginx/mediagoblin.example.access.log; error_log /var/log/nginx/mediagoblin.example.error.log; -- cgit v1.2.3 From c36c3782737ef6d27137275ab98dbec49d7cd9ba Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 12 Dec 2011 08:15:16 -0600 Subject: Removed extraneous whitespace from video.html --- mediagoblin/templates/mediagoblin/media_displays/video.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html index 5b8ec789..5ef1a782 100644 --- a/mediagoblin/templates/mediagoblin/media_displays/video.html +++ b/mediagoblin/templates/mediagoblin/media_displays/video.html @@ -21,5 +21,5 @@ {%- endtrans -%}

    - {% endif %} + {% endif %} {% endblock %} -- cgit v1.2.3 From 528c8b8fabe7036b63c44d93adc9e7b068bbcd91 Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Mon, 12 Dec 2011 09:46:23 -0500 Subject: Tweak runtests to be more helpful If nose isn't installed, then runtests.sh says it can't find nosetests and exits, but doesn't tell you what you need to do to fix the situation. This fixes that. --- runtests.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtests.sh b/runtests.sh index 1dfbf093..4265326c 100755 --- a/runtests.sh +++ b/runtests.sh @@ -23,7 +23,8 @@ elif which nosetests > /dev/null; then echo "Using nosetests from \$PATH"; export NOSETESTS="nosetests"; else - echo "No nosetests found, exiting! X_X"; + echo "nosetests not found. X_X"; + echo "Please install 'nose'. Exiting."; exit 1 fi -- cgit v1.2.3 From 5b9ef3d58f7b8f8669c5cfb7c4938e01d297ed10 Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Mon, 12 Dec 2011 09:53:41 -0500 Subject: Update README * tweaked some language * fixed some statements that aren't correct anymore --- README | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/README b/README index 0aba179b..07f9a094 100644 --- a/README +++ b/README @@ -8,19 +8,18 @@ What is GNU MediaGoblin? * Initially, a place to store all your photos that’s as awesome as, if not more awesome than, existing network services (Flickr, SmugMug, Picasa, etc) -* Later, a place for all sorts of media, such as video, music, etc hosting. -* Federated with OStatus! * Customizable! * A place for people to collaborate and show off original and derived - creations. Free, as in freedom. We’re a GNU project in the making, - afterall. + creations. Free, as in freedom. We’re a GNU project after all. +* Later, a place for all sorts of media, such as video, music, etc hosting. +* Later, federated with OStatus! Is it ready for me to use? ========================== -Not yet! We're working on it and we hope to have a usable system by -September / October 2011. +Yes! But with caveats. The software is usable and there are instances +running, but it's still in its early stages. Can I help/hang out/participate/whisper sweet nothings in your ear? @@ -33,9 +32,9 @@ hang out, see `our Join page `_ Where is the documentation? =========================== -The beginnings of a user manual is located in the ``docs/`` directory -in HTML, Texinfo, and source (Restructured Text) forms. It's also -available online at http://docs.mediagoblin.org/ in HTML form. +The beginnings of a site administration manual is located in the ``docs/`` +directory in HTML, Texinfo, and source (Restructured Text) forms. It's +also available online at http://docs.mediagoblin.org/ in HTML form. Contributor/developer documentation as well as documentation on the project processes and infrastructure is located on -- cgit v1.2.3 From 78dc055e22b55253ed395d616a6ce5635ef91499 Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Mon, 12 Dec 2011 10:17:03 -0500 Subject: Add some documentation to lazyserver.sh I had no idea what it did, so I asked and tossed the answer at the top of the script. --- lazyserver.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lazyserver.sh b/lazyserver.sh index 63818a6a..4ca073b5 100755 --- a/lazyserver.sh +++ b/lazyserver.sh @@ -16,6 +16,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +# +# This runs Mediagoblin using Paste with Celery set to always eager mode. +# + if [ "$1" = "-h" ] then echo "$0 [-h] [-c paste.ini] [ARGS_to_paster ...]" -- cgit v1.2.3 From 076bf0cf28bae50dcd0f9e79e5c9e6501f1ad04a Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Mon, 12 Dec 2011 10:20:05 -0500 Subject: Doc updates * fixed some language * fixed some consistency issues * fixed some 80-line-width issues * fixed some typos and markup problems --- docs/source/configuration.rst | 42 +++---- docs/source/deploying.rst | 195 +++++++++++++++++---------------- docs/source/foreword.rst | 8 +- docs/source/production-deployments.rst | 29 +++-- 4 files changed, 142 insertions(+), 132 deletions(-) diff --git a/docs/source/configuration.rst b/docs/source/configuration.rst index 093f492c..1e22ad2d 100644 --- a/docs/source/configuration.rst +++ b/docs/source/configuration.rst @@ -19,13 +19,13 @@ mediagoblin.ini tweak settings for MediaGoblin, you'll usually tweak them here. paste.ini - This is primarily a server configuration file, on the python side - (specifically, on the wsgi side, via `paste deploy + This is primarily a server configuration file, on the Python side + (specifically, on the WSGI side, via `paste deploy `_ / `paste script `_). It also sets up some middleware that you can mostly ignore, except to configure sessions... more on that later. If you are adding a different - python server other than fastcgi / plain http, you might configure + Python server other than fastcgi / plain HTTP, you might configure it here. You probably won't need to change this file very much. @@ -47,19 +47,23 @@ Let's assume you're doing the virtualenv setup described elsewhere in this manual, and you need to make local tweaks to the config files. How do you do that? Let's see. -To make changes to mediagoblin.ini: +To make changes to mediagoblin.ini :: - cp mediagoblin.ini mediagoblin_local.ini + cp mediagoblin.ini mediagoblin_local.ini -To make changes to paste.ini: - cp paste.ini paste_local.ini +To make changes to paste.ini :: + + cp paste.ini paste_local.ini From here you should be able to make direct adjustments to the files, and most of the commands described elsewhere in this manual will "notice" your local config files and use those instead of the non-local version. -(Note that all commands provide a way to pass in a specific config -file also, usually by a -cf flag.) +.. note:: + + Note that all commands provide a way to pass in a specific config + file also, usually by a ``-cf`` flag. + Common changes ============== @@ -69,9 +73,9 @@ Enabling email notifications You'll almost certainly want to enable sending emails. By default, MediaGoblin doesn't really do this... for the sake of developer -convenience, it runs in "email debug mode". Change this: +convenience, it runs in "email debug mode". Change this:: - email_debug_mode = false + email_debug_mode = false You can (and should) change the "from" email address by setting ``email_sender_address``. @@ -82,21 +86,21 @@ If you have more custom SMTP settings, you also have the following options at your disposal, which are all optional, and do exactly what they sound like. - - email_smtp_host - - email_smtp_port - - email_smtp_user - - email_smtp_pass +- email_smtp_host +- email_smtp_port +- email_smtp_user +- email_smtp_pass All other configuration changes ------------------------------- -To be perfectly honest, there are quite a few options and I'm not -going to be able to get to documanting them all in time for 0.1.0. +To be perfectly honest, there are quite a few options and we haven't had +time to document them all So here's a cop-out section saying that if you get into trouble, hop -onto IRC and we'll help you out: +onto IRC and we'll help you out:: - #mediagoblin on irc.freenode.net + #mediagoblin on irc.freenode.net Celery ====== diff --git a/docs/source/deploying.rst b/docs/source/deploying.rst index 14b2c9cf..4aded2e6 100644 --- a/docs/source/deploying.rst +++ b/docs/source/deploying.rst @@ -11,9 +11,11 @@ it simple with some assumptions and use a setup that combines mediagoblin + virtualenv + fastcgi + nginx on a .deb or .rpm based GNU/Linux distro. -Note: these tools are for administrators wanting to deploy a fresh -install. If instead you want to join in as a contributor, see our -`Hacking HOWTO `_ instead. +.. note:: + + These tools are for site administrators wanting to deploy a fresh + install. If instead you want to join in as a contributor, see our + `Hacking HOWTO `_ instead. Prepare System -------------- @@ -33,12 +35,15 @@ MediaGoblin has the following core dependencies: On a DEB-based system (e.g Debian, gNewSense, Trisquel, Ubuntu, and derivatives) issue the following command: :: - sudo apt-get install mongodb git-core python python-dev python-lxml python-imaging python-virtualenv + sudo apt-get install mongodb git-core python python-dev python-lxml \ + python-imaging python-virtualenv On a RPM-based system (e.g. Fedora, RedHat, and derivatives) issue the following command: :: - yum install mongodb-server python-paste-deploy python-paste-script git-core python python-devel python-lxml python-imaging python-virtualenv + yum install mongodb-server python-paste-deploy python-paste-script \ + git-core python python-devel python-lxml python-imaging \ + python-virtualenv Configure MongoDB ~~~~~~~~~~~~~~~~~ @@ -46,10 +51,11 @@ Configure MongoDB After installing MongoDB some preliminary database configuration may be necessary. -Ensure that MongoDB `journaling `_ -is enabled. Journaling is enabled by default in version 2.0 and later -64-bit MongoDB instances. Check your deployment, and consider enabling -journaling if you're running 32-bit systems or earlier version. +Ensure that MongoDB `journaling +`_ is enabled. Journaling +is enabled by default in version 2.0 and later 64-bit MongoDB instances. +Check your deployment, and consider enabling journaling if you're running +32-bit systems or earlier version. .. warning:: @@ -77,41 +83,42 @@ create "system account" or dedicated service user. Ensure that it is not possible to log in to your system with as this user. You should create a working directory for MediaGoblin. This document -assumes your local git repository will be located at ``/srv/mediagoblin.example.org/mediagoblin/`` -for this documentation. Substitute your prefer ed local deployment path -as needed. +assumes your local git repository will be located at +``/srv/mediagoblin.example.org/mediagoblin/`` for this documentation. +Substitute your prefer ed local deployment path as needed. This document assumes that all operations are performed as this user. To drop privileges to this user, run the following command: :: + su - [mediagoblin] - su - [mediagoblin]`` - -Where, "``[mediagoblin]`` is the username of the system user that will +Where, "``[mediagoblin]``" is the username of the system user that will run MediaGoblin. Install MediaGoblin and Virtualenv ---------------------------------- -As of |version|, MediaGoblin has a rapid development pace. As a result -the following instructions recommend installing from the ``master`` -branch of the git repository. Eventually production deployments will -want to transition to running from more consistent releases. +.. note:: + + As of |version|, MediaGoblin has a rapid development pace. As a result + the following instructions recommend installing from the ``master`` + branch of the git repository. Eventually production deployments will + want to transition to running from more consistent releases. Issue the following commands, to create and change the working -directory. Modify these commands to reflect your own environment: :: +directory. Modify these commands to reflect your own environment:: - mkdir -p /srv/mediagoblin.example.org/ - cd /srv/mediagoblin.example.org/ + mkdir -p /srv/mediagoblin.example.org/ + cd /srv/mediagoblin.example.org/ -Clone the MediaGoblin repository: :: +Clone the MediaGoblin repository:: - git clone git://gitorious.org/mediagoblin/mediagoblin.git + git clone git://gitorious.org/mediagoblin/mediagoblin.git -And setup the in-package virtualenv: :: +And setup the in-package virtualenv:: - cd mediagoblin - virtualenv . && ./bin/python setup.py develop + cd mediagoblin + virtualenv . && ./bin/python setup.py develop .. note:: @@ -127,16 +134,16 @@ more reliable and considerably easier to configure and illustrate. If you're familiar with Python packaging you may consider deploying with your preferred the method. -Assuming you are going to deploy with fastcgi, you should also install -flup: :: +Assuming you are going to deploy with FastCGI, you should also install +flup:: - ./bin/easy_install flup + ./bin/easy_install flup This concludes the initial configuration of the development environment. In the future, if at any point you want update your -codebase, you should also run: :: +codebase, you should also run:: - ./bin/python setup.py develop --upgrade && ./bin/gmg migrate. + ./bin/python setup.py develop --upgrade && ./bin/gmg migrate. Deploy MediaGoblin Services --------------------------- @@ -145,9 +152,9 @@ Test the Server ~~~~~~~~~~~~~~~ At this point MediaGoblin should be properly installed. You can -test the deployment with the following command: :: +test the deployment with the following command:: - ./lazyserver.sh --server-name=broadcast + ./lazyserver.sh --server-name=broadcast You should be able to connect to the machine on port 6543 in your browser to confirm that the service is operable. @@ -156,7 +163,7 @@ Connect the Webserver to MediaGoblin with FastCGI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This section describes how to configure MediaGoblin to work via -fastcgi. Our configuration example will use nginx, however, you may +FastCGI. Our configuration example will use nginx, however, you may use any webserver of your choice as long as it supports the FastCGI protocol. If you do not already have a web server, consider nginx, as the configuration files may be more clear than the @@ -166,78 +173,78 @@ Create a configuration file at ``/srv/mediagoblin.example.org/nginx.conf`` and create a symbolic link into a directory that will be included in your ``nginx`` configuration (e.g. "``/etc/nginx/sites-enabled`` or ``/etc/nginx/conf.d``) with -one of the following commands (as the root user:) :: +one of the following commands (as the root user):: - ln -s /srv/mediagoblin.example.org/nginx.conf /etc/nginx/conf.d/ - ln -s /srv/mediagoblin.example.org/nginx.conf /etc/nginx/sites-enabled/ + ln -s /srv/mediagoblin.example.org/nginx.conf /etc/nginx/conf.d/ + ln -s /srv/mediagoblin.example.org/nginx.conf /etc/nginx/sites-enabled/ Modify these commands and locations depending on your preferences and the existing configuration of your nginx instance. The contents of -this ``nginx.conf`` file should be modeled on the following: :: - - server { - ################################################# - # Stock useful config options, but ignore them :) - ################################################# - include /etc/nginx/mime.types; - - autoindex off; - default_type application/octet-stream; - sendfile on; - - # Gzip - gzip on; - gzip_min_length 1024; - gzip_buffers 4 32k; - gzip_types text/plain text/html application/x-javascript text/javascript text/xml text/css; - - ##################################### - # Mounting MediaGoblin stuff - # This is the section you should read - ##################################### - - # Change this to update the upload size limit for your users - client_max_body_size 8m; - - server_name mediagoblin.example.org www.mediagoblin.example.org; - access_log /var/log/nginx/mediagoblin.example.access.log; - error_log /var/log/nginx/mediagoblin.example.error.log; - - # MediaGoblin's stock static files: CSS, JS, etc. - location /mgoblin_static/ { - alias /srv/mediagoblin.example.org/mediagoblin/mediagoblin/static/; - } - - # Instance specific media: - location /mgoblin_media/ { - alias /srv/mediagoblin.example.org/mediagoblin/user_dev/media/public/; - } - - # Mounting MediaGoblin itself via fastcgi. - location / { - fastcgi_pass 127.0.0.1:26543; - include /etc/nginx/fastcgi_params; - - # our understanding vs nginx's handling of script_name vs - # path_info don't match :) - fastcgi_param PATH_INFO $fastcgi_script_name; - fastcgi_param SCRIPT_NAME ""; - } +this ``nginx.conf`` file should be modeled on the following:: + + server { + ################################################# + # Stock useful config options, but ignore them :) + ################################################# + include /etc/nginx/mime.types; + + autoindex off; + default_type application/octet-stream; + sendfile on; + + # Gzip + gzip on; + gzip_min_length 1024; + gzip_buffers 4 32k; + gzip_types text/plain text/html application/x-javascript text/javascript text/xml text/css; + + ##################################### + # Mounting MediaGoblin stuff + # This is the section you should read + ##################################### + + # Change this to update the upload size limit for your users + client_max_body_size 8m; + + server_name mediagoblin.example.org www.mediagoblin.example.org; + access_log /var/log/nginx/mediagoblin.example.access.log; + error_log /var/log/nginx/mediagoblin.example.error.log; + + # MediaGoblin's stock static files: CSS, JS, etc. + location /mgoblin_static/ { + alias /srv/mediagoblin.example.org/mediagoblin/mediagoblin/static/; + } + + # Instance specific media: + location /mgoblin_media/ { + alias /srv/mediagoblin.example.org/mediagoblin/user_dev/media/public/; + } + + # Mounting MediaGoblin itself via FastCGI. + location / { + fastcgi_pass 127.0.0.1:26543; + include /etc/nginx/fastcgi_params; + + # our understanding vs nginx's handling of script_name vs + # path_info don't match :) + fastcgi_param PATH_INFO $fastcgi_script_name; + fastcgi_param SCRIPT_NAME ""; } + } Now, nginx instance is configured to serve the MediaGoblin application. Perform a quick test to ensure that this configuration works. Restart nginx so it picks up your changes, with a command that -resembles one of the following (as the root user:) :: +resembles one of the following (as the root user):: - sudo /etc/init.d/nginx restart - sudo /etc/rc.d/nginx restart + sudo /etc/init.d/nginx restart + sudo /etc/rc.d/nginx restart Now start MediaGoblin. Use the following command sequence as an -example: :: +example:: - cd /srv/mediagoblin.example.org/mediagoblin/ - ./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 + cd /srv/mediagoblin.example.org/mediagoblin/ + ./lazyserver.sh --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 Visit the site you've set up in your browser by visiting . You should see MediaGoblin! diff --git a/docs/source/foreword.rst b/docs/source/foreword.rst index 835a7e7a..aa27647f 100644 --- a/docs/source/foreword.rst +++ b/docs/source/foreword.rst @@ -5,14 +5,14 @@ Foreword About the MediaGoblin Manual ============================ -This is the user manual for MediaGoblin. It covers how to set up and -configure MediaGoblin and the kind of information that someone running -MediaGoblin would need to know. +This is the site administrator manual for MediaGoblin. It covers how +to set up and configure MediaGoblin and the kind of information that +someone running MediaGoblin would need to know. We have other documentation at: * http://mediagoblin.org/join/ for general "join us" information -* http://wiki.mediagoblin.org/ for our contributor-focused wiki +* http://wiki.mediagoblin.org/ for our contributor/developer-focused wiki Improving the MediaGobiin Manual diff --git a/docs/source/production-deployments.rst b/docs/source/production-deployments.rst index 7bf26169..ef0bcad6 100644 --- a/docs/source/production-deployments.rst +++ b/docs/source/production-deployments.rst @@ -4,8 +4,7 @@ Considerations for Production Deployments This document contains a number of suggestions for deploying MediaGoblin in actual production environments. Consider -":doc:`deploying`" for a basic overview of how to deploy Media -Goblin. +":doc:`deploying`" for a basic overview of how to deploy MediaGoblin. Deploy with Paste ----------------- @@ -17,11 +16,11 @@ process. Use the following command as the basis for such a script: :: - CELERY_ALWAYS_EAGER=true \ - /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \ - /srv/mediagoblin.example.org/mediagoblin/paste.ini \ - --pid-file=/var/run/mediagoblin.pid \ - --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 \ + CELERY_ALWAYS_EAGER=true \ + /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \ + /srv/mediagoblin.example.org/mediagoblin/paste.ini \ + --pid-file=/var/run/mediagoblin.pid \ + --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 The above configuration places MediaGoblin in "always eager" mode with Celery, this means that submissions of content will be processed @@ -31,11 +30,11 @@ the user will be able to immediately return to the MediaGoblin site while processing is ongoing. In these cases, use the following command as the basis for your script: :: - CELERY_ALWAYS_EAGER=false \ - /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \ - /srv/mediagoblin.example.org/mediagoblin/paste.ini \ - --pid-file=/var/run/mediagoblin.pid \ - --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 \ + CELERY_ALWAYS_EAGER=false \ + /srv/mediagoblin.example.org/mediagoblin/bin/paster serve \ + /srv/mediagoblin.example.org/mediagoblin/paste.ini \ + --pid-file=/var/run/mediagoblin.pid \ + --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543 Separate Celery --------------- @@ -57,9 +56,9 @@ such as "ASCII art" or icon sharing, you will need to run ``celeryd`` as a separate process. Build an :ref:`init script ` around the following -command. +command:: - CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery ./bin/celeryd + CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery ./bin/celeryd Modify your existing MediaGoblin and application init scripts, if necessary, to prevent them from starting their own ``celeryd`` @@ -77,6 +76,6 @@ distribution/operating system. In the future, MediaGoblin will provide example scripts as examples. .. TODO insert init script here -.. TODO are additional concernts ? +.. TODO are additional concerns ? .. Other Concerns .. -------------- -- cgit v1.2.3 From 9bc2fc6c6a327a79ff5ad9d8f11f5b8f968154a6 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 12 Dec 2011 09:44:48 -0600 Subject: Added the "Media types" chapter --- docs/source/index.rst | 1 + docs/source/media-types.rst | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 docs/source/media-types.rst diff --git a/docs/source/index.rst b/docs/source/index.rst index 6ffe0974..f9c9285d 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -16,6 +16,7 @@ Table of Contents: deploying production-deployments configuration + media-types help theming codebase diff --git a/docs/source/media-types.rst b/docs/source/media-types.rst new file mode 100644 index 00000000..809efe07 --- /dev/null +++ b/docs/source/media-types.rst @@ -0,0 +1,34 @@ +.. _media-types-chapter: + +==================== +Enabling Media Types +==================== + +In the future, there will be all sorts of media types you can enable, +but in the meanwhile there's only one additional media type: video. + +First, you should probably read ":doc:`configuration`" to make sure +you know how to modify the mediagoblin config file. + +Video +===== + +To enable video, first install gstreamer and the python-gstreamer +bindings (as well as whatever gstremaer extensions you want, +good/bad/ugly). On Debianoid systems: + + sudo apt-get install python-gst0.10 + +Next, modify (and possibly copy over from mediagoblin.ini) your +mediagoblin_local.ini. Uncomment this line in the [mediagoblin] +section: + + media_types = mediagoblin.media_types.image, mediagoblin.media_types.video + +Now you should be able to submit videos, and mediagoblin should +transcode them. + +Note that you almost certainly want to separate Celery from the normal +paste process or your users will probably find that their connections +time out as the video transcodes. To set that up, check out the +":doc:`production-deployments`" section of this manual. -- cgit v1.2.3 From 57875c83c253e6e6aa08c3dbc92a3eb58664c88b Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Mon, 12 Dec 2011 09:45:45 -0600 Subject: Updated translations --- mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo | Bin 11805 -> 11802 bytes mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po | 10 +-- mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo | Bin 11754 -> 11749 bytes mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po | 6 +- mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo | Bin 12093 -> 12120 bytes mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po | 37 ++++++----- mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo | Bin 11596 -> 11350 bytes mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po | 58 ++++++++--------- mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo | Bin 15455 -> 15457 bytes mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po | 4 +- mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo | Bin 11789 -> 11993 bytes mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po | 75 ++++++++++++---------- 12 files changed, 100 insertions(+), 90 deletions(-) diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo index f7562eaa..a01abf9c 100644 Binary files a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index 7d7e0ee9..e2765357 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po @@ -17,8 +17,8 @@ msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:26+0000\n" -"Last-Translator: elrond \n" +"PO-Revision-Date: 2011-12-06 21:16+0000\n" +"Last-Translator: gandaro \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" @@ -185,7 +185,7 @@ msgstr "Yeeeaaah! Geschafft!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "Ungültiger Dateityp." #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" @@ -284,7 +284,7 @@ msgstr "Bestätigen" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Passwort wiederherstellen" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" @@ -409,7 +409,7 @@ msgstr "%(username)ss Medien" #: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" -msgstr "" +msgstr "Von %(username)s am %(date)s" #: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo index 8f37922f..3e0a84bf 100644 Binary files a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po index e5c6356e..c3c29b89 100644 --- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 19:15+0000\n" +"PO-Revision-Date: 2011-12-06 20:04+0000\n" "Last-Translator: aleksejrs \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -252,7 +252,7 @@ msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" -"Por aldoni viajn proprajn dosierojn, fari liston de plej plaĉantaj por vi, " +"Por aldoni viajn proprajn dosierojn, fari al vi liston de la plej plaĉaj, " "ks, vi povas ensaluti je via MediaGoblina konto." #: mediagoblin/templates/mediagoblin/root.html:31 @@ -272,7 +272,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" -msgstr "Plej nove aldonitaj dosieroj" +msgstr "Laste aldonitaj dosieroj" #: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo index bed6aab8..0f7f4026 100644 Binary files a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po index 460c074c..406e1923 100644 --- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po @@ -16,7 +16,7 @@ msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:49+0000\n" +"PO-Revision-Date: 2011-12-05 23:20+0000\n" "Last-Translator: manolinux \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mediagoblin/team/es/)\n" "MIME-Version: 1.0\n" @@ -83,12 +83,12 @@ msgstr "" #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" msgstr "" -"Debes iniciar sesión para que podamos saber a quién le enviamos el correo " +"¡Debes iniciar sesión para que podamos saber a quién le enviamos el correo " "electrónico!" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "Ya haz verificado tu dirección de email!" +msgstr "¡Ya has verificado tu dirección de correo!" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -113,7 +113,7 @@ msgstr "Etiquetas" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "Separar etiquetas por comas." +msgstr "Separa las etiquetas con comas." #: mediagoblin/edit/forms.py:33 msgid "Slug" @@ -164,7 +164,7 @@ msgstr "Contraseña incorrecta" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "Perfil editado!" +msgstr "¡Perfil editado!" #: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" @@ -184,7 +184,7 @@ msgstr "Debes proporcionar un archivo." #: mediagoblin/submit/views.py:127 msgid "Woohoo! Submitted!" -msgstr "¡Woohoo! ¡Enviado!" +msgstr "¡Yujú! ¡Enviado!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." @@ -192,7 +192,7 @@ msgstr "Tipo de archivo inválido." #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" -msgstr "Ups!" +msgstr "¡Ups!" #: mediagoblin/templates/mediagoblin/404.html:24 msgid "There doesn't seem to be a page at this address. Sorry!" @@ -220,7 +220,7 @@ msgstr "Enviar contenido" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "Verifica tu email!" +msgstr "¡Verifica tu email!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" @@ -246,7 +246,7 @@ msgstr "Explorar" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "Hola, bienvenido a este sitio de MediaGoblin!" +msgstr "Hola, ¡bienvenido a este sitio de MediaGoblin!" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "" @@ -267,7 +267,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "Aún no tienes una? Es fácil!" +msgstr "¿Aún no tienes una? ¡Es fácil!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -325,10 +325,13 @@ 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 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!" +"Hola %(username)s,\n" +"\n" +"Para cambiar tu contraseña de GNU MediaGoblin, abre la siguiente URL en un navegador:\n" +"\n" +"%(verification_url)s \n" +"\n" +"Si piensas que esto es un error, simplemente ignora este mensaje y sigue siendo un trasgo feliz." #: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" @@ -373,7 +376,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/edit/edit.html:29 #, python-format msgid "Editing %(media_title)s" -msgstr "Edición %(media_title)s " +msgstr "Editando %(media_title)s " #: mediagoblin/templates/mediagoblin/edit/edit.html:36 #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:49 @@ -442,7 +445,7 @@ msgstr "Borrar" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" -msgstr "Realmente deseas eliminar %(title)s ?" +msgstr "¿Realmente deseas eliminar %(title)s?" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 msgid "Delete Permanently" @@ -488,7 +491,7 @@ msgstr "Es necesario un correo electrónico de verificación" #: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." -msgstr "Casi terminas! Solo falta activar la cuenta." +msgstr "¡Casi hemos terminado! Solo falta activar la cuenta." #: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo index 95d6d0ae..87e62764 100644 Binary files a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po index daa65e0f..f1c044d2 100644 --- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" -"Last-Translator: cwebber \n" +"PO-Revision-Date: 2011-12-04 23:32+0000\n" +"Last-Translator: osc \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/mediagoblin/team/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -59,7 +59,7 @@ msgstr "Desculpe, um usuário com este nome já existe." #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "Desculpe, um usuário com esse email já esta cadastrado" #: mediagoblin/auth/views.py:179 msgid "" @@ -75,11 +75,11 @@ msgstr "A chave de verificação ou nome usuário estão incorretos." #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" -msgstr "" +msgstr " " #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "Você já verifico seu email!" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -103,7 +103,7 @@ msgstr "Etiquetas" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "" +msgstr "Separar tags por virgulas." #: mediagoblin/edit/forms.py:33 msgid "Slug" @@ -129,11 +129,11 @@ msgstr "Website" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "Senha antiga" #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "Nova Senha" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -149,15 +149,15 @@ msgstr "Você está editando um perfil de usuário. Tenha cuidado." #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "Senha errada" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "Perfil editado!" #: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" -msgstr "" +msgstr " " #: mediagoblin/submit/forms.py:25 msgid "File" @@ -177,7 +177,7 @@ msgstr "Eba! Enviado!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "Tipo de arquivo inválido." #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" @@ -209,11 +209,11 @@ msgstr "Enviar mídia" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "Verifique seu email!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "Sair" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -235,7 +235,7 @@ msgstr "Explorar" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Olá, bemvindo ao site de MediaGoblin." #: mediagoblin/templates/mediagoblin/root.html:28 msgid "" @@ -247,11 +247,11 @@ msgstr "" msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." -msgstr "" +msgstr " " #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr " " #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -276,11 +276,11 @@ msgstr "Enviar" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Recuperar senha" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" +msgstr "Mandar instruções" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -383,7 +383,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" -msgstr "" +msgstr "Original" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -406,7 +406,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" -msgstr "" +msgstr "Postar um comentário" #: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" @@ -414,15 +414,15 @@ msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" -msgstr "" +msgstr "Postar comentário!" #: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "Editar" #: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" +msgstr "Apagar" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -556,7 +556,7 @@ msgstr "Mais velho" #: mediagoblin/templates/mediagoblin/utils/pagination.html:50 msgid "Go to page:" -msgstr "" +msgstr "Ir a página:" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" @@ -564,7 +564,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "e" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -576,15 +576,15 @@ msgstr "Eu tenho certeza de que quero pagar isso" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Opa, seu comentáio estava vazio." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "Seu comentário foi postado!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Você deletou a mídia." #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo index 0e34144d..7e62de83 100644 Binary files a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po index c615cde2..098ea38c 100644 --- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 17:53+0000\n" +"PO-Revision-Date: 2011-12-04 19:58+0000\n" "Last-Translator: aleksejrs \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -251,7 +251,7 @@ msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" -"Для добавления собственных файлов, комментирования, ведения списка любиых " +"Для добавления собственных файлов, комментирования, ведения списка любимых " "файлов и т. п. вы можете представиться с помощью вашей MediaGoblin’овой " "учётной записи." diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo index 4e71eaa7..5ab7befa 100644 Binary files a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po index a44f7866..34cf1679 100644 --- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" -"Last-Translator: cwebber \n" +"PO-Revision-Date: 2011-12-10 23:09+0000\n" +"Last-Translator: martin \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -57,7 +57,7 @@ msgstr "Prepáč, rovnaké prihlasovacie meno už niekto používa." #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "Prepáč, používateľ s rovnakou e-mailovou adresou už existuje." #: mediagoblin/auth/views.py:179 msgid "" @@ -73,11 +73,11 @@ msgstr "Nesprávny overovací kľúč alebo používateľské ID" #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" -msgstr "" +msgstr "Aby sme ti mohli zaslať e-mail, je potrebné byť prihláseným!" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "Tvoja e-mailová adresa už bola raz overená!" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -101,7 +101,7 @@ msgstr "Štítky" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "" +msgstr "Oddeľ štítky pomocou čiarky." #: mediagoblin/edit/forms.py:33 msgid "Slug" @@ -126,11 +126,11 @@ msgstr "Webstránka" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "Staré heslo" #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "Nové heslo" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -146,15 +146,15 @@ msgstr "Upravuješ používateľský profil. Pristupuj opatrne." #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "Nesprávne heslo" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "Profil upravený!" #: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" -msgstr "" +msgstr "Nebolo možné nájsť žiadnu príponu v súbore \"{filename}\"" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -174,7 +174,7 @@ msgstr "Juchú! Úspešne vložené!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "Nesprávny typ súboru." #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" @@ -206,11 +206,11 @@ msgstr "Vložiť výtvor" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "Over si e-mail!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "odhlásenie" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -232,23 +232,27 @@ msgstr "Preskúmať" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Ahoj, vitaj na tejto MediaGoblin stránke!" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "" "This site is running MediaGoblin, an " "extraordinarily great piece of media hosting software." msgstr "" +"Táto stránka používa MediaGoblin, " +"výnimočne skvelý kus softvéru na hostovanie médií." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" +"Pre pridanie vlastných výtvorov, vloženie komentárov, uloženie svojich " +"obľúbených položiek a viac, sa musíš prihlásiť so svojim MediaGoblin účtom." #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "Ešte žiaden nemáš? Je to jednoduché!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -257,6 +261,9 @@ msgid "" " or\n" " Set up MediaGoblin on your own server" 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:44 msgid "Most recent media" @@ -273,11 +280,11 @@ msgstr "Vložiť" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Obnoviť heslo" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" +msgstr "Zaslať inštrukcie" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." @@ -377,11 +384,11 @@ msgstr "Úprava profilu, ktorý vlastní %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr "Výtvory označené s: %(tag_name)s" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" -msgstr "" +msgstr "Originál" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -390,7 +397,7 @@ msgstr "Vlož svoj výtvor" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "Výtvory používateľa %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format @@ -400,27 +407,27 @@ msgstr "Výtvory, ktoré vlastní %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" -msgstr "" +msgstr "Od %(username)s v čase %(date)s" #: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" -msgstr "" +msgstr "Zaslať komentár" #: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" -msgstr "" +msgstr "o" #: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" -msgstr "" +msgstr "Zaslať komentár!" #: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "Upraviť" #: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" +msgstr "Odstrániť" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -552,15 +559,15 @@ msgstr "Staršie" #: mediagoblin/templates/mediagoblin/utils/pagination.html:50 msgid "Go to page:" -msgstr "" +msgstr "Ísť na stránku:" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" -msgstr "" +msgstr "Označené s" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "a" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -572,19 +579,19 @@ msgstr "Jednoznačne to chcem odstrániť" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Ajaj, tvoj komentár bol prázdny." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "Tvoj komentár bol zaslaný!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Výtvor bol odstránený tebou." #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." -msgstr "" +msgstr "Výtvor nebol odstránený, nakoľko chýbala tvoja konfirmácia." #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." -- cgit v1.2.3 From e91a4dcb738f28fe75d0387175e97dc16ea977fb Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Mon, 12 Dec 2011 10:48:24 -0500 Subject: Tweak rest formatting --- docs/source/media-types.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/media-types.rst b/docs/source/media-types.rst index 809efe07..76478143 100644 --- a/docs/source/media-types.rst +++ b/docs/source/media-types.rst @@ -15,13 +15,13 @@ Video To enable video, first install gstreamer and the python-gstreamer bindings (as well as whatever gstremaer extensions you want, -good/bad/ugly). On Debianoid systems: +good/bad/ugly). On Debianoid systems:: sudo apt-get install python-gst0.10 -Next, modify (and possibly copy over from mediagoblin.ini) your -mediagoblin_local.ini. Uncomment this line in the [mediagoblin] -section: +Next, modify (and possibly copy over from ``mediagoblin.ini``) your +``mediagoblin_local.ini``. Uncomment this line in the ``[mediagoblin]`` +section:: media_types = mediagoblin.media_types.image, mediagoblin.media_types.video -- cgit v1.2.3 From a46f645e7fc724547979ced22c8f9b7aa4ae0d51 Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Mon, 12 Dec 2011 11:12:59 -0500 Subject: Fix doc footer This has the correct copyright statement. --- docs/source/_templates/mg_theme/layout.html | 39 --- .../_templates/mg_theme/static/default.css_t | 299 --------------------- docs/source/_templates/mg_theme/theme.conf | 31 --- docs/source/conf.py | 7 +- docs/source/themes/mg/layout.html | 29 ++ docs/source/themes/mg/theme.conf | 5 + 6 files changed, 38 insertions(+), 372 deletions(-) delete mode 100644 docs/source/_templates/mg_theme/layout.html delete mode 100644 docs/source/_templates/mg_theme/static/default.css_t delete mode 100644 docs/source/_templates/mg_theme/theme.conf create mode 100644 docs/source/themes/mg/layout.html create mode 100644 docs/source/themes/mg/theme.conf diff --git a/docs/source/_templates/mg_theme/layout.html b/docs/source/_templates/mg_theme/layout.html deleted file mode 100644 index eccda14b..00000000 --- a/docs/source/_templates/mg_theme/layout.html +++ /dev/null @@ -1,39 +0,0 @@ -{# - default/layout.html - ~~~~~~~~~~~~~~~~~~~ - - Sphinx layout template for the default theme. - - :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -#} -{% extends "basic/layout.html" %} - -{% if theme_collapsiblesidebar|tobool %} -{% set script_files = script_files + ['_static/sidebar.js'] %} -{% endif %} - -{%- block footer %} - - - -{%- endblock %} diff --git a/docs/source/_templates/mg_theme/static/default.css_t b/docs/source/_templates/mg_theme/static/default.css_t deleted file mode 100644 index f200a0fe..00000000 --- a/docs/source/_templates/mg_theme/static/default.css_t +++ /dev/null @@ -1,299 +0,0 @@ -/* - * default.css_t - * ~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- default theme. - * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: {{ theme_bodyfont }}; - font-size: 100%; - background-color: {{ theme_footerbgcolor }}; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - background-color: {{ theme_sidebarbgcolor }}; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 230px; -} - -div.body { - background-color: {{ theme_bgcolor }}; - color: {{ theme_textcolor }}; - padding: 0 20px 30px 20px; -} - -{%- if theme_rightsidebar|tobool %} -div.bodywrapper { - margin: 0 230px 0 0; -} -{%- endif %} - -div.footer { - color: {{ theme_footertextcolor }}; - width: 100%; - padding: 9px 0 9px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: {{ theme_footertextcolor }}; - text-decoration: underline; -} - -div.related { - background-color: {{ theme_relbarbgcolor }}; - line-height: 30px; - color: {{ theme_relbartextcolor }}; -} - -div.related a { - color: {{ theme_relbarlinkcolor }}; -} - -div.sphinxsidebar { - {%- if theme_stickysidebar|tobool %} - top: 30px; - bottom: 0; - margin: 0; - position: fixed; - overflow: auto; - height: auto; - {%- endif %} - {%- if theme_rightsidebar|tobool %} - float: right; - {%- if theme_stickysidebar|tobool %} - right: 0; - {%- endif %} - {%- endif %} -} - -{%- if theme_stickysidebar|tobool %} -/* this is nice, but it it leads to hidden headings when jumping - to an anchor */ -/* -div.related { - position: fixed; -} - -div.documentwrapper { - margin-top: 30px; -} -*/ -{%- endif %} - -div.sphinxsidebar h3 { - font-family: {{ theme_headfont }}; - color: {{ theme_sidebartextcolor }}; - font-size: 1.4em; - font-weight: normal; - margin: 0; - padding: 0; -} - -div.sphinxsidebar h3 a { - color: {{ theme_sidebartextcolor }}; -} - -div.sphinxsidebar h4 { - font-family: {{ theme_headfont }}; - color: {{ theme_sidebartextcolor }}; - font-size: 1.3em; - font-weight: normal; - margin: 5px 0 0 0; - padding: 0; -} - -div.sphinxsidebar p { - color: {{ theme_sidebartextcolor }}; -} - -div.sphinxsidebar p.topless { - margin: 5px 10px 10px 10px; -} - -div.sphinxsidebar ul { - margin: 10px; - padding: 0; - color: {{ theme_sidebartextcolor }}; -} - -div.sphinxsidebar a { - color: {{ theme_sidebarlinkcolor }}; -} - -div.sphinxsidebar input { - border: 1px solid {{ theme_sidebarlinkcolor }}; - font-family: sans-serif; - font-size: 1em; -} - - -/* -- hyperlink styles ------------------------------------------------------ */ - -a { - color: {{ theme_linkcolor }}; - text-decoration: none; -} - -a:visited { - color: {{ theme_visitedlinkcolor }}; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -{% if theme_externalrefs|tobool %} -a.external { - text-decoration: none; - border-bottom: 1px dashed {{ theme_linkcolor }}; -} - -a.external:hover { - text-decoration: none; - border-bottom: none; -} -{% endif %} - -/* -- body styles ----------------------------------------------------------- */ - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: {{ theme_headfont }}; - background-color: {{ theme_headbgcolor }}; - font-weight: normal; - color: {{ theme_headtextcolor }}; - border-bottom: 1px solid #ccc; - margin: 20px -20px 10px -20px; - padding: 3px 0 3px 10px; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 160%; } -div.body h3 { font-size: 140%; } -div.body h4 { font-size: 120%; } -div.body h5 { font-size: 110%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: {{ theme_headlinkcolor }}; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: {{ theme_headlinkcolor }}; - color: white; -} - -div.body p, div.body dd, div.body li { - text-align: justify; - line-height: 130%; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.admonition p { - margin-bottom: 5px; -} - -div.admonition pre { - margin-bottom: 5px; -} - -div.admonition ul, div.admonition ol { - margin-bottom: 5px; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre { - padding: 5px; - background-color: {{ theme_codebgcolor }}; - color: {{ theme_codetextcolor }}; - line-height: 120%; - border: 1px solid #ac9; - border-left: none; - border-right: none; -} - -tt { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; -} - -th { - background-color: #ede; -} - -.warning tt { - background: #efc2c2; -} - -.note tt { - background: #d6d6d6; -} - -.viewcode-back { - font-family: {{ theme_bodyfont }}; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} diff --git a/docs/source/_templates/mg_theme/theme.conf b/docs/source/_templates/mg_theme/theme.conf deleted file mode 100644 index 49442e3b..00000000 --- a/docs/source/_templates/mg_theme/theme.conf +++ /dev/null @@ -1,31 +0,0 @@ -[theme] -inherit = basic -stylesheet = default.css -pygments_style = sphinx - -[options] -rightsidebar = false -stickysidebar = false -collapsiblesidebar = false -externalrefs = false - -footerbgcolor = #b11818 -footertextcolor = #ffffff -sidebarbgcolor = #6a0000 -sidebartextcolor = #ffffff -sidebarlinkcolor = #98dbcc -relbarbgcolor = #b11818 -relbartextcolor = #ffffff -relbarlinkcolor = #ffffff -bgcolor = #ffffff -textcolor = #000000 -headbgcolor = #fdeded -headtextcolor = #20435c -headlinkcolor = #c60f0f -linkcolor = #355f7c -visitedlinkcolor = #355f7c -codebgcolor = #eeffcc -codetextcolor = #333333 - -bodyfont = sans-serif -headfont = 'Trebuchet MS', sans-serif diff --git a/docs/source/conf.py b/docs/source/conf.py index eee9900f..f4d194e6 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -28,7 +28,7 @@ sys.path.insert(0, os.path.abspath('.')) extensions = ["mgext.youcanhelp"] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ['source/_templates'] # The suffix of source filenames. source_suffix = '.rst' @@ -91,7 +91,8 @@ pygments_style = 'sphinx' # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +# html_theme = 'default' +html_theme = 'mg' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -99,7 +100,7 @@ html_theme = 'default' #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +html_theme_path = ['themes'] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". diff --git a/docs/source/themes/mg/layout.html b/docs/source/themes/mg/layout.html new file mode 100644 index 00000000..891ed64c --- /dev/null +++ b/docs/source/themes/mg/layout.html @@ -0,0 +1,29 @@ +{# + default/layout.html + ~~~~~~~~~~~~~~~~~~~ + + Sphinx layout template for the default theme. + + :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +#} +{% extends "basic/layout.html" %} + +{% if theme_collapsiblesidebar|tobool %} +{% set script_files = script_files + ['_static/sidebar.js'] %} +{% endif %} + +{%- block footer %} + +{%- endblock %} diff --git a/docs/source/themes/mg/theme.conf b/docs/source/themes/mg/theme.conf new file mode 100644 index 00000000..f4fbd8cc --- /dev/null +++ b/docs/source/themes/mg/theme.conf @@ -0,0 +1,5 @@ +[theme] +inherit = default +stylesheet = default.css +pygments_style = sphinx + -- cgit v1.2.3 From 449f58e446ff50f9c84a99a123bd0225a4907f52 Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Mon, 12 Dec 2011 11:41:29 -0500 Subject: Update version numbers --- docs/source/conf.py | 4 ++-- mediagoblin/_version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index f4d194e6..829679b1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -48,9 +48,9 @@ copyright = u'2011, Free Software Foundation, Inc and contributors' # built documents. # # The short X.Y version. -version = '0.1.0' +version = '0.2.0' # The full version, including alpha/beta/rc tags. -release = '0.1.0' +release = '0.2.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/mediagoblin/_version.py b/mediagoblin/_version.py index d6c6e20d..7a41cf7c 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 . -__version__ = "0.1.0" +__version__ = "0.2.0" -- cgit v1.2.3 From 6ae878e730e006ab674f12c581af8447a0994a9f Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Mon, 12 Dec 2011 11:52:24 -0500 Subject: Changer version to -dev --- docs/source/conf.py | 4 ++-- mediagoblin/_version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 829679b1..dce254a1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -48,9 +48,9 @@ copyright = u'2011, Free Software Foundation, Inc and contributors' # built documents. # # The short X.Y version. -version = '0.2.0' +version = '0.3.0' # The full version, including alpha/beta/rc tags. -release = '0.2.0' +release = '0.3.0-dev' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/mediagoblin/_version.py b/mediagoblin/_version.py index 7a41cf7c..5e3f4e5a 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 . -__version__ = "0.2.0" +__version__ = "0.3.0-dev" -- cgit v1.2.3 From bb298cde80ce60290607012cc742ebb7b53af716 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Wed, 14 Dec 2011 16:18:26 +0100 Subject: Change wording for change_fp; improved the button text --- mediagoblin/templates/mediagoblin/auth/change_fp.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html index 5677949c..03a6583b 100644 --- a/mediagoblin/templates/mediagoblin/auth/change_fp.html +++ b/mediagoblin/templates/mediagoblin/auth/change_fp.html @@ -26,11 +26,11 @@ {{ csrf_token }}
    -

    {% trans %}Enter your new password{% endtrans %}

    +

    {% trans %}Set your new password{% endtrans %}

    {{ wtforms_util.render_divs(cp_form) }}
    - +
    -- cgit v1.2.3 From cd4b519a78961e2ec33e696e9ee730d916c1e073 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Wed, 14 Dec 2011 16:36:29 +0100 Subject: Remove "X license" placeholder from media page --- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 5760a68c..2c8c5033 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -67,7 +67,7 @@ {% endautoescape %}

    {% trans date=media.created.strftime("%Y-%m-%d") -%} - Added on {{ date }}. Licensed under an X license. + Added on {{ date }}. {%- endtrans %} {% if media['uploader'] == request.user._id or request.user['is_admin'] %} -- cgit v1.2.3 From 31f5c4567fbe8ec04cf649f00d50611aca67036d Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Wed, 14 Dec 2011 16:42:40 +0100 Subject: Change "Submit" to "Add" for ticket #466 --- mediagoblin/templates/mediagoblin/base.html | 2 +- mediagoblin/templates/mediagoblin/submit/start.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index b8061f24..41efbc0d 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -52,7 +52,7 @@ {% if request.user and request.user.status == 'active' %} - {% trans %}Submit media{% endtrans %} + {% trans %}Add media{% endtrans %} {% endif %} {% block mediagoblin_header_title %}{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html index 1a0dd4b7..47914550 100644 --- a/mediagoblin/templates/mediagoblin/submit/start.html +++ b/mediagoblin/templates/mediagoblin/submit/start.html @@ -23,11 +23,11 @@

    -

    {% trans %}Submit yer media{% endtrans %}

    +

    {% trans %}Add your media{% endtrans %}

    {{ wtforms_util.render_divs(submit_form) }}
    {{ csrf_token }} - +
    -- cgit v1.2.3 From 9c1c6c2a61ad23d5b68eb3794e81c5bee7c7cd46 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Thu, 15 Dec 2011 00:46:10 +0100 Subject: Added *very preliminary* support for webfinger --- mediagoblin/routing.py | 4 ++ .../templates/mediagoblin/webfinger/host-meta.xml | 27 +++++++++++++ .../templates/mediagoblin/webfinger/xrd.xml | 26 ++++++++++++ mediagoblin/webfinger/__init__.py | 15 +++++++ mediagoblin/webfinger/routing.py | 25 ++++++++++++ mediagoblin/webfinger/views.py | 46 ++++++++++++++++++++++ 6 files changed, 143 insertions(+) create mode 100644 mediagoblin/templates/mediagoblin/webfinger/host-meta.xml create mode 100644 mediagoblin/templates/mediagoblin/webfinger/xrd.xml create mode 100644 mediagoblin/webfinger/__init__.py create mode 100644 mediagoblin/webfinger/routing.py create mode 100644 mediagoblin/webfinger/views.py diff --git a/mediagoblin/routing.py b/mediagoblin/routing.py index ae56f8cb..bd727db5 100644 --- a/mediagoblin/routing.py +++ b/mediagoblin/routing.py @@ -21,6 +21,8 @@ from mediagoblin.submit.routing import submit_routes from mediagoblin.user_pages.routing import user_routes from mediagoblin.edit.routing import edit_routes from mediagoblin.listings.routing import tag_routes +from mediagoblin.webfinger.routing import webfinger_well_known_routes, \ + webfinger_routes def get_mapper(): @@ -36,5 +38,7 @@ def get_mapper(): mapping.extend(user_routes, '/u') mapping.extend(edit_routes, '/edit') mapping.extend(tag_routes, '/tag') + mapping.extend(webfinger_well_known_routes, '/.well-known') + mapping.extend(webfinger_routes, '/api/webfinger') return mapping diff --git a/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml new file mode 100644 index 00000000..dff2c9aa --- /dev/null +++ b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml @@ -0,0 +1,27 @@ +{# 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 . +-#} + + + + {{ request.host }} + + + {{ llrd_title }} + + diff --git a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml new file mode 100644 index 00000000..2ef9b814 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml @@ -0,0 +1,26 @@ +{# 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 . +-#} + + + + {{ uri }} + http://{{ request.host }}/u/{{ username }} + + + diff --git a/mediagoblin/webfinger/__init__.py b/mediagoblin/webfinger/__init__.py new file mode 100644 index 00000000..ba347c69 --- /dev/null +++ b/mediagoblin/webfinger/__init__.py @@ -0,0 +1,15 @@ +# 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 . diff --git a/mediagoblin/webfinger/routing.py b/mediagoblin/webfinger/routing.py new file mode 100644 index 00000000..effb2bf2 --- /dev/null +++ b/mediagoblin/webfinger/routing.py @@ -0,0 +1,25 @@ +# 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 . + +from routes.route import Route + +webfinger_well_known_routes = [ + Route('mediagoblin.webfinger.host_meta', '/host-meta', + controller='mediagoblin.webfinger.views:host_meta')] + +webfinger_routes = [ + Route('mediagoblin.webfinger.xrd', '/xrd', + controller='mediagoblin.webfinger.views:xrd')] diff --git a/mediagoblin/webfinger/views.py b/mediagoblin/webfinger/views.py new file mode 100644 index 00000000..f6294da9 --- /dev/null +++ b/mediagoblin/webfinger/views.py @@ -0,0 +1,46 @@ +# 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 . + +import re +import mediagoblin.mg_globals as mg_globals + +from mediagoblin.tools.response import render_to_response + +LRDD_TEMPLATE = '{protocol}://{host}/api/webfinger/xrd?uri={{uri}}' + +def host_meta(request): + ''' + Webfinger host-meta + ''' + return render_to_response( + request, + 'mediagoblin/webfinger/host-meta.xml', + {'request': request, + 'lrdd_template': LRDD_TEMPLATE.format( + protocol='http', + host=request.host)}) + +def xrd(request): + ''' + Find user data based on a webfinger URI + ''' + return render_to_response( + request, + 'mediagoblin/webfinger/xrd.xml', + {'request': request, + 'username': re.search( + r'^acct:([^@]*)', + request.GET.get('uri')).group(1)}) -- cgit v1.2.3 From 830a78cdfbb8fc1ee8af770a299f59f26e918aa0 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Thu, 15 Dec 2011 00:58:14 +0100 Subject: Changed some thngs to be compatible with webfinger.org, still *very preliminary* --- mediagoblin/templates/mediagoblin/webfinger/xrd.xml | 3 +++ mediagoblin/webfinger/views.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml index 2ef9b814..796de89f 100644 --- a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml +++ b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml @@ -20,6 +20,9 @@ {{ uri }} http://{{ request.host }}/u/{{ username }} + + diff --git a/mediagoblin/webfinger/views.py b/mediagoblin/webfinger/views.py index f6294da9..7cbd0913 100644 --- a/mediagoblin/webfinger/views.py +++ b/mediagoblin/webfinger/views.py @@ -42,5 +42,5 @@ def xrd(request): 'mediagoblin/webfinger/xrd.xml', {'request': request, 'username': re.search( - r'^acct:([^@]*)', - request.GET.get('uri')).group(1)}) + r'^(acct:)?([^@]*)', + request.GET.get('uri')).group(2)}) -- cgit v1.2.3 From 8d45c4463bf7bf9dfebe919bb12d588d45d7e30c Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Thu, 15 Dec 2011 09:27:56 -0500 Subject: Fix -dev version and add version number docs Version numbers should adhere to PEP-386. --- mediagoblin/_version.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mediagoblin/_version.py b/mediagoblin/_version.py index 5e3f4e5a..5e69f21a 100644 --- a/mediagoblin/_version.py +++ b/mediagoblin/_version.py @@ -14,4 +14,13 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -__version__ = "0.3.0-dev" +# valid version formats: +# * x.y - final release +# * x.ya1 - alpha 1 +# * x.yb1 - beta 1 +# * x.yrc1 - release candidate 1 +# * x.y.dev - dev + +# see http://www.python.org/dev/peps/pep-0386/ + +__version__ = "0.3.0.dev" -- cgit v1.2.3 From 9df07e87a8452e47eb594763bb700daf6fb69dbe Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Thu, 15 Dec 2011 19:35:53 +0100 Subject: webfinger fully compliant with webfinger.org! Still *preliminary* solution. --- mediagoblin/templates/mediagoblin/webfinger/xrd.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml index 796de89f..9a793637 100644 --- a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml +++ b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml @@ -17,7 +17,7 @@ - {{ uri }} + {{ request.GET.get('uri') }} http://{{ request.host }}/u/{{ username }} Date: Thu, 15 Dec 2011 21:15:21 +0100 Subject: Move sql models into db/sql/ So we can play with the sql models, let's put them in a proper place. --- mediagoblin/db/sql.py | 95 ------------------------------------------ mediagoblin/db/sql/__init__.py | 15 +++++++ mediagoblin/db/sql/models.py | 95 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 95 deletions(-) delete mode 100644 mediagoblin/db/sql.py create mode 100644 mediagoblin/db/sql/__init__.py create mode 100644 mediagoblin/db/sql/models.py diff --git a/mediagoblin/db/sql.py b/mediagoblin/db/sql.py deleted file mode 100644 index 31ebfbf4..00000000 --- a/mediagoblin/db/sql.py +++ /dev/null @@ -1,95 +0,0 @@ -import datetime - -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import ( - Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey, - UniqueConstraint) - - -Base = declarative_base() - - -class User(Base): - __tablename__ = "users" - - id = Column(Integer, primary_key=True) - username = Column(Unicode, nullable=False, unique=True) - email = Column(Unicode, nullable=False) - created = Column(DateTime, nullable=False, default=datetime.datetime.now) - pw_hash = Column(Unicode, nullable=False) - email_verified = Column(Boolean) - status = Column(Unicode, default="needs_email_verification", nullable=False) - verification_key = Column(Unicode) - is_admin = Column(Boolean, default=False, nullable=False) - url = Column(Unicode) - bio = Column(UnicodeText) # ?? - bio_html = Column(UnicodeText) # ?? - fp_verification_key = Column(Unicode) - fp_verification_expire = Column(DateTime) - - ## TODO - # plugin data would be in a separate model - - -class MediaEntry(Base): - __tablename__ = "media_entries" - - id = Column(Integer, primary_key=True) - uploader = Column(Integer, ForeignKey('users.id'), nullable=False) - slug = Column(Unicode, nullable=False) - created = Column(DateTime, nullable=False, default=datetime.datetime.now) - description = Column(UnicodeText) # ?? - description_html = Column(UnicodeText) # ?? - media_type = Column(Unicode, nullable=False) - - fail_error = Column(Unicode) - fail_metadata = Column(UnicodeText) - - queued_media_file = Column(Unicode) - - queued_task_id = Column(Unicode) - - __table_args__ = ( - UniqueConstraint('uploader', 'slug'), - {}) - - ## TODO - # media_files - # media_data - # attachment_files - # fail_error - - -class Tag(Base): - __tablename__ = "tags" - - id = Column(Integer, primary_key=True) - slug = Column(Unicode, nullable=False, unique=True) - - -class MediaTag(Base): - __tablename__ = "media_tags" - - id = Column(Integer, primary_key=True) - tag = Column(Integer, ForeignKey('tags.id'), nullable=False) - name = Column(Unicode) - media_entry = Column( - Integer, ForeignKey('media_entries.id'), - nullable=False) - # created = Column(DateTime, nullable=False, default=datetime.datetime.now) - - __table_args__ = ( - UniqueConstraint('tag', 'media_entry'), - {}) - - -class MediaComment(Base): - __tablename__ = "media_comments" - - id = Column(Integer, primary_key=True) - media_entry = Column( - Integer, ForeignKey('media_entries.id'), nullable=False) - author = Column(Integer, ForeignKey('users.id'), nullable=False) - created = Column(DateTime, nullable=False, default=datetime.datetime.now) - content = Column(UnicodeText, nullable=False) - content_html = Column(UnicodeText) diff --git a/mediagoblin/db/sql/__init__.py b/mediagoblin/db/sql/__init__.py new file mode 100644 index 00000000..ba347c69 --- /dev/null +++ b/mediagoblin/db/sql/__init__.py @@ -0,0 +1,15 @@ +# 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 . diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py new file mode 100644 index 00000000..31ebfbf4 --- /dev/null +++ b/mediagoblin/db/sql/models.py @@ -0,0 +1,95 @@ +import datetime + +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import ( + Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey, + UniqueConstraint) + + +Base = declarative_base() + + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True) + username = Column(Unicode, nullable=False, unique=True) + email = Column(Unicode, nullable=False) + created = Column(DateTime, nullable=False, default=datetime.datetime.now) + pw_hash = Column(Unicode, nullable=False) + email_verified = Column(Boolean) + status = Column(Unicode, default="needs_email_verification", nullable=False) + verification_key = Column(Unicode) + is_admin = Column(Boolean, default=False, nullable=False) + url = Column(Unicode) + bio = Column(UnicodeText) # ?? + bio_html = Column(UnicodeText) # ?? + fp_verification_key = Column(Unicode) + fp_verification_expire = Column(DateTime) + + ## TODO + # plugin data would be in a separate model + + +class MediaEntry(Base): + __tablename__ = "media_entries" + + id = Column(Integer, primary_key=True) + uploader = Column(Integer, ForeignKey('users.id'), nullable=False) + slug = Column(Unicode, nullable=False) + created = Column(DateTime, nullable=False, default=datetime.datetime.now) + description = Column(UnicodeText) # ?? + description_html = Column(UnicodeText) # ?? + media_type = Column(Unicode, nullable=False) + + fail_error = Column(Unicode) + fail_metadata = Column(UnicodeText) + + queued_media_file = Column(Unicode) + + queued_task_id = Column(Unicode) + + __table_args__ = ( + UniqueConstraint('uploader', 'slug'), + {}) + + ## TODO + # media_files + # media_data + # attachment_files + # fail_error + + +class Tag(Base): + __tablename__ = "tags" + + id = Column(Integer, primary_key=True) + slug = Column(Unicode, nullable=False, unique=True) + + +class MediaTag(Base): + __tablename__ = "media_tags" + + id = Column(Integer, primary_key=True) + tag = Column(Integer, ForeignKey('tags.id'), nullable=False) + name = Column(Unicode) + media_entry = Column( + Integer, ForeignKey('media_entries.id'), + nullable=False) + # created = Column(DateTime, nullable=False, default=datetime.datetime.now) + + __table_args__ = ( + UniqueConstraint('tag', 'media_entry'), + {}) + + +class MediaComment(Base): + __tablename__ = "media_comments" + + id = Column(Integer, primary_key=True) + media_entry = Column( + Integer, ForeignKey('media_entries.id'), nullable=False) + author = Column(Integer, ForeignKey('users.id'), nullable=False) + created = Column(DateTime, nullable=False, default=datetime.datetime.now) + content = Column(UnicodeText, nullable=False) + content_html = Column(UnicodeText) -- cgit v1.2.3 From e365f980ac21a403a50f61ae687d7dc04760f8bb Mon Sep 17 00:00:00 2001 From: Elrond Date: Thu, 15 Dec 2011 22:11:49 +0100 Subject: SQL: Some toys and little fix Run bin/python mediagoblin/db/sql/models.py and watch the create tables on a memory sqlite db. Also unicode strings need unicode defauls. Warning by sqlalchemy. --- mediagoblin/db/sql/models.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py index 31ebfbf4..a38be1cc 100644 --- a/mediagoblin/db/sql/models.py +++ b/mediagoblin/db/sql/models.py @@ -18,7 +18,7 @@ class User(Base): created = Column(DateTime, nullable=False, default=datetime.datetime.now) pw_hash = Column(Unicode, nullable=False) email_verified = Column(Boolean) - status = Column(Unicode, default="needs_email_verification", nullable=False) + status = Column(Unicode, default=u"needs_email_verification", nullable=False) verification_key = Column(Unicode) is_admin = Column(Boolean, default=False, nullable=False) url = Column(Unicode) @@ -93,3 +93,14 @@ class MediaComment(Base): created = Column(DateTime, nullable=False, default=datetime.datetime.now) content = Column(UnicodeText, nullable=False) content_html = Column(UnicodeText) + + +def show_table_init(): + from sqlalchemy import create_engine + engine = create_engine('sqlite:///:memory:', echo=True) + + Base.metadata.create_all(engine) + + +if __name__ == '__main__': + show_table_init() -- cgit v1.2.3 From 8eb216388f0999115d68c33e2fe2460bc9986112 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Thu, 15 Dec 2011 23:49:52 +0100 Subject: Fixed import_export - Mongokit instead of pymongo - db.MediaEntry instead of db.media_entry (pymongo style) --- mediagoblin/gmg_commands/import_export.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index 1308f09e..eda41f4c 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -64,7 +64,7 @@ def _import_media(db, args): queue_cache = BasicFileStorage( args._cache_path['queue']) - for entry in db.media_entries.find(): + for entry in db.MediaEntry.find(): for name, path in entry['media_files'].items(): _log.info('Importing: {0} - {1}'.format( entry.title, @@ -107,7 +107,7 @@ def env_import(args): global_config, app_config = setup_global_and_app_config(args.conf_file) connection, db = setup_connection_and_db_from_config( - app_config, use_pymongo=True) + app_config) tf = tarfile.open( args.tar_file, @@ -206,7 +206,7 @@ def _export_media(db, args): queue_cache = BasicFileStorage( args._cache_path['queue']) - for entry in db.media_entries.find(): + for entry in db.MediaEntry.find(): for name, path in entry['media_files'].items(): _log.info(u'Exporting {0} - {1}'.format( entry.title, @@ -215,7 +215,7 @@ def _export_media(db, args): mc_file = media_cache.get_file(path, mode='wb') mc_file.write( mg_globals.public_store.get_file(path, mode='rb').read()) - except e: + except Exception as e: _log.error('Failed: {0}'.format(e)) _log.info('...Media exported') @@ -246,7 +246,7 @@ def env_export(args): setup_storage() connection, db = setup_connection_and_db_from_config( - app_config, use_pymongo=True) + app_config) _export_database(db, args) -- cgit v1.2.3 From 7c2c56a5ff0cb229cd3a64451368bf1e72646bc5 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 17 Dec 2011 17:34:55 +0100 Subject: Little sql model update - Add title to the MediaEntry - Rename fp_verification_expire to fp_token_expire to follow the mongo model. --- mediagoblin/db/sql/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py index a38be1cc..7723a753 100644 --- a/mediagoblin/db/sql/models.py +++ b/mediagoblin/db/sql/models.py @@ -25,7 +25,7 @@ class User(Base): bio = Column(UnicodeText) # ?? bio_html = Column(UnicodeText) # ?? fp_verification_key = Column(Unicode) - fp_verification_expire = Column(DateTime) + fp_token_expire = Column(DateTime) ## TODO # plugin data would be in a separate model @@ -36,6 +36,7 @@ class MediaEntry(Base): id = Column(Integer, primary_key=True) uploader = Column(Integer, ForeignKey('users.id'), nullable=False) + title = Column(Unicode, nullable=False) slug = Column(Unicode, nullable=False) created = Column(DateTime, nullable=False, default=datetime.datetime.now) description = Column(UnicodeText) # ?? -- cgit v1.2.3 From dbcf5289dcc7bcd03a1a92a204fd7c4c8348d318 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 17 Dec 2011 21:37:02 +0100 Subject: Simple Mongo -> SQL migration tool This is just a start at a Migration tool from Mongo to SQL. It fills all currently available SQL models with data from MongoDB. A few fields in the SQL tables are left out, because some data format migrations are needed (notably: queue_file_name). This thing lives in mediagoblin/db/sql/convert.py because it has a lot of stuff hardcoded and is not, repeat not for end users! Hard coded: - output database: ./mediagoblin.db (sqlite) - Mediagoblin config: ./mediagoblin.ini --- mediagoblin/db/sql/convert.py | 143 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 mediagoblin/db/sql/convert.py diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py new file mode 100644 index 00000000..2ffa9fd7 --- /dev/null +++ b/mediagoblin/db/sql/convert.py @@ -0,0 +1,143 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from mediagoblin.init import setup_global_and_app_config, setup_database +from mediagoblin.db.util import ObjectId + +from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment, + Tag, MediaTag) + +Session = sessionmaker() + + +obj_id_table = dict() + +def add_obj_ids(entry, new_entry): + global obj_id_table + print "%r -> %r" % (entry._id, new_entry.id) + obj_id_table[entry._id] = new_entry.id + + +def copy_attrs(entry, new_entry, attr_list): + for a in attr_list: + val = entry[a] + setattr(new_entry, a, val) + +def copy_reference_attr(entry, new_entry, ref_attr): + val = entry[ref_attr] + val = obj_id_table[val] + setattr(new_entry, ref_attr, val) + + +def convert_users(mk_db): + session = Session() + + for entry in mk_db.User.find(): + print entry.username + + new_entry = User() + copy_attrs(entry, new_entry, + ('username', 'email', 'created', 'pw_hash', 'email_verified', + 'status', 'verification_key', 'is_admin', 'url', + 'bio', 'bio_html', + 'fp_verification_key', 'fp_token_expire',)) + # new_entry.fp_verification_expire = entry.fp_token_expire + + session.add(new_entry) + session.flush() + add_obj_ids(entry, new_entry) + + session.commit() + session.close() + + +def convert_media_entries(mk_db): + session = Session() + + for entry in mk_db.MediaEntry.find(): + print repr(entry.title) + + new_entry = MediaEntry() + copy_attrs(entry, new_entry, + ('title', 'slug', 'created', + 'description', 'description_html', + 'media_type', + 'fail_error', + 'queued_task_id',)) + copy_reference_attr(entry, new_entry, "uploader") + + session.add(new_entry) + session.flush() + add_obj_ids(entry, new_entry) + + session.commit() + session.close() + + +def convert_media_tags(mk_db): + session = Session() + session.autoflush = False + + for media in mk_db.MediaEntry.find(): + print repr(media.title) + + for otag in media.tags: + print " ", repr((otag["slug"], otag["name"])) + + nslug = session.query(Tag).filter_by(slug=otag["slug"]).first() + print " ", repr(nslug) + if nslug is None: + nslug = Tag(slug=otag["slug"]) + session.add(nslug) + session.flush() + print " ", repr(nslug), nslug.id + + ntag = MediaTag() + ntag.tag = nslug.id + ntag.name = otag["name"] + ntag.media_entry = obj_id_table[media._id] + session.add(ntag) + + session.commit() + session.close() + + +def convert_media_comments(mk_db): + session = Session() + + for entry in mk_db.MediaComment.find(): + print repr(entry.content) + + new_entry = MediaComment() + copy_attrs(entry, new_entry, + ('created', + 'content', 'content_html',)) + copy_reference_attr(entry, new_entry, "media_entry") + copy_reference_attr(entry, new_entry, "author") + + session.add(new_entry) + session.flush() + add_obj_ids(entry, new_entry) + + session.commit() + session.close() + + +def main(): + engine = create_engine('sqlite:///mediagoblin.db', echo=True) + Session.configure(bind=engine) + + setup_global_and_app_config("mediagoblin.ini") + + mk_conn, mk_db = setup_database() + + Base.metadata.create_all(engine) + + convert_users(mk_db) + convert_media_entries(mk_db) + convert_media_tags(mk_db) + convert_media_comments(mk_db) + + +if __name__ == '__main__': + main() -- cgit v1.2.3 From 18517e888a90bf1c0434dd4da99ef7980d333ed0 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 18 Dec 2011 00:31:39 +0100 Subject: Show actual comment number. Only shows plural for now (ticket #712) --- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 2c8c5033..b9e31667 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -81,7 +81,7 @@ {% trans %}Delete{% endtrans %} {% endif %}

    -

    {% trans %}23 comments{% endtrans %} +

    {% trans comment_count=comments.count() -%}{{ comment_count }} comments{%- endtrans %}
    Date: Sun, 18 Dec 2011 01:04:41 +0100 Subject: First test lines for responsive design --- mediagoblin/static/css/base.css | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 2a78006d..805f0e29 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -389,3 +389,20 @@ table.media_panel th { margin-top: 10px; margin-left: 10px; } + +@media screen and (max-width: 480px) { + .navigation_button { + position: fixed; + bottom: 0px; + right: 0px; + width: 50%; + margin: 0; + } + .navigation_left { + left: 0px; + width: 50%; + } + .media_image { + width: 480px; + } +} -- cgit v1.2.3 From 436b13bb3e2253dc4361333d1260550d343ccfe2 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 18 Dec 2011 01:31:06 +0100 Subject: Remove 960.gs stylesheets, add Eric Meyer's reset.css --- extlib/960.gs/960_16_col.css | 447 --------------------------- extlib/960.gs/MIT.txt | 20 -- extlib/960.gs/README.txt | 54 ---- extlib/960.gs/reset.css | 202 ------------ extlib/960.gs/text.css | 86 ------ mediagoblin/static/css/extlib/960_16_col.css | 1 - mediagoblin/static/css/extlib/reset.css | 1 - mediagoblin/static/css/extlib/text.css | 1 - mediagoblin/static/css/reset.css | 49 +++ mediagoblin/templates/mediagoblin/base.html | 6 +- 10 files changed, 50 insertions(+), 817 deletions(-) delete mode 100644 extlib/960.gs/960_16_col.css delete mode 100644 extlib/960.gs/MIT.txt delete mode 100755 extlib/960.gs/README.txt delete mode 100644 extlib/960.gs/reset.css delete mode 100644 extlib/960.gs/text.css delete mode 120000 mediagoblin/static/css/extlib/960_16_col.css delete mode 120000 mediagoblin/static/css/extlib/reset.css delete mode 120000 mediagoblin/static/css/extlib/text.css create mode 100644 mediagoblin/static/css/reset.css diff --git a/extlib/960.gs/960_16_col.css b/extlib/960.gs/960_16_col.css deleted file mode 100644 index faa6d8b2..00000000 --- a/extlib/960.gs/960_16_col.css +++ /dev/null @@ -1,447 +0,0 @@ -/* - 960 Grid System ~ Core CSS. - Learn more ~ http://960.gs/ - - Licensed under GPL and MIT. -*/ - -/* - Forces backgrounds to span full width, - even if there is horizontal scrolling. - Increase this if your layout is wider. - - Note: IE6 works fine without this fix. -*/ - -body { - min-width: 960px; -} - -/* Container -----------------------------------------------------------------------------------------------------*/ - -.container_16 { - margin-left: auto; - margin-right: auto; - width: 960px; -} - -/* Grid >> Global -----------------------------------------------------------------------------------------------------*/ - -.grid_1, -.grid_2, -.grid_3, -.grid_4, -.grid_5, -.grid_6, -.grid_7, -.grid_8, -.grid_9, -.grid_10, -.grid_11, -.grid_12, -.grid_13, -.grid_14, -.grid_15, -.grid_16 { - display: inline; - float: left; - position: relative; - margin-left: 10px; - margin-right: 10px; -} - -.push_1, .pull_1, -.push_2, .pull_2, -.push_3, .pull_3, -.push_4, .pull_4, -.push_5, .pull_5, -.push_6, .pull_6, -.push_7, .pull_7, -.push_8, .pull_8, -.push_9, .pull_9, -.push_10, .pull_10, -.push_11, .pull_11, -.push_12, .pull_12, -.push_13, .pull_13, -.push_14, .pull_14, -.push_15, .pull_15, -.push_16, .pull_16 { - position: relative; -} - -/* Grid >> Children (Alpha ~ First, Omega ~ Last) -----------------------------------------------------------------------------------------------------*/ - -.alpha { - margin-left: 0; -} - -.omega { - margin-right: 0; -} - -/* Grid >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .grid_1 { - width: 40px; -} - -.container_16 .grid_2 { - width: 100px; -} - -.container_16 .grid_3 { - width: 160px; -} - -.container_16 .grid_4 { - width: 220px; -} - -.container_16 .grid_5 { - width: 280px; -} - -.container_16 .grid_6 { - width: 340px; -} - -.container_16 .grid_7 { - width: 400px; -} - -.container_16 .grid_8 { - width: 460px; -} - -.container_16 .grid_9 { - width: 520px; -} - -.container_16 .grid_10 { - width: 580px; -} - -.container_16 .grid_11 { - width: 640px; -} - -.container_16 .grid_12 { - width: 700px; -} - -.container_16 .grid_13 { - width: 760px; -} - -.container_16 .grid_14 { - width: 820px; -} - -.container_16 .grid_15 { - width: 880px; -} - -.container_16 .grid_16 { - width: 940px; -} - -/* Prefix Extra Space >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .prefix_1 { - padding-left: 60px; -} - -.container_16 .prefix_2 { - padding-left: 120px; -} - -.container_16 .prefix_3 { - padding-left: 180px; -} - -.container_16 .prefix_4 { - padding-left: 240px; -} - -.container_16 .prefix_5 { - padding-left: 300px; -} - -.container_16 .prefix_6 { - padding-left: 360px; -} - -.container_16 .prefix_7 { - padding-left: 420px; -} - -.container_16 .prefix_8 { - padding-left: 480px; -} - -.container_16 .prefix_9 { - padding-left: 540px; -} - -.container_16 .prefix_10 { - padding-left: 600px; -} - -.container_16 .prefix_11 { - padding-left: 660px; -} - -.container_16 .prefix_12 { - padding-left: 720px; -} - -.container_16 .prefix_13 { - padding-left: 780px; -} - -.container_16 .prefix_14 { - padding-left: 840px; -} - -.container_16 .prefix_15 { - padding-left: 900px; -} - -/* Suffix Extra Space >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .suffix_1 { - padding-right: 60px; -} - -.container_16 .suffix_2 { - padding-right: 120px; -} - -.container_16 .suffix_3 { - padding-right: 180px; -} - -.container_16 .suffix_4 { - padding-right: 240px; -} - -.container_16 .suffix_5 { - padding-right: 300px; -} - -.container_16 .suffix_6 { - padding-right: 360px; -} - -.container_16 .suffix_7 { - padding-right: 420px; -} - -.container_16 .suffix_8 { - padding-right: 480px; -} - -.container_16 .suffix_9 { - padding-right: 540px; -} - -.container_16 .suffix_10 { - padding-right: 600px; -} - -.container_16 .suffix_11 { - padding-right: 660px; -} - -.container_16 .suffix_12 { - padding-right: 720px; -} - -.container_16 .suffix_13 { - padding-right: 780px; -} - -.container_16 .suffix_14 { - padding-right: 840px; -} - -.container_16 .suffix_15 { - padding-right: 900px; -} - -/* Push Space >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .push_1 { - left: 60px; -} - -.container_16 .push_2 { - left: 120px; -} - -.container_16 .push_3 { - left: 180px; -} - -.container_16 .push_4 { - left: 240px; -} - -.container_16 .push_5 { - left: 300px; -} - -.container_16 .push_6 { - left: 360px; -} - -.container_16 .push_7 { - left: 420px; -} - -.container_16 .push_8 { - left: 480px; -} - -.container_16 .push_9 { - left: 540px; -} - -.container_16 .push_10 { - left: 600px; -} - -.container_16 .push_11 { - left: 660px; -} - -.container_16 .push_12 { - left: 720px; -} - -.container_16 .push_13 { - left: 780px; -} - -.container_16 .push_14 { - left: 840px; -} - -.container_16 .push_15 { - left: 900px; -} - -/* Pull Space >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .pull_1 { - left: -60px; -} - -.container_16 .pull_2 { - left: -120px; -} - -.container_16 .pull_3 { - left: -180px; -} - -.container_16 .pull_4 { - left: -240px; -} - -.container_16 .pull_5 { - left: -300px; -} - -.container_16 .pull_6 { - left: -360px; -} - -.container_16 .pull_7 { - left: -420px; -} - -.container_16 .pull_8 { - left: -480px; -} - -.container_16 .pull_9 { - left: -540px; -} - -.container_16 .pull_10 { - left: -600px; -} - -.container_16 .pull_11 { - left: -660px; -} - -.container_16 .pull_12 { - left: -720px; -} - -.container_16 .pull_13 { - left: -780px; -} - -.container_16 .pull_14 { - left: -840px; -} - -.container_16 .pull_15 { - left: -900px; -} - -/* `Clear Floated Elements -----------------------------------------------------------------------------------------------------*/ - -/* http://sonspring.com/journal/clearing-floats */ - -.clear { - clear: both; - display: block; - overflow: hidden; - visibility: hidden; - width: 0; - height: 0; -} - -/* http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-demystified */ - -.clearfix:before, -.clearfix:after, -.container_16:before, -.container_16:after { - content: '.'; - display: block; - overflow: hidden; - visibility: hidden; - font-size: 0; - line-height: 0; - width: 0; - height: 0; -} - -.clearfix:after, -.container_16:after { - clear: both; -} - -/* - The following zoom:1 rule is specifically for IE6 + IE7. - Move to separate stylesheet if invalid CSS is a problem. -*/ - -.clearfix, -.container_16 { - zoom: 1; -} \ No newline at end of file diff --git a/extlib/960.gs/MIT.txt b/extlib/960.gs/MIT.txt deleted file mode 100644 index 5a2aeb47..00000000 --- a/extlib/960.gs/MIT.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/extlib/960.gs/README.txt b/extlib/960.gs/README.txt deleted file mode 100755 index da0ea86f..00000000 --- a/extlib/960.gs/README.txt +++ /dev/null @@ -1,54 +0,0 @@ -=============== -960 GRID SYSTEM -=============== - -Created by Nathan Smith. See the official site for more info: http://960.gs/ - -============================================================================ - -To install the Adobe Fireworks extension, simply double-click the *.mxp file -included in the /fireworks_extension directory. If you are running Windows 7 -you will need admin permissions in order to install this extension properly. - -============================================================================ - -Thank you for downloading the 960 Grid System. I hope it helps to streamline -web development workflow. Enclosed in the bundle are printable sketch sheets -and template files for Adobe Fireworks and Photoshop, OmniGraffle and Visio. - -Also included is a lightweight CSS file, which contains the grid dimensions. -To use this file, simply include the 960.css in the of the HTML page. -You may also use the reset.css and text.css files, or opt to leave them out. -Here is an example of the XHTML code necessary to incorporate the CSS files: - - - - - - - -It is worth noting that these styles do not automatically make up a finished -site design. They are simply a starting point, ideally for rapid prototyping -or as a basis for creating your own designs. You should not feel constrained -by the way I have built the initial code. If you disagree with how something -has been done, feel free to revise it for the needs of your particular site. - -The files in the 960 Grid System are free of charge, licensed under MIT/GPL. - -============================================================================ - -Note that if you are building a site in a language which reads from right to -left, use the CSS files that end in "_rtl.css" instead. Denote the language: - - - -Be sure to replace "..." with the appropriate two-letter abbreviation of the -language you are using. Example: lang="he" for Hebrew, lang="ar" for Arabic. - -============================================================================ - -GPL license: -http://www.gnu.org/licenses/gpl.html - -MIT license: -http://www.opensource.org/licenses/mit-license.php \ No newline at end of file diff --git a/extlib/960.gs/reset.css b/extlib/960.gs/reset.css deleted file mode 100644 index 87b7f368..00000000 --- a/extlib/960.gs/reset.css +++ /dev/null @@ -1,202 +0,0 @@ -/* `XHTML, HTML4, HTML5 Reset -----------------------------------------------------------------------------------------------------*/ - -a, -abbr, -acronym, -address, -applet, -article, -aside, -audio, -b, -big, -blockquote, -body, -canvas, -caption, -center, -cite, -code, -dd, -del, -details, -dfn, -dialog, -div, -dl, -dt, -em, -embed, -fieldset, -figcaption, -figure, -font, -footer, -form, -h1, -h2, -h3, -h4, -h5, -h6, -header, -hgroup, -hr, -html, -i, -iframe, -img, -ins, -kbd, -label, -legend, -li, -mark, -menu, -meter, -nav, -object, -ol, -output, -p, -pre, -progress, -q, -rp, -rt, -ruby, -s, -samp, -section, -small, -span, -strike, -strong, -sub, -summary, -sup, -table, -tbody, -td, -tfoot, -th, -thead, -time, -tr, -tt, -u, -ul, -var, -video, -xmp { - border: 0; - margin: 0; - padding: 0; - font-size: 100%; -} - -html, -body { - height: 100%; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -menu, -nav, -section { -/* - Override the default (display: inline) for - browsers that do not recognize HTML5 tags. - - IE8 (and lower) requires a shiv: - http://ejohn.org/blog/html5-shiv -*/ - display: block; -} - -b, -strong { -/* - Makes browsers agree. - IE + Opera = font-weight: bold. - Gecko + WebKit = font-weight: bolder. -*/ - font-weight: bold; -} - -img { - color: transparent; - font-size: 0; - vertical-align: middle; -/* - For IE. - http://css-tricks.com/ie-fix-bicubic-scaling-for-images -*/ - -ms-interpolation-mode: bicubic; -} - -li { -/* - For IE6 + IE7. -*/ - display: list-item; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -th, -td, -caption { - font-weight: normal; - vertical-align: top; - text-align: left; -} - -q { - quotes: none; -} - -q:before, -q:after { - content: ''; - content: none; -} - -sub, -sup, -small { - font-size: 75%; -} - -sub, -sup { - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -svg { -/* - For IE9. -*/ - overflow: hidden; -} \ No newline at end of file diff --git a/extlib/960.gs/text.css b/extlib/960.gs/text.css deleted file mode 100644 index 1a6b302f..00000000 --- a/extlib/960.gs/text.css +++ /dev/null @@ -1,86 +0,0 @@ -/* - 960 Grid System ~ Text CSS. - Learn more ~ http://960.gs/ - - Licensed under GPL and MIT. -*/ - -/* `Basic HTML -----------------------------------------------------------------------------------------------------*/ - -body { - font: 13px/1.5 'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif; -} - -pre, -code { - font-family: 'DejaVu Sans Mono', Monaco, Consolas, monospace; -} - -hr { - border: 0 #ccc solid; - border-top-width: 1px; - clear: both; - height: 0; -} - -/* `Headings -----------------------------------------------------------------------------------------------------*/ - -h1 { - font-size: 25px; -} - -h2 { - font-size: 23px; -} - -h3 { - font-size: 21px; -} - -h4 { - font-size: 19px; -} - -h5 { - font-size: 17px; -} - -h6 { - font-size: 15px; -} - -/* `Spacing -----------------------------------------------------------------------------------------------------*/ - -ol { - list-style: decimal; -} - -ul { - list-style: disc; -} - -li { - margin-left: 30px; -} - -p, -dl, -hr, -h1, -h2, -h3, -h4, -h5, -h6, -ol, -ul, -pre, -table, -address, -fieldset, -figure { - margin-bottom: 20px; -} \ No newline at end of file diff --git a/mediagoblin/static/css/extlib/960_16_col.css b/mediagoblin/static/css/extlib/960_16_col.css deleted file mode 120000 index d4e43898..00000000 --- a/mediagoblin/static/css/extlib/960_16_col.css +++ /dev/null @@ -1 +0,0 @@ -../../../../extlib/960.gs/960_16_col.css \ No newline at end of file diff --git a/mediagoblin/static/css/extlib/reset.css b/mediagoblin/static/css/extlib/reset.css deleted file mode 120000 index 65d06d34..00000000 --- a/mediagoblin/static/css/extlib/reset.css +++ /dev/null @@ -1 +0,0 @@ -../../../../extlib/960.gs/reset.css \ No newline at end of file diff --git a/mediagoblin/static/css/extlib/text.css b/mediagoblin/static/css/extlib/text.css deleted file mode 120000 index 2d864de4..00000000 --- a/mediagoblin/static/css/extlib/text.css +++ /dev/null @@ -1 +0,0 @@ -../../../../extlib/960.gs/text.css \ No newline at end of file diff --git a/mediagoblin/static/css/reset.css b/mediagoblin/static/css/reset.css new file mode 100644 index 00000000..6ce25ce7 --- /dev/null +++ b/mediagoblin/static/css/reset.css @@ -0,0 +1,49 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 41efbc0d..6972fe2f 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -21,11 +21,7 @@ {% block title %}{{ app_config['html_title'] }}{% endblock %} - - + href="{{ request.staticdirect('/css/reset.css') }}"/> Date: Sun, 18 Dec 2011 01:32:13 +0100 Subject: Media query for everything(?) below 960px wide --- mediagoblin/static/css/base.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 805f0e29..effcec69 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -390,7 +390,7 @@ table.media_panel th { margin-left: 10px; } -@media screen and (max-width: 480px) { +@media handheld and (max-width: 480px), screen and (max-device-width: 480px), screen and (max-width: 960px) { .navigation_button { position: fixed; bottom: 0px; -- cgit v1.2.3 From 1bb8eb89c7566cb473c2a7c317420bceaf8e9111 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 18 Dec 2011 01:37:57 +0100 Subject: Remove first 960.gs classes --- mediagoblin/static/css/base.css | 27 ++++++++++++++++++++------- mediagoblin/templates/mediagoblin/base.html | 12 +++--------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index effcec69..d3136788 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -84,23 +84,43 @@ input, textarea { .mediagoblin_body { position: relative; min-height: 100%; + margin-left: auto; + margin-right: auto; + width: 960px; } .mediagoblin_header { + width: 940px; height: 36px; + margin-left: 10px; + margin-right: 10px; padding-top: 14px; margin-bottom: 20px; border-bottom: 1px solid #333; } +.mediagoblin_header_right { + float: right; +} + a.mediagoblin_logo{ color: #fff; font-weight: bold; margin-right: 8px; } +.mediagoblin_content { + width: 940px; + margin-left: 10px; + margin-right: 10px; + padding-bottom: 74px; +} + .mediagoblin_footer { + width: 940px; height: 30px; + margin-left: 10px; + margin-right: 10px; border-top: 1px solid #333; bottom: 0px; padding-top: 8px; @@ -108,13 +128,6 @@ a.mediagoblin_logo{ font-size: 0.875em; } -.mediagoblin_content { - padding-bottom: 74px; -} - -.mediagoblin_header_right { - float: right; -} /* common website elements */ diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 6972fe2f..870a4861 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -37,8 +37,7 @@ {% block mediagoblin_body %}
    {% block mediagoblin_header %} -
    -
    {% endblock %} {% endblock mediagoblin_body %}
    -- cgit v1.2.3 From 4fe9c9b99fc14f827d87ef803a9a67508591220f Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 18 Dec 2011 01:41:01 +0100 Subject: Move reset.css to extlib and symlink it --- extlib/reset/reset.css | 49 +++++++++++++++++++++++++++++++++ mediagoblin/static/css/extlib/reset.css | 1 + mediagoblin/static/css/reset.css | 49 --------------------------------- 3 files changed, 50 insertions(+), 49 deletions(-) create mode 100644 extlib/reset/reset.css create mode 120000 mediagoblin/static/css/extlib/reset.css delete mode 100644 mediagoblin/static/css/reset.css diff --git a/extlib/reset/reset.css b/extlib/reset/reset.css new file mode 100644 index 00000000..6ce25ce7 --- /dev/null +++ b/extlib/reset/reset.css @@ -0,0 +1,49 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + diff --git a/mediagoblin/static/css/extlib/reset.css b/mediagoblin/static/css/extlib/reset.css new file mode 120000 index 00000000..6084e137 --- /dev/null +++ b/mediagoblin/static/css/extlib/reset.css @@ -0,0 +1 @@ +../../../../extlib/reset/reset.css \ No newline at end of file diff --git a/mediagoblin/static/css/reset.css b/mediagoblin/static/css/reset.css deleted file mode 100644 index 6ce25ce7..00000000 --- a/mediagoblin/static/css/reset.css +++ /dev/null @@ -1,49 +0,0 @@ -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ - -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} -body { - line-height: 1; -} -ol, ul { - list-style: none; -} -blockquote, q { - quotes: none; -} -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; -} - -- cgit v1.2.3 From 42a7c010321a01d1abb01d1137cc46cd97d66843 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 18 Dec 2011 01:54:58 +0100 Subject: Add styles to make media.html not fall apart entirely --- mediagoblin/static/css/base.css | 14 ++++++++++++++ mediagoblin/templates/mediagoblin/user_pages/media.html | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index d3136788..2a05e988 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -126,8 +126,22 @@ a.mediagoblin_logo{ padding-top: 8px; text-align: center; font-size: 0.875em; + clear: both; } +.media_pane { + width: 640px; + margin-left: 0px; + margin-right: 10px; + float: left; +} + +.media_sidebar { + width: 280px; + margin-left: 10px; + margin-right: 0px; + float: left; +} /* common website elements */ diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index b9e31667..0c3f373e 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -37,7 +37,7 @@ {% endblock mediagoblin_head %} {% block mediagoblin_content %} -
    +
    {% block mediagoblin_media %} {% set display_media = request.app.public_store.file_url( @@ -141,7 +141,7 @@ media = media._id)) }} {% endif %}
    -
    +
    {% trans user_url=request.urlgen( 'mediagoblin.user_pages.user_home', user=media.get_uploader().username), -- cgit v1.2.3 From 00c1d00771e0db68f7775968c0e33f000c5f36af Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 18 Dec 2011 02:07:49 +0100 Subject: Change widths to percentages for small devices --- mediagoblin/static/css/base.css | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 2a05e988..187d1c7a 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -418,6 +418,9 @@ table.media_panel th { } @media handheld and (max-width: 480px), screen and (max-device-width: 480px), screen and (max-width: 960px) { + html { + padding:10px; + } .navigation_button { position: fixed; bottom: 0px; @@ -427,9 +430,19 @@ table.media_panel th { } .navigation_left { left: 0px; - width: 50%; } .media_image { - width: 480px; + width: 100%; + } + .mediagoblin_body { + width: 100%; + } + .mediagoblin_header, .mediagoblin_content, .mediagoblin_footer, .media_pane { + width: 100%; + margin-left: 0; + margin-right: 0; + } + .mediagoblin_footer { + margin-bottom: 100px; } } -- cgit v1.2.3 From 7b194a79f0ad789309b9c34340f19c5a962b0915 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 18 Dec 2011 17:02:27 +0100 Subject: SQL: mongokit like interface In trying to ease the migration to SQL, created an interface to sqlalchemy that looks a lot like the interface that is currently in use. *WARNING* Work in progress --- mediagoblin/db/sql/base.py | 16 ++++++++++++++++ mediagoblin/db/sql/convert.py | 7 ++++++- mediagoblin/db/sql/models.py | 4 +++- mediagoblin/db/sql/open.py | 29 +++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 mediagoblin/db/sql/base.py create mode 100644 mediagoblin/db/sql/open.py diff --git a/mediagoblin/db/sql/base.py b/mediagoblin/db/sql/base.py new file mode 100644 index 00000000..b8d5cc96 --- /dev/null +++ b/mediagoblin/db/sql/base.py @@ -0,0 +1,16 @@ +from sqlalchemy.orm import scoped_session, sessionmaker + + +Session = scoped_session(sessionmaker()) + + +class GMGTableBase(object): + query = Session.query_property() + + @classmethod + def find(cls, query_dict={}): + return cls.query.filter_by(**query_dict) + + @classmethod + def find_one(cls, query_dict={}): + return cls.query.filter_by(**query_dict).first() diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py index 2ffa9fd7..6de758ed 100644 --- a/mediagoblin/db/sql/convert.py +++ b/mediagoblin/db/sql/convert.py @@ -7,7 +7,8 @@ from mediagoblin.db.util import ObjectId from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment, Tag, MediaTag) -Session = sessionmaker() +# Session = sessionmaker() +from mediagoblin.db.sql.base import Session obj_id_table = dict() @@ -134,9 +135,13 @@ def main(): Base.metadata.create_all(engine) convert_users(mk_db) + Session.remove() convert_media_entries(mk_db) + Session.remove() convert_media_tags(mk_db) + Session.remove() convert_media_comments(mk_db) + Session.remove() if __name__ == '__main__': diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py index 7723a753..b87ff3aa 100644 --- a/mediagoblin/db/sql/models.py +++ b/mediagoblin/db/sql/models.py @@ -5,8 +5,10 @@ from sqlalchemy import ( Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey, UniqueConstraint) +from mediagoblin.db.sql.base import GMGTableBase -Base = declarative_base() + +Base = declarative_base(cls=GMGTableBase) class User(Base): diff --git a/mediagoblin/db/sql/open.py b/mediagoblin/db/sql/open.py new file mode 100644 index 00000000..57feaf50 --- /dev/null +++ b/mediagoblin/db/sql/open.py @@ -0,0 +1,29 @@ +from sqlalchemy import create_engine + +from mediagoblin.db.sql.base import Session +from mediagoblin.db.sql.models import Base + + +class DatabaseMaster(object): + def __init__(self, engine): + self.engine = engine + + for k,v in Base._decl_class_registry.iteritems(): + setattr(self, k, v) + + def commit(self): + Session.commit() + + def save(self, obj): + Session.add(obj) + Session.flush() + + def reset_after_request(self): + Session.remove() + + +def setup_connection_and_db_from_config(app_config): + engine = create_engine(app_config['sql_engine'], echo=True) + Session.configure(bind=engine) + + return "dummy conn", DatabaseMaster(engine) -- cgit v1.2.3 From 046f9f8481a8950ce18dfc8b4f14e4d14cf59c7a Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 20 Dec 2011 19:06:04 +0100 Subject: Move db/open.py to db/mongo/open.py Starting to move the mongo specific stuff into db/mongo. And create thin "from db.mongo.Y import z" wrappers in db/Y.py. Why? 1) Will make it lots easier to switch to sql for testing/developing. 2) The mongo stuff needs to stay around after moving to sql, because the converter needs it. --- mediagoblin/db/mongo/__init__.py | 15 +++++++++++ mediagoblin/db/mongo/open.py | 55 ++++++++++++++++++++++++++++++++++++++++ mediagoblin/db/open.py | 40 +---------------------------- 3 files changed, 71 insertions(+), 39 deletions(-) create mode 100644 mediagoblin/db/mongo/__init__.py create mode 100644 mediagoblin/db/mongo/open.py diff --git a/mediagoblin/db/mongo/__init__.py b/mediagoblin/db/mongo/__init__.py new file mode 100644 index 00000000..ba347c69 --- /dev/null +++ b/mediagoblin/db/mongo/__init__.py @@ -0,0 +1,15 @@ +# 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 . diff --git a/mediagoblin/db/mongo/open.py b/mediagoblin/db/mongo/open.py new file mode 100644 index 00000000..e677ba12 --- /dev/null +++ b/mediagoblin/db/mongo/open.py @@ -0,0 +1,55 @@ +# 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 . + +import pymongo +import mongokit +from paste.deploy.converters import asint +from mediagoblin.db import models + + +def connect_database_from_config(app_config, use_pymongo=False): + """ + Connect to the main database, take config from app_config + + Optionally use pymongo instead of mongokit for the connection. + """ + port = app_config.get('db_port') + if port: + port = asint(port) + + if use_pymongo: + connection = pymongo.Connection( + app_config.get('db_host'), port) + else: + connection = mongokit.Connection( + app_config.get('db_host'), port) + return connection + + +def setup_connection_and_db_from_config(app_config, use_pymongo=False): + """ + Setup connection and database from config. + + Optionally use pymongo instead of mongokit. + """ + connection = connect_database_from_config(app_config, use_pymongo) + database_path = app_config['db_name'] + db = connection[database_path] + + if not use_pymongo: + models.register_models(connection) + + return (connection, db) diff --git a/mediagoblin/db/open.py b/mediagoblin/db/open.py index e677ba12..a92a6ada 100644 --- a/mediagoblin/db/open.py +++ b/mediagoblin/db/open.py @@ -14,42 +14,4 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import pymongo -import mongokit -from paste.deploy.converters import asint -from mediagoblin.db import models - - -def connect_database_from_config(app_config, use_pymongo=False): - """ - Connect to the main database, take config from app_config - - Optionally use pymongo instead of mongokit for the connection. - """ - port = app_config.get('db_port') - if port: - port = asint(port) - - if use_pymongo: - connection = pymongo.Connection( - app_config.get('db_host'), port) - else: - connection = mongokit.Connection( - app_config.get('db_host'), port) - return connection - - -def setup_connection_and_db_from_config(app_config, use_pymongo=False): - """ - Setup connection and database from config. - - Optionally use pymongo instead of mongokit. - """ - connection = connect_database_from_config(app_config, use_pymongo) - database_path = app_config['db_name'] - db = connection[database_path] - - if not use_pymongo: - models.register_models(connection) - - return (connection, db) +from mediagoblin.db.mongo.open import setup_connection_and_db_from_config -- cgit v1.2.3 From 4970960f8c8e0a49d44f15853a2929c3e615a015 Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 20 Dec 2011 19:20:09 +0100 Subject: Move db/indexes.py to db/mongo/indexes.py And change references (one!). --- mediagoblin/db/indexes.py | 146 ---------------------------------------- mediagoblin/db/mongo/indexes.py | 146 ++++++++++++++++++++++++++++++++++++++++ mediagoblin/db/util.py | 2 +- 3 files changed, 147 insertions(+), 147 deletions(-) delete mode 100644 mediagoblin/db/indexes.py create mode 100644 mediagoblin/db/mongo/indexes.py diff --git a/mediagoblin/db/indexes.py b/mediagoblin/db/indexes.py deleted file mode 100644 index 1dd73f2b..00000000 --- a/mediagoblin/db/indexes.py +++ /dev/null @@ -1,146 +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 . - -""" -Indexes for the local database. - -To add new indexes ------------------- - -Indexes are recorded in the following format: - -ACTIVE_INDEXES = { - 'collection_name': { - 'identifier': { # key identifier used for possibly deprecating later - 'index': [index_foo_goes_here]}} - -... and anything else being parameters to the create_index function -(including unique=True, etc) - -Current indexes must be registered in ACTIVE_INDEXES... deprecated -indexes should be marked in DEPRECATED_INDEXES. - -Remember, ordering of compound indexes MATTERS. Read below for more. - -REQUIRED READING: - - http://kylebanker.com/blog/2010/09/21/the-joy-of-mongodb-indexes/ - - - http://www.mongodb.org/display/DOCS/Indexes - - http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ - - -To remove deprecated indexes ----------------------------- - -Removing deprecated indexes is the same, just move the index into the -deprecated indexes mapping. - -DEPRECATED_INDEXES = { - 'collection_name': { - 'deprecated_index_identifier1': { - 'index': [index_foo_goes_here]}} - -... etc. - -If an index has been deprecated that identifier should NEVER BE USED -AGAIN. Eg, if you previously had 'awesomepants_unique', you shouldn't -use 'awesomepants_unique' again, you should create a totally new name -or at worst use 'awesomepants_unique2'. -""" - -from pymongo import ASCENDING, DESCENDING - - -################ -# Active indexes -################ -ACTIVE_INDEXES = {} - -# MediaEntry indexes -# ------------------ - -MEDIAENTRY_INDEXES = { - 'uploader_slug_unique': { - # Matching an object to an uploader + slug. - # MediaEntries are unique on these two combined, eg: - # /u/${myuser}/m/${myslugname}/ - 'index': [('uploader', ASCENDING), - ('slug', ASCENDING)], - 'unique': True}, - - 'created': { - # A global index for all media entries created, in descending - # order. This is used for the site's frontpage. - 'index': [('created', DESCENDING)]}, - - 'uploader_created': { - # Indexing on uploaders and when media entries are created. - # Used for showing a user gallery, etc. - 'index': [('uploader', ASCENDING), - ('created', DESCENDING)]}, - - 'state_uploader_tags_created': { - # Indexing on processed?, media uploader, associated tags, and - # timestamp Used for showing media items matching a tag - # search, most recent first. - 'index': [('state', ASCENDING), - ('uploader', ASCENDING), - ('tags.slug', DESCENDING), - ('created', DESCENDING)]}, - - 'state_tags_created': { - # Indexing on processed?, media tags, and timestamp (across all users) - # This is used for a front page tag search. - 'index': [('state', ASCENDING), - ('tags.slug', DESCENDING), - ('created', DESCENDING)]}} - - -ACTIVE_INDEXES['media_entries'] = MEDIAENTRY_INDEXES - - -# User indexes -# ------------ - -USER_INDEXES = { - 'username_unique': { - # Index usernames, and make sure they're unique. - # ... I guess we might need to adjust this once we're federated :) - 'index': 'username', - 'unique': True}, - 'created': { - # All most recently created users - 'index': 'created'}} - - -ACTIVE_INDEXES['users'] = USER_INDEXES - - -# MediaComment indexes - -MEDIA_COMMENT_INDEXES = { - 'mediaentry_created': { - 'index': [('media_entry', ASCENDING), - ('created', DESCENDING)]}} - -ACTIVE_INDEXES['media_comments'] = MEDIA_COMMENT_INDEXES - - -#################### -# Deprecated indexes -#################### - -DEPRECATED_INDEXES = {} diff --git a/mediagoblin/db/mongo/indexes.py b/mediagoblin/db/mongo/indexes.py new file mode 100644 index 00000000..1dd73f2b --- /dev/null +++ b/mediagoblin/db/mongo/indexes.py @@ -0,0 +1,146 @@ +# 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 . + +""" +Indexes for the local database. + +To add new indexes +------------------ + +Indexes are recorded in the following format: + +ACTIVE_INDEXES = { + 'collection_name': { + 'identifier': { # key identifier used for possibly deprecating later + 'index': [index_foo_goes_here]}} + +... and anything else being parameters to the create_index function +(including unique=True, etc) + +Current indexes must be registered in ACTIVE_INDEXES... deprecated +indexes should be marked in DEPRECATED_INDEXES. + +Remember, ordering of compound indexes MATTERS. Read below for more. + +REQUIRED READING: + - http://kylebanker.com/blog/2010/09/21/the-joy-of-mongodb-indexes/ + + - http://www.mongodb.org/display/DOCS/Indexes + - http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ + + +To remove deprecated indexes +---------------------------- + +Removing deprecated indexes is the same, just move the index into the +deprecated indexes mapping. + +DEPRECATED_INDEXES = { + 'collection_name': { + 'deprecated_index_identifier1': { + 'index': [index_foo_goes_here]}} + +... etc. + +If an index has been deprecated that identifier should NEVER BE USED +AGAIN. Eg, if you previously had 'awesomepants_unique', you shouldn't +use 'awesomepants_unique' again, you should create a totally new name +or at worst use 'awesomepants_unique2'. +""" + +from pymongo import ASCENDING, DESCENDING + + +################ +# Active indexes +################ +ACTIVE_INDEXES = {} + +# MediaEntry indexes +# ------------------ + +MEDIAENTRY_INDEXES = { + 'uploader_slug_unique': { + # Matching an object to an uploader + slug. + # MediaEntries are unique on these two combined, eg: + # /u/${myuser}/m/${myslugname}/ + 'index': [('uploader', ASCENDING), + ('slug', ASCENDING)], + 'unique': True}, + + 'created': { + # A global index for all media entries created, in descending + # order. This is used for the site's frontpage. + 'index': [('created', DESCENDING)]}, + + 'uploader_created': { + # Indexing on uploaders and when media entries are created. + # Used for showing a user gallery, etc. + 'index': [('uploader', ASCENDING), + ('created', DESCENDING)]}, + + 'state_uploader_tags_created': { + # Indexing on processed?, media uploader, associated tags, and + # timestamp Used for showing media items matching a tag + # search, most recent first. + 'index': [('state', ASCENDING), + ('uploader', ASCENDING), + ('tags.slug', DESCENDING), + ('created', DESCENDING)]}, + + 'state_tags_created': { + # Indexing on processed?, media tags, and timestamp (across all users) + # This is used for a front page tag search. + 'index': [('state', ASCENDING), + ('tags.slug', DESCENDING), + ('created', DESCENDING)]}} + + +ACTIVE_INDEXES['media_entries'] = MEDIAENTRY_INDEXES + + +# User indexes +# ------------ + +USER_INDEXES = { + 'username_unique': { + # Index usernames, and make sure they're unique. + # ... I guess we might need to adjust this once we're federated :) + 'index': 'username', + 'unique': True}, + 'created': { + # All most recently created users + 'index': 'created'}} + + +ACTIVE_INDEXES['users'] = USER_INDEXES + + +# MediaComment indexes + +MEDIA_COMMENT_INDEXES = { + 'mediaentry_created': { + 'index': [('media_entry', ASCENDING), + ('created', DESCENDING)]}} + +ACTIVE_INDEXES['media_comments'] = MEDIA_COMMENT_INDEXES + + +#################### +# Deprecated indexes +#################### + +DEPRECATED_INDEXES = {} diff --git a/mediagoblin/db/util.py b/mediagoblin/db/util.py index 52e97f6d..e2065693 100644 --- a/mediagoblin/db/util.py +++ b/mediagoblin/db/util.py @@ -34,7 +34,7 @@ from pymongo import ASCENDING, DESCENDING from pymongo.errors import InvalidId from mongokit import ObjectId -from mediagoblin.db.indexes import ACTIVE_INDEXES, DEPRECATED_INDEXES +from mediagoblin.db.mongo.indexes import ACTIVE_INDEXES, DEPRECATED_INDEXES ################ -- cgit v1.2.3 From 59bd06aabb0b9a6277d2ad5d1d38c3c8a8da5298 Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 20 Dec 2011 19:35:47 +0100 Subject: Move db/util.py -> db/mongo/util.py - Change some reference - Provide a wrapper db/util.py --- mediagoblin/db/migrations.py | 2 +- mediagoblin/db/models.py | 2 +- mediagoblin/db/mongo/util.py | 292 +++++++++++++++++++++++++++++++++++ mediagoblin/db/util.py | 278 +-------------------------------- mediagoblin/tests/test_migrations.py | 2 +- 5 files changed, 297 insertions(+), 279 deletions(-) create mode 100644 mediagoblin/db/mongo/util.py diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py index cfc01287..cf4e94ae 100644 --- a/mediagoblin/db/migrations.py +++ b/mediagoblin/db/migrations.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 . -from mediagoblin.db.util import RegisterMigration +from mediagoblin.db.mongo.util import RegisterMigration from mediagoblin.tools.text import cleaned_markdown_conversion diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 569c3600..51c6e98e 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -22,7 +22,7 @@ from mongokit import Document 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.db.mongo.util import ASCENDING, DESCENDING, ObjectId from mediagoblin.tools.pagination import Pagination from mediagoblin.tools import url, common diff --git a/mediagoblin/db/mongo/util.py b/mediagoblin/db/mongo/util.py new file mode 100644 index 00000000..e2065693 --- /dev/null +++ b/mediagoblin/db/mongo/util.py @@ -0,0 +1,292 @@ +# 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 . + +""" +Utilities for database operations. + +Some note on migration and indexing tools: + +We store information about what the state of the database is in the +'mediagoblin' document of the 'app_metadata' collection. Keys in that +document relevant to here: + + - 'migration_number': The integer representing the current state of + the migrations +""" + +import copy + +# Imports that other modules might use +from pymongo import ASCENDING, DESCENDING +from pymongo.errors import InvalidId +from mongokit import ObjectId + +from mediagoblin.db.mongo.indexes import ACTIVE_INDEXES, DEPRECATED_INDEXES + + +################ +# Indexing tools +################ + + +def add_new_indexes(database, active_indexes=ACTIVE_INDEXES): + """ + Add any new indexes to the database. + + Args: + - database: pymongo or mongokit database instance. + - active_indexes: indexes to possibly add in the pattern of: + {'collection_name': { + 'identifier': { + 'index': [index_foo_goes_here], + 'unique': True}} + where 'index' is the index to add and all other options are + arguments for collection.create_index. + + Returns: + A list of indexes added in form ('collection', 'index_name') + """ + indexes_added = [] + + for collection_name, indexes in active_indexes.iteritems(): + collection = database[collection_name] + collection_indexes = collection.index_information().keys() + + for index_name, index_data in indexes.iteritems(): + if not index_name in collection_indexes: + # Get a copy actually so we don't modify the actual + # structure + index_data = copy.copy(index_data) + index = index_data.pop('index') + collection.create_index( + index, name=index_name, **index_data) + + indexes_added.append((collection_name, index_name)) + + return indexes_added + + +def remove_deprecated_indexes(database, deprecated_indexes=DEPRECATED_INDEXES): + """ + Remove any deprecated indexes from the database. + + Args: + - database: pymongo or mongokit database instance. + - deprecated_indexes: the indexes to deprecate in the pattern of: + {'collection_name': { + 'identifier': { + 'index': [index_foo_goes_here], + 'unique': True}} + + (... although we really only need the 'identifier' here, as the + rest of the information isn't used in this case. But it's kept + around so we can remember what it was) + + Returns: + A list of indexes removed in form ('collection', 'index_name') + """ + indexes_removed = [] + + for collection_name, indexes in deprecated_indexes.iteritems(): + collection = database[collection_name] + collection_indexes = collection.index_information().keys() + + for index_name, index_data in indexes.iteritems(): + if index_name in collection_indexes: + collection.drop_index(index_name) + + indexes_removed.append((collection_name, index_name)) + + return indexes_removed + + +################# +# Migration tools +################# + +# The default migration registry... +# +# Don't set this yourself! RegisterMigration will automatically fill +# this with stuff via decorating methods in migrations.py + +class MissingCurrentMigration(Exception): + pass + + +MIGRATIONS = {} + + +class RegisterMigration(object): + """ + Tool for registering migrations + + Call like: + + @RegisterMigration(33) + def update_dwarves(database): + [...] + + This will register your migration with the default migration + registry. Alternately, to specify a very specific + migration_registry, you can pass in that as the second argument. + + Note, the number of your migration should NEVER be 0 or less than + 0. 0 is the default "no migrations" state! + """ + def __init__(self, migration_number, migration_registry=MIGRATIONS): + assert migration_number > 0, "Migration number must be > 0!" + assert migration_number not in migration_registry, \ + "Duplicate migration numbers detected! That's not allowed!" + + self.migration_number = migration_number + self.migration_registry = migration_registry + + def __call__(self, migration): + self.migration_registry[self.migration_number] = migration + return migration + + +class MigrationManager(object): + """ + Migration handling tool. + + Takes information about a database, lets you update the database + to the latest migrations, etc. + """ + def __init__(self, database, migration_registry=MIGRATIONS): + """ + Args: + - database: database we're going to migrate + - migration_registry: where we should find all migrations to + run + """ + self.database = database + self.migration_registry = migration_registry + self._sorted_migrations = None + + def _ensure_current_migration_record(self): + """ + If there isn't a database[u'app_metadata'] mediagoblin entry + with the 'current_migration', throw an error. + """ + if self.database_current_migration() is None: + raise MissingCurrentMigration( + "Tried to call function which requires " + "'current_migration' set in database") + + @property + def sorted_migrations(self): + """ + Sort migrations if necessary and store in self._sorted_migrations + """ + if not self._sorted_migrations: + self._sorted_migrations = sorted( + self.migration_registry.items(), + # sort on the key... the migration number + key=lambda migration_tuple: migration_tuple[0]) + + return self._sorted_migrations + + def latest_migration(self): + """ + Return a migration number for the latest migration, or 0 if + there are no migrations. + """ + if self.sorted_migrations: + return self.sorted_migrations[-1][0] + else: + # If no migrations have been set, we start at 0. + return 0 + + def set_current_migration(self, migration_number): + """ + Set the migration in the database to migration_number + """ + # Add the mediagoblin migration if necessary + self.database[u'app_metadata'].update( + {u'_id': u'mediagoblin'}, + {u'$set': {u'current_migration': migration_number}}, + upsert=True) + + def install_migration_version_if_missing(self): + """ + Sets the migration to the latest version if no migration + version at all is set. + """ + mgoblin_metadata = self.database[u'app_metadata'].find_one( + {u'_id': u'mediagoblin'}) + if not mgoblin_metadata: + latest_migration = self.latest_migration() + self.set_current_migration(latest_migration) + + def database_current_migration(self): + """ + Return the current migration in the database. + """ + mgoblin_metadata = self.database[u'app_metadata'].find_one( + {u'_id': u'mediagoblin'}) + if not mgoblin_metadata: + return None + else: + return mgoblin_metadata[u'current_migration'] + + def database_at_latest_migration(self): + """ + See if the database is at the latest migration. + Returns a boolean. + """ + current_migration = self.database_current_migration() + return current_migration == self.latest_migration() + + def migrations_to_run(self): + """ + Get a list of migrations to run still, if any. + + Note that calling this will set your migration version to the + latest version if it isn't installed to anything yet! + """ + self._ensure_current_migration_record() + + db_current_migration = self.database_current_migration() + + return [ + (migration_number, migration_func) + for migration_number, migration_func in self.sorted_migrations + if migration_number > db_current_migration] + + def migrate_new(self, pre_callback=None, post_callback=None): + """ + Run all migrations. + + Includes two optional args: + - pre_callback: if called, this is a callback on something to + run pre-migration. Takes (migration_number, migration_func) + as arguments + - pre_callback: if called, this is a callback on something to + run post-migration. Takes (migration_number, migration_func) + as arguments + """ + # If we aren't set to any version number, presume we're at the + # latest (which means we'll do nothing here...) + self.install_migration_version_if_missing() + + for migration_number, migration_func in self.migrations_to_run(): + if pre_callback: + pre_callback(migration_number, migration_func) + migration_func(self.database) + self.set_current_migration(migration_number) + if post_callback: + post_callback(migration_number, migration_func) diff --git a/mediagoblin/db/util.py b/mediagoblin/db/util.py index e2065693..3fd96a1d 100644 --- a/mediagoblin/db/util.py +++ b/mediagoblin/db/util.py @@ -14,279 +14,5 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -""" -Utilities for database operations. - -Some note on migration and indexing tools: - -We store information about what the state of the database is in the -'mediagoblin' document of the 'app_metadata' collection. Keys in that -document relevant to here: - - - 'migration_number': The integer representing the current state of - the migrations -""" - -import copy - -# Imports that other modules might use -from pymongo import ASCENDING, DESCENDING -from pymongo.errors import InvalidId -from mongokit import ObjectId - -from mediagoblin.db.mongo.indexes import ACTIVE_INDEXES, DEPRECATED_INDEXES - - -################ -# Indexing tools -################ - - -def add_new_indexes(database, active_indexes=ACTIVE_INDEXES): - """ - Add any new indexes to the database. - - Args: - - database: pymongo or mongokit database instance. - - active_indexes: indexes to possibly add in the pattern of: - {'collection_name': { - 'identifier': { - 'index': [index_foo_goes_here], - 'unique': True}} - where 'index' is the index to add and all other options are - arguments for collection.create_index. - - Returns: - A list of indexes added in form ('collection', 'index_name') - """ - indexes_added = [] - - for collection_name, indexes in active_indexes.iteritems(): - collection = database[collection_name] - collection_indexes = collection.index_information().keys() - - for index_name, index_data in indexes.iteritems(): - if not index_name in collection_indexes: - # Get a copy actually so we don't modify the actual - # structure - index_data = copy.copy(index_data) - index = index_data.pop('index') - collection.create_index( - index, name=index_name, **index_data) - - indexes_added.append((collection_name, index_name)) - - return indexes_added - - -def remove_deprecated_indexes(database, deprecated_indexes=DEPRECATED_INDEXES): - """ - Remove any deprecated indexes from the database. - - Args: - - database: pymongo or mongokit database instance. - - deprecated_indexes: the indexes to deprecate in the pattern of: - {'collection_name': { - 'identifier': { - 'index': [index_foo_goes_here], - 'unique': True}} - - (... although we really only need the 'identifier' here, as the - rest of the information isn't used in this case. But it's kept - around so we can remember what it was) - - Returns: - A list of indexes removed in form ('collection', 'index_name') - """ - indexes_removed = [] - - for collection_name, indexes in deprecated_indexes.iteritems(): - collection = database[collection_name] - collection_indexes = collection.index_information().keys() - - for index_name, index_data in indexes.iteritems(): - if index_name in collection_indexes: - collection.drop_index(index_name) - - indexes_removed.append((collection_name, index_name)) - - return indexes_removed - - -################# -# Migration tools -################# - -# The default migration registry... -# -# Don't set this yourself! RegisterMigration will automatically fill -# this with stuff via decorating methods in migrations.py - -class MissingCurrentMigration(Exception): - pass - - -MIGRATIONS = {} - - -class RegisterMigration(object): - """ - Tool for registering migrations - - Call like: - - @RegisterMigration(33) - def update_dwarves(database): - [...] - - This will register your migration with the default migration - registry. Alternately, to specify a very specific - migration_registry, you can pass in that as the second argument. - - Note, the number of your migration should NEVER be 0 or less than - 0. 0 is the default "no migrations" state! - """ - def __init__(self, migration_number, migration_registry=MIGRATIONS): - assert migration_number > 0, "Migration number must be > 0!" - assert migration_number not in migration_registry, \ - "Duplicate migration numbers detected! That's not allowed!" - - self.migration_number = migration_number - self.migration_registry = migration_registry - - def __call__(self, migration): - self.migration_registry[self.migration_number] = migration - return migration - - -class MigrationManager(object): - """ - Migration handling tool. - - Takes information about a database, lets you update the database - to the latest migrations, etc. - """ - def __init__(self, database, migration_registry=MIGRATIONS): - """ - Args: - - database: database we're going to migrate - - migration_registry: where we should find all migrations to - run - """ - self.database = database - self.migration_registry = migration_registry - self._sorted_migrations = None - - def _ensure_current_migration_record(self): - """ - If there isn't a database[u'app_metadata'] mediagoblin entry - with the 'current_migration', throw an error. - """ - if self.database_current_migration() is None: - raise MissingCurrentMigration( - "Tried to call function which requires " - "'current_migration' set in database") - - @property - def sorted_migrations(self): - """ - Sort migrations if necessary and store in self._sorted_migrations - """ - if not self._sorted_migrations: - self._sorted_migrations = sorted( - self.migration_registry.items(), - # sort on the key... the migration number - key=lambda migration_tuple: migration_tuple[0]) - - return self._sorted_migrations - - def latest_migration(self): - """ - Return a migration number for the latest migration, or 0 if - there are no migrations. - """ - if self.sorted_migrations: - return self.sorted_migrations[-1][0] - else: - # If no migrations have been set, we start at 0. - return 0 - - def set_current_migration(self, migration_number): - """ - Set the migration in the database to migration_number - """ - # Add the mediagoblin migration if necessary - self.database[u'app_metadata'].update( - {u'_id': u'mediagoblin'}, - {u'$set': {u'current_migration': migration_number}}, - upsert=True) - - def install_migration_version_if_missing(self): - """ - Sets the migration to the latest version if no migration - version at all is set. - """ - mgoblin_metadata = self.database[u'app_metadata'].find_one( - {u'_id': u'mediagoblin'}) - if not mgoblin_metadata: - latest_migration = self.latest_migration() - self.set_current_migration(latest_migration) - - def database_current_migration(self): - """ - Return the current migration in the database. - """ - mgoblin_metadata = self.database[u'app_metadata'].find_one( - {u'_id': u'mediagoblin'}) - if not mgoblin_metadata: - return None - else: - return mgoblin_metadata[u'current_migration'] - - def database_at_latest_migration(self): - """ - See if the database is at the latest migration. - Returns a boolean. - """ - current_migration = self.database_current_migration() - return current_migration == self.latest_migration() - - def migrations_to_run(self): - """ - Get a list of migrations to run still, if any. - - Note that calling this will set your migration version to the - latest version if it isn't installed to anything yet! - """ - self._ensure_current_migration_record() - - db_current_migration = self.database_current_migration() - - return [ - (migration_number, migration_func) - for migration_number, migration_func in self.sorted_migrations - if migration_number > db_current_migration] - - def migrate_new(self, pre_callback=None, post_callback=None): - """ - Run all migrations. - - Includes two optional args: - - pre_callback: if called, this is a callback on something to - run pre-migration. Takes (migration_number, migration_func) - as arguments - - pre_callback: if called, this is a callback on something to - run post-migration. Takes (migration_number, migration_func) - as arguments - """ - # If we aren't set to any version number, presume we're at the - # latest (which means we'll do nothing here...) - self.install_migration_version_if_missing() - - for migration_number, migration_func in self.migrations_to_run(): - if pre_callback: - pre_callback(migration_number, migration_func) - migration_func(self.database) - self.set_current_migration(migration_number) - if post_callback: - post_callback(migration_number, migration_func) +from mediagoblin.db.mongo.util import (MigrationManager, ObjectId, InvalidId, + DESCENDING) diff --git a/mediagoblin/tests/test_migrations.py b/mediagoblin/tests/test_migrations.py index e7cef0a1..3e2e37ee 100644 --- a/mediagoblin/tests/test_migrations.py +++ b/mediagoblin/tests/test_migrations.py @@ -20,7 +20,7 @@ from pymongo import Connection from mediagoblin.tests.tools import ( install_fixtures_simple, assert_db_meets_expected) -from mediagoblin.db.util import ( +from mediagoblin.db.mongo.util import ( RegisterMigration, MigrationManager, ObjectId, MissingCurrentMigration) from mediagoblin.db.migrations import add_table_field -- cgit v1.2.3 From faf74067dae0f6f9d200a30369e9b7a4501b66ab Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 20 Dec 2011 20:33:33 +0100 Subject: Move db/migrations.py -> db/mongo/migrations.py And change references. --- mediagoblin/db/migrations.py | 110 ----------------------------------- mediagoblin/db/models.py | 2 +- mediagoblin/db/mongo/migrations.py | 110 +++++++++++++++++++++++++++++++++++ mediagoblin/init/__init__.py | 2 +- mediagoblin/tests/test_migrations.py | 2 +- 5 files changed, 113 insertions(+), 113 deletions(-) delete mode 100644 mediagoblin/db/migrations.py create mode 100644 mediagoblin/db/mongo/migrations.py diff --git a/mediagoblin/db/migrations.py b/mediagoblin/db/migrations.py deleted file mode 100644 index cf4e94ae..00000000 --- a/mediagoblin/db/migrations.py +++ /dev/null @@ -1,110 +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 . - -from mediagoblin.db.mongo.util import RegisterMigration -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 -# basic migrations. - - -@RegisterMigration(1) -def user_add_bio_html(database): - """ - Users now have richtext bios via Markdown, reflect appropriately. - """ - collection = database['users'] - - target = collection.find( - {'bio_html': {'$exists': False}}) - - for document in target: - document['bio_html'] = cleaned_markdown_conversion( - document['bio']) - collection.save(document) - - -@RegisterMigration(2) -def mediaentry_mediafiles_main_to_original(database): - """ - Rename "main" media file to "original". - """ - collection = database['media_entries'] - target = collection.find( - {'media_files.main': {'$exists': True}}) - - for document in target: - original = document['media_files'].pop('main') - document['media_files']['original'] = original - - collection.save(document) - - -@RegisterMigration(3) -def mediaentry_remove_thumbnail_file(database): - """ - Use media_files['thumb'] instead of media_entries['thumbnail_file'] - """ - database['media_entries'].update( - {'thumbnail_file': {'$exists': True}}, - {'$unset': {'thumbnail_file': 1}}, - multi=True) - - -@RegisterMigration(4) -def mediaentry_add_queued_task_id(database): - """ - Add the 'queued_task_id' field for entries that don't have it. - """ - add_table_field(database, 'media_entries', 'queued_task_id', None) - - -@RegisterMigration(5) -def mediaentry_add_fail_error_and_metadata(database): - """ - Add 'fail_error' and 'fail_metadata' fields to media entries - """ - add_table_field(database, 'media_entries', 'fail_error', None) - add_table_field(database, 'media_entries', 'fail_metadata', {}) - - -@RegisterMigration(6) -def user_add_forgot_password_token_and_expires(database): - """ - Add token and expiration fields to help recover forgotten passwords - """ - add_table_field(database, 'users', 'fp_verification_key', None) - add_table_field(database, 'users', 'fp_token_expire', None) - - -@RegisterMigration(7) -def media_type_image_to_multimedia_type_image(database): - database['media_entries'].update( - {'media_type': 'image'}, - {'$set': {'media_type': 'mediagoblin.media_types.image'}}, - multi=True) diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 51c6e98e..e2ac1b5a 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -21,7 +21,7 @@ from mongokit import Document from mediagoblin.auth import lib as auth_lib from mediagoblin import mg_globals -from mediagoblin.db import migrations +from mediagoblin.db.mongo import migrations from mediagoblin.db.mongo.util import ASCENDING, DESCENDING, ObjectId from mediagoblin.tools.pagination import Pagination from mediagoblin.tools import url, common diff --git a/mediagoblin/db/mongo/migrations.py b/mediagoblin/db/mongo/migrations.py new file mode 100644 index 00000000..cf4e94ae --- /dev/null +++ b/mediagoblin/db/mongo/migrations.py @@ -0,0 +1,110 @@ +# 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 . + +from mediagoblin.db.mongo.util import RegisterMigration +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 +# basic migrations. + + +@RegisterMigration(1) +def user_add_bio_html(database): + """ + Users now have richtext bios via Markdown, reflect appropriately. + """ + collection = database['users'] + + target = collection.find( + {'bio_html': {'$exists': False}}) + + for document in target: + document['bio_html'] = cleaned_markdown_conversion( + document['bio']) + collection.save(document) + + +@RegisterMigration(2) +def mediaentry_mediafiles_main_to_original(database): + """ + Rename "main" media file to "original". + """ + collection = database['media_entries'] + target = collection.find( + {'media_files.main': {'$exists': True}}) + + for document in target: + original = document['media_files'].pop('main') + document['media_files']['original'] = original + + collection.save(document) + + +@RegisterMigration(3) +def mediaentry_remove_thumbnail_file(database): + """ + Use media_files['thumb'] instead of media_entries['thumbnail_file'] + """ + database['media_entries'].update( + {'thumbnail_file': {'$exists': True}}, + {'$unset': {'thumbnail_file': 1}}, + multi=True) + + +@RegisterMigration(4) +def mediaentry_add_queued_task_id(database): + """ + Add the 'queued_task_id' field for entries that don't have it. + """ + add_table_field(database, 'media_entries', 'queued_task_id', None) + + +@RegisterMigration(5) +def mediaentry_add_fail_error_and_metadata(database): + """ + Add 'fail_error' and 'fail_metadata' fields to media entries + """ + add_table_field(database, 'media_entries', 'fail_error', None) + add_table_field(database, 'media_entries', 'fail_metadata', {}) + + +@RegisterMigration(6) +def user_add_forgot_password_token_and_expires(database): + """ + Add token and expiration fields to help recover forgotten passwords + """ + add_table_field(database, 'users', 'fp_verification_key', None) + add_table_field(database, 'users', 'fp_token_expire', None) + + +@RegisterMigration(7) +def media_type_image_to_multimedia_type_image(database): + database['media_entries'].update( + {'media_type': 'image'}, + {'$set': {'media_type': 'mediagoblin.media_types.image'}}, + multi=True) diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index 08a0618d..5f7f83d4 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -57,7 +57,7 @@ def setup_database(): app_config = mg_globals.app_config # This MUST be imported so as to set up the appropriate migrations! - from mediagoblin.db import migrations + from mediagoblin.db.mongo import migrations # Set up the database connection, db = setup_connection_and_db_from_config(app_config) diff --git a/mediagoblin/tests/test_migrations.py b/mediagoblin/tests/test_migrations.py index 3e2e37ee..8e573f5a 100644 --- a/mediagoblin/tests/test_migrations.py +++ b/mediagoblin/tests/test_migrations.py @@ -23,7 +23,7 @@ from mediagoblin.tests.tools import ( from mediagoblin.db.mongo.util import ( RegisterMigration, MigrationManager, ObjectId, MissingCurrentMigration) -from mediagoblin.db.migrations import add_table_field +from mediagoblin.db.mongo.migrations import add_table_field # This one will get filled with local migrations TEST_MIGRATION_REGISTRY = {} -- cgit v1.2.3 From 4ae4012dad3f5638ea7b510d40f0b4d0b641fe2a Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 20 Dec 2011 20:41:21 +0100 Subject: Move db/models.py -> db/mongo/models.py To my surprise, there was only ONE reference to models.py. From open.py. --- mediagoblin/db/models.py | 363 ----------------------------------------- mediagoblin/db/mongo/models.py | 363 +++++++++++++++++++++++++++++++++++++++++ mediagoblin/db/mongo/open.py | 2 +- 3 files changed, 364 insertions(+), 364 deletions(-) delete mode 100644 mediagoblin/db/models.py create mode 100644 mediagoblin/db/mongo/models.py diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py deleted file mode 100644 index e2ac1b5a..00000000 --- a/mediagoblin/db/models.py +++ /dev/null @@ -1,363 +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 . - -import datetime -import uuid - -from mongokit import Document - -from mediagoblin.auth import lib as auth_lib -from mediagoblin import mg_globals -from mediagoblin.db.mongo import migrations -from mediagoblin.db.mongo.util import ASCENDING, DESCENDING, ObjectId -from mediagoblin.tools.pagination import Pagination -from mediagoblin.tools import url, common - -################### -# Custom validators -################### - -######## -# Models -######## - - -class User(Document): - """ - A user of MediaGoblin. - - Structure: - - username: The username of this user, should be unique to this instance. - - email: Email address of this user - - created: When the user was created - - plugin_data: a mapping of extra plugin information for this User. - Nothing uses this yet as we don't have plugins, but someday we - might... :) - - pw_hash: Hashed version of user's password. - - email_verified: Whether or not the user has verified their email or not. - Most parts of the site are disabled for users who haven't yet. - - status: whether or not the user is active, etc. Currently only has two - values, 'needs_email_verification' or 'active'. (In the future, maybe - we'll change this to a boolean with a key of 'active' and have a - separate field for a reason the user's been disabled if that's - appropriate... email_verified is already separate, after all.) - - verification_key: If the user is awaiting email verification, the user - will have to provide this key (which will be encoded in the presented - URL) in order to confirm their email as active. - - is_admin: Whether or not this user is an administrator or not. - - url: this user's personal webpage/website, if appropriate. - - bio: biography of this user (plaintext, in markdown) - - bio_html: biography of the user converted to proper HTML. - """ - __collection__ = 'users' - use_dot_notation = True - - structure = { - 'username': unicode, - 'email': unicode, - 'created': datetime.datetime, - 'plugin_data': dict, # plugins can dump stuff here. - 'pw_hash': unicode, - 'email_verified': bool, - 'status': unicode, - 'verification_key': unicode, - 'is_admin': bool, - 'url': unicode, - 'bio': unicode, # May contain markdown - 'bio_html': unicode, # May contain plaintext, or HTML - 'fp_verification_key': unicode, # forgotten password verification key - 'fp_token_expire': datetime.datetime, - } - - required_fields = ['username', 'created', 'pw_hash', 'email'] - - default_values = { - 'created': datetime.datetime.utcnow, - 'email_verified': False, - 'status': u'needs_email_verification', - 'verification_key': lambda: unicode(uuid.uuid4()), - 'is_admin': False} - - def check_login(self, password): - """ - See if a user can login with this password - """ - return auth_lib.bcrypt_check_password( - password, self.pw_hash) - - -class MediaEntry(Document): - """ - Record of a piece of media. - - Structure: - - uploader: A reference to a User who uploaded this. - - - title: Title of this work - - - slug: A normalized "slug" which can be used as part of a URL to retrieve - this work, such as 'my-works-name-in-slug-form' may be viewable by - 'http://mg.example.org/u/username/m/my-works-name-in-slug-form/' - Note that since URLs are constructed this way, slugs must be unique - per-uploader. (An index is provided to enforce that but code should be - written on the python side to ensure this as well.) - - - created: Date and time of when this piece of work was uploaded. - - - description: Uploader-set description of this work. This can be marked - up with MarkDown for slight fanciness (links, boldness, italics, - paragraphs...) - - - description_html: Rendered version of the description, run through - Markdown and cleaned with our cleaning tool. - - - media_type: What type of media is this? Currently we only support - 'image' ;) - - - media_data: Extra information that's media-format-dependent. - For example, images might contain some EXIF data that's not appropriate - to other formats. You might store it like: - - mediaentry.media_data['exif'] = { - 'manufacturer': 'CASIO', - 'model': 'QV-4000', - 'exposure_time': .659} - - Alternately for video you might store: - - # play length in seconds - mediaentry.media_data['play_length'] = 340 - - ... so what's appropriate here really depends on the media type. - - - plugin_data: a mapping of extra plugin information for this User. - Nothing uses this yet as we don't have plugins, but someday we - might... :) - - - tags: A list of tags. Each tag is stored as a dictionary that has a key - for the actual name and the normalized name-as-slug, so ultimately this - looks like: - [{'name': 'Gully Gardens', - 'slug': 'gully-gardens'}, - {'name': 'Castle Adventure Time?!", - 'slug': 'castle-adventure-time'}] - - - state: What's the state of this file? Active, inactive, disabled, etc... - But really for now there are only two states: - "unprocessed": uploaded but needs to go through processing for display - "processed": processed and able to be displayed - - - queued_media_file: storage interface style filepath describing a file - queued for processing. This is stored in the mg_globals.queue_store - storage system. - - - queued_task_id: celery task id. Use this to fetch the task state. - - - media_files: Files relevant to this that have actually been processed - and are available for various types of display. Stored like: - {'thumb': ['dir1', 'dir2', 'pic.png'} - - - attachment_files: A list of "attachment" files, ones that aren't - critical to this piece of media but may be usefully relevant to people - viewing the work. (currently unused.) - - - fail_error: path to the exception raised - - fail_metadata: - """ - __collection__ = 'media_entries' - use_dot_notation = True - - structure = { - 'uploader': ObjectId, - 'title': unicode, - 'slug': unicode, - 'created': datetime.datetime, - 'description': unicode, # May contain markdown/up - 'description_html': unicode, # May contain plaintext, or HTML - 'media_type': unicode, - 'media_data': dict, # extra data relevant to this media_type - 'plugin_data': dict, # plugins can dump stuff here. - 'tags': [dict], - 'state': unicode, - - # For now let's assume there can only be one main file queued - # at a time - 'queued_media_file': [unicode], - 'queued_task_id': unicode, - - # A dictionary of logical names to filepaths - 'media_files': dict, - - # The following should be lists of lists, in appropriate file - # record form - 'attachment_files': list, - - # If things go badly in processing things, we'll store that - # data here - 'fail_error': unicode, - 'fail_metadata': dict} - - required_fields = [ - 'uploader', 'created', 'media_type', 'slug'] - - default_values = { - 'created': datetime.datetime.utcnow, - 'state': u'unprocessed'} - - def get_comments(self, ascending=False): - if ascending: - order = ASCENDING - else: - order = DESCENDING - - return self.db.MediaComment.find({ - 'media_entry': self._id}).sort('created', order) - - def get_display_media(self, media_map, - fetch_order=common.DISPLAY_IMAGE_FETCHING_ORDER): - """ - Find the best media for display. - - Args: - - media_map: a dict like - {u'image_size': [u'dir1', u'dir2', u'image.jpg']} - - fetch_order: the order we should try fetching images in - - Returns: - (media_size, media_path) - """ - media_sizes = media_map.keys() - - for media_size in common.DISPLAY_IMAGE_FETCHING_ORDER: - if media_size in media_sizes: - return media_map[media_size] - - def main_mediafile(self): - pass - - def generate_slug(self): - self.slug = url.slugify(self.title) - - duplicate = mg_globals.database.media_entries.find_one( - {'slug': self.slug}) - - if duplicate: - self.slug = "%s-%s" % (self._id, self.slug) - - def url_for_self(self, urlgen): - """ - Generate an appropriate url for ourselves - - Use a slug if we have one, else use our '_id'. - """ - uploader = self.get_uploader() - - if self.get('slug'): - return urlgen( - 'mediagoblin.user_pages.media_home', - user=uploader.username, - media=self.slug) - else: - return urlgen( - 'mediagoblin.user_pages.media_home', - user=uploader.username, - media=unicode(self._id)) - - def url_to_prev(self, urlgen): - """ - Provide a url to the previous entry from this user, if there is one - """ - cursor = self.db.MediaEntry.find({'_id': {"$gt": self._id}, - 'uploader': self.uploader, - 'state': 'processed'}).sort( - '_id', ASCENDING).limit(1) - if cursor.count(): - return urlgen('mediagoblin.user_pages.media_home', - user=self.get_uploader().username, - media=unicode(cursor[0].slug)) - - def url_to_next(self, urlgen): - """ - Provide a url to the next entry from this user, if there is one - """ - cursor = self.db.MediaEntry.find({'_id': {"$lt": self._id}, - 'uploader': self.uploader, - 'state': 'processed'}).sort( - '_id', DESCENDING).limit(1) - - if cursor.count(): - return urlgen('mediagoblin.user_pages.media_home', - user=self.get_uploader().username, - media=unicode(cursor[0].slug)) - - def get_uploader(self): - return self.db.User.find_one({'_id': self.uploader}) - - def get_fail_exception(self): - """ - Get the exception that's appropriate for this error - """ - if self['fail_error']: - return common.import_component(self['fail_error']) - - -class MediaComment(Document): - """ - A comment on a MediaEntry. - - Structure: - - media_entry: The media entry this comment is attached to - - author: user who posted this comment - - created: when the comment was created - - content: plaintext (but markdown'able) version of the comment's content. - - content_html: the actual html-rendered version of the comment displayed. - Run through Markdown and the HTML cleaner. - """ - - __collection__ = 'media_comments' - use_dot_notation = True - - structure = { - 'media_entry': ObjectId, - 'author': ObjectId, - 'created': datetime.datetime, - 'content': unicode, - 'content_html': unicode} - - required_fields = [ - 'media_entry', 'author', 'created', 'content'] - - default_values = { - 'created': datetime.datetime.utcnow} - - def media_entry(self): - return self.db.MediaEntry.find_one({'_id': self['media_entry']}) - - def author(self): - return self.db.User.find_one({'_id': self['author']}) - - -REGISTER_MODELS = [ - MediaEntry, - User, - MediaComment] - - -def register_models(connection): - """ - Register all models in REGISTER_MODELS with this connection. - """ - connection.register(REGISTER_MODELS) diff --git a/mediagoblin/db/mongo/models.py b/mediagoblin/db/mongo/models.py new file mode 100644 index 00000000..e2ac1b5a --- /dev/null +++ b/mediagoblin/db/mongo/models.py @@ -0,0 +1,363 @@ +# 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 . + +import datetime +import uuid + +from mongokit import Document + +from mediagoblin.auth import lib as auth_lib +from mediagoblin import mg_globals +from mediagoblin.db.mongo import migrations +from mediagoblin.db.mongo.util import ASCENDING, DESCENDING, ObjectId +from mediagoblin.tools.pagination import Pagination +from mediagoblin.tools import url, common + +################### +# Custom validators +################### + +######## +# Models +######## + + +class User(Document): + """ + A user of MediaGoblin. + + Structure: + - username: The username of this user, should be unique to this instance. + - email: Email address of this user + - created: When the user was created + - plugin_data: a mapping of extra plugin information for this User. + Nothing uses this yet as we don't have plugins, but someday we + might... :) + - pw_hash: Hashed version of user's password. + - email_verified: Whether or not the user has verified their email or not. + Most parts of the site are disabled for users who haven't yet. + - status: whether or not the user is active, etc. Currently only has two + values, 'needs_email_verification' or 'active'. (In the future, maybe + we'll change this to a boolean with a key of 'active' and have a + separate field for a reason the user's been disabled if that's + appropriate... email_verified is already separate, after all.) + - verification_key: If the user is awaiting email verification, the user + will have to provide this key (which will be encoded in the presented + URL) in order to confirm their email as active. + - is_admin: Whether or not this user is an administrator or not. + - url: this user's personal webpage/website, if appropriate. + - bio: biography of this user (plaintext, in markdown) + - bio_html: biography of the user converted to proper HTML. + """ + __collection__ = 'users' + use_dot_notation = True + + structure = { + 'username': unicode, + 'email': unicode, + 'created': datetime.datetime, + 'plugin_data': dict, # plugins can dump stuff here. + 'pw_hash': unicode, + 'email_verified': bool, + 'status': unicode, + 'verification_key': unicode, + 'is_admin': bool, + 'url': unicode, + 'bio': unicode, # May contain markdown + 'bio_html': unicode, # May contain plaintext, or HTML + 'fp_verification_key': unicode, # forgotten password verification key + 'fp_token_expire': datetime.datetime, + } + + required_fields = ['username', 'created', 'pw_hash', 'email'] + + default_values = { + 'created': datetime.datetime.utcnow, + 'email_verified': False, + 'status': u'needs_email_verification', + 'verification_key': lambda: unicode(uuid.uuid4()), + 'is_admin': False} + + def check_login(self, password): + """ + See if a user can login with this password + """ + return auth_lib.bcrypt_check_password( + password, self.pw_hash) + + +class MediaEntry(Document): + """ + Record of a piece of media. + + Structure: + - uploader: A reference to a User who uploaded this. + + - title: Title of this work + + - slug: A normalized "slug" which can be used as part of a URL to retrieve + this work, such as 'my-works-name-in-slug-form' may be viewable by + 'http://mg.example.org/u/username/m/my-works-name-in-slug-form/' + Note that since URLs are constructed this way, slugs must be unique + per-uploader. (An index is provided to enforce that but code should be + written on the python side to ensure this as well.) + + - created: Date and time of when this piece of work was uploaded. + + - description: Uploader-set description of this work. This can be marked + up with MarkDown for slight fanciness (links, boldness, italics, + paragraphs...) + + - description_html: Rendered version of the description, run through + Markdown and cleaned with our cleaning tool. + + - media_type: What type of media is this? Currently we only support + 'image' ;) + + - media_data: Extra information that's media-format-dependent. + For example, images might contain some EXIF data that's not appropriate + to other formats. You might store it like: + + mediaentry.media_data['exif'] = { + 'manufacturer': 'CASIO', + 'model': 'QV-4000', + 'exposure_time': .659} + + Alternately for video you might store: + + # play length in seconds + mediaentry.media_data['play_length'] = 340 + + ... so what's appropriate here really depends on the media type. + + - plugin_data: a mapping of extra plugin information for this User. + Nothing uses this yet as we don't have plugins, but someday we + might... :) + + - tags: A list of tags. Each tag is stored as a dictionary that has a key + for the actual name and the normalized name-as-slug, so ultimately this + looks like: + [{'name': 'Gully Gardens', + 'slug': 'gully-gardens'}, + {'name': 'Castle Adventure Time?!", + 'slug': 'castle-adventure-time'}] + + - state: What's the state of this file? Active, inactive, disabled, etc... + But really for now there are only two states: + "unprocessed": uploaded but needs to go through processing for display + "processed": processed and able to be displayed + + - queued_media_file: storage interface style filepath describing a file + queued for processing. This is stored in the mg_globals.queue_store + storage system. + + - queued_task_id: celery task id. Use this to fetch the task state. + + - media_files: Files relevant to this that have actually been processed + and are available for various types of display. Stored like: + {'thumb': ['dir1', 'dir2', 'pic.png'} + + - attachment_files: A list of "attachment" files, ones that aren't + critical to this piece of media but may be usefully relevant to people + viewing the work. (currently unused.) + + - fail_error: path to the exception raised + - fail_metadata: + """ + __collection__ = 'media_entries' + use_dot_notation = True + + structure = { + 'uploader': ObjectId, + 'title': unicode, + 'slug': unicode, + 'created': datetime.datetime, + 'description': unicode, # May contain markdown/up + 'description_html': unicode, # May contain plaintext, or HTML + 'media_type': unicode, + 'media_data': dict, # extra data relevant to this media_type + 'plugin_data': dict, # plugins can dump stuff here. + 'tags': [dict], + 'state': unicode, + + # For now let's assume there can only be one main file queued + # at a time + 'queued_media_file': [unicode], + 'queued_task_id': unicode, + + # A dictionary of logical names to filepaths + 'media_files': dict, + + # The following should be lists of lists, in appropriate file + # record form + 'attachment_files': list, + + # If things go badly in processing things, we'll store that + # data here + 'fail_error': unicode, + 'fail_metadata': dict} + + required_fields = [ + 'uploader', 'created', 'media_type', 'slug'] + + default_values = { + 'created': datetime.datetime.utcnow, + 'state': u'unprocessed'} + + def get_comments(self, ascending=False): + if ascending: + order = ASCENDING + else: + order = DESCENDING + + return self.db.MediaComment.find({ + 'media_entry': self._id}).sort('created', order) + + def get_display_media(self, media_map, + fetch_order=common.DISPLAY_IMAGE_FETCHING_ORDER): + """ + Find the best media for display. + + Args: + - media_map: a dict like + {u'image_size': [u'dir1', u'dir2', u'image.jpg']} + - fetch_order: the order we should try fetching images in + + Returns: + (media_size, media_path) + """ + media_sizes = media_map.keys() + + for media_size in common.DISPLAY_IMAGE_FETCHING_ORDER: + if media_size in media_sizes: + return media_map[media_size] + + def main_mediafile(self): + pass + + def generate_slug(self): + self.slug = url.slugify(self.title) + + duplicate = mg_globals.database.media_entries.find_one( + {'slug': self.slug}) + + if duplicate: + self.slug = "%s-%s" % (self._id, self.slug) + + def url_for_self(self, urlgen): + """ + Generate an appropriate url for ourselves + + Use a slug if we have one, else use our '_id'. + """ + uploader = self.get_uploader() + + if self.get('slug'): + return urlgen( + 'mediagoblin.user_pages.media_home', + user=uploader.username, + media=self.slug) + else: + return urlgen( + 'mediagoblin.user_pages.media_home', + user=uploader.username, + media=unicode(self._id)) + + def url_to_prev(self, urlgen): + """ + Provide a url to the previous entry from this user, if there is one + """ + cursor = self.db.MediaEntry.find({'_id': {"$gt": self._id}, + 'uploader': self.uploader, + 'state': 'processed'}).sort( + '_id', ASCENDING).limit(1) + if cursor.count(): + return urlgen('mediagoblin.user_pages.media_home', + user=self.get_uploader().username, + media=unicode(cursor[0].slug)) + + def url_to_next(self, urlgen): + """ + Provide a url to the next entry from this user, if there is one + """ + cursor = self.db.MediaEntry.find({'_id': {"$lt": self._id}, + 'uploader': self.uploader, + 'state': 'processed'}).sort( + '_id', DESCENDING).limit(1) + + if cursor.count(): + return urlgen('mediagoblin.user_pages.media_home', + user=self.get_uploader().username, + media=unicode(cursor[0].slug)) + + def get_uploader(self): + return self.db.User.find_one({'_id': self.uploader}) + + def get_fail_exception(self): + """ + Get the exception that's appropriate for this error + """ + if self['fail_error']: + return common.import_component(self['fail_error']) + + +class MediaComment(Document): + """ + A comment on a MediaEntry. + + Structure: + - media_entry: The media entry this comment is attached to + - author: user who posted this comment + - created: when the comment was created + - content: plaintext (but markdown'able) version of the comment's content. + - content_html: the actual html-rendered version of the comment displayed. + Run through Markdown and the HTML cleaner. + """ + + __collection__ = 'media_comments' + use_dot_notation = True + + structure = { + 'media_entry': ObjectId, + 'author': ObjectId, + 'created': datetime.datetime, + 'content': unicode, + 'content_html': unicode} + + required_fields = [ + 'media_entry', 'author', 'created', 'content'] + + default_values = { + 'created': datetime.datetime.utcnow} + + def media_entry(self): + return self.db.MediaEntry.find_one({'_id': self['media_entry']}) + + def author(self): + return self.db.User.find_one({'_id': self['author']}) + + +REGISTER_MODELS = [ + MediaEntry, + User, + MediaComment] + + +def register_models(connection): + """ + Register all models in REGISTER_MODELS with this connection. + """ + connection.register(REGISTER_MODELS) diff --git a/mediagoblin/db/mongo/open.py b/mediagoblin/db/mongo/open.py index e677ba12..63889292 100644 --- a/mediagoblin/db/mongo/open.py +++ b/mediagoblin/db/mongo/open.py @@ -17,7 +17,7 @@ import pymongo import mongokit from paste.deploy.converters import asint -from mediagoblin.db import models +from mediagoblin.db.mongo import models def connect_database_from_config(app_config, use_pymongo=False): -- cgit v1.2.3 From c8cb0ee88f8eb667af77c5741cfb04f95afe66b0 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Tue, 20 Dec 2011 22:06:36 +0100 Subject: Polishing the webfinger implementation - Changed quotes in the templates from " to ' - Changed all link generation to use request.urlgen - Moved xrd links data generation from template to view - Added parsing of the account URI using urlparse --- .../templates/mediagoblin/webfinger/host-meta.xml | 12 +- .../templates/mediagoblin/webfinger/xrd.xml | 20 +- mediagoblin/tools/feed.py | 527 +++++++++++++++++++++ mediagoblin/webfinger/views.py | 94 +++- 4 files changed, 623 insertions(+), 30 deletions(-) create mode 100644 mediagoblin/tools/feed.py diff --git a/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml index dff2c9aa..95a1a176 100644 --- a/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml +++ b/mediagoblin/templates/mediagoblin/webfinger/host-meta.xml @@ -14,14 +14,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -#} - - + + {{ request.host }} - - {{ llrd_title }} + + {{ lrdd_title }} diff --git a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml index 9a793637..1fe34577 100644 --- a/mediagoblin/templates/mediagoblin/webfinger/xrd.xml +++ b/mediagoblin/templates/mediagoblin/webfinger/xrd.xml @@ -14,16 +14,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -#} - - + + - {{ request.GET.get('uri') }} - http://{{ request.host }}/u/{{ username }} - - - - + {{ subject }} + {{ alias }} + {% for link in links %} + + {%- endfor %} diff --git a/mediagoblin/tools/feed.py b/mediagoblin/tools/feed.py new file mode 100644 index 00000000..7c14a42a --- /dev/null +++ b/mediagoblin/tools/feed.py @@ -0,0 +1,527 @@ +# 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 . +from lxml import etree +from lxml.builder import ElementMaker +from werkzeug.wrappers import BaseResponse + +import datetime + +""" + Feed engine written for GNU MediaGoblin, + based on werkzeug atom feeds tool (werkzeug.contrib.atom) + + The feed library contains two types of classes: + - Entities that contains the feed data. + - Generators that are injected to the above classes and are able to + generate feeds in a specific format. An atom feed genearator is + provided, but others could be written as well. + + The Werkzeurg library interface have been mimetized, so the replacement can + be done with only switching the import call. + + Example:: + + def atom_feed(request): + feed = AtomFeed("My Blog", feed_url=request.url, + url=request.host_url, + subtitle="My example blog for a feed test.") + for post in Post.query.limit(10).all(): + feed.add(post.title, post.body, content_type='html', + author=post.author, url=post.url, id=post.uid, + updated=post.last_update, published=post.pub_date) + return feed.get_response() +""" + + +## +# Class FeedGenerator +# +class FeedGenerator(object): + def __init__(self): + pass + + def format_iso8601(self, obj): + """Format a datetime object for iso8601""" + return obj.strftime('%Y-%m-%dT%H:%M:%SZ') + + +## +# Class AtomGenerator +# +class AtomGenerator(FeedGenerator): + """ Generator that generate feeds in Atom format """ + NAMESPACE = "http://www.w3.org/2005/Atom" + + def __init__(self): + pass + + def generate(self, data): + """Return an XML tree representation.""" + if isinstance(data, AtomFeed): + return self.generate_feed(data) + elif isinstance(data, FeedEntry): + return self.generate_feedEntry(data) + + def generate_text_block(self, name, content, content_type=None): + """Helper method for the builder that creates an XML text block.""" + root = etree.Element(name) + + if content_type: + root.set('type', content_type) + + if content_type == 'xhtml': + div_ele = etree.Element('div') + div_ele.set('xmlns', XHTML_NAMESPACE) + div_ele.text = content + root.append(div_ele) + else: + root.text = content + + return root + + def generate_feed(self, data): + """Return an XML tree representation of the feed.""" + NSMAP = {None: self.NAMESPACE} + root = etree.Element("feed", nsmap=NSMAP) + + E = ElementMaker() + + # atom demands either an author element in every entry or a global one + if not data.author: + if False in map(lambda e: bool(e.author), data.entries): + data.author = ({'name': 'Unknown author'},) + + if not data.updated: + dates = sorted([entry.updated for entry in data.entries]) + data.updated = dates and dates[-1] or datetime.utcnow() + + title_ele = self.generate_text_block( + 'title', + data.title, + data.title_type) + root.append(title_ele) + + root.append(E.id(data.id)) + root.append(E.updated(self.format_iso8601(data.updated))) + + if data.url: + link_ele = etree.Element("link") + link_ele.set("href", data.url) + root.append(link_ele) + + if data.feed_url: + link_ele = etree.Element("link") + link_ele.set("href", data.feed_url) + link_ele.set("rel", "self") + root.append(link_ele) + + for link in data.links: + link_ele = etree.Element("link") + for name, value in link.items(): + link_ele.set(name, value) + root.append(link_ele) + + for author in data.author: + author_element = etree.Element("author") + author_element.append(E.name(author['name'])) + if 'uri' in author: + author_element.append(E.name(author['uri'])) + if 'email' in author: + author_element.append(E.name(author['email'])) + + root.append(author_element) + + if data.subtitle: + root.append(self.generate_text_block('subtitle', data.subtitle, + data.subtitle_type)) + if data.icon: + root.append(E.icon(data.icon)) + + if data.logo: + root.append(E.logo(data.logo)) + + if data.rights: + root.append(self.generate_text_block('rights', data.rights, + data.rights_type)) + + generator_name, generator_url, generator_version = data.generator + if generator_name or generator_url or generator_version: + generator_ele = etree.Element("generator") + if generator_url: + generator_ele.set("uri", generator_url, True) + if generator_version: + generator_ele.set("version", generator_version) + + generator_ele.text = generator_name + + root.append(generator_ele) + + for entry in data.entries: + root.append(entry.generate()) + + return root + + def generate_feedEntry(self, data): + """Return an XML tree representation of the feed entry.""" + E = ElementMaker() + root = etree.Element("entry") + + if data.xml_base: + root.base = data.xml_base + + title_ele = self.generate_text_block( + 'title', + data.title, + data.title_type) + root.append(title_ele) + + root.append(E.id(data.id)) + root.append(E.updated(self.format_iso8601(data.updated))) + + if data.published: + root.append(E.published(self.format_iso8601(data.published))) + + if data.url: + link_ele = etree.Element("link") + link_ele.set("href", data.url) + root.append(link_ele) + + for author in data.author: + author_element = etree.Element("author") + author_element.append(E.name(author['name'])) + if 'uri' in author: + author_element.append(E.name(author['uri'])) + if 'email' in author: + author_element.append(E.name(author['email'])) + + root.append(author_element) + + for link in data.links: + link_ele = etree.Element("link") + for name, value in link.items(): + link_ele.set(name, value) + root.append(link_ele) + + print data.thumbnail + + if data.thumbnail: + namespace = "http://search.yahoo.com/mrss/" + nsmap = {"media": namespace} + thumbnail_ele = etree.Element( + "{http://search.yahoo.com/mrss/}thumbnail", nsmap=nsmap) + thumbnail_ele.set("url", data.thumbnail) + + root.append(thumbnail_ele) + + if data.summary: + summary_ele = self.generate_text_block('summary', data.summary, + data.summary_type) + root.append(summary_ele) + + if data.content: + content = data.content + + if data.thumbnail: + thumbnail_html = etree.Element("img") + thumbnail_html.set("src", data.thumbnail) + content = etree.tostring(thumbnail_html) + content + + content_ele = self.generate_text_block('content', content, + data.content_type) + root.append(content_ele) + + for name, value in data.custom.items(): + element = etree.Element(name) + element.text = value + root.append(element) + + return root + + +## +# Class AtomFeed +# +class AtomFeed(object): + """ + A helper class that contains feeds. By default, it uses the AtomGenerator + but others could be injected. It has the AtomFeed name to keep the name + it had on werkzeug library + + Following Werkzeurg implementation, the constructor takes a lot of + parameters. As an addition, the class will also store custom parameters for + fields not explicitly supported by the library. + + :param feed_generator: The generator that will be used to generate the feed + defaults to AtomGenerator + :param title: the title of the feed. Required. + :param title_type: the type attribute for the title element. One of + ``'html'``, ``'text'`` or ``'xhtml'``. + :param url: the url for the feed (not the url *of* the feed) + :param id: a globally unique id for the feed. Must be an URI. If + not present the `feed_url` is used, but one of both is + required. + :param updated: the time the feed was modified the last time. Must + be a :class:`datetime.datetime` object. If not + present the latest entry's `updated` is used. + :param feed_url: the URL to the feed. Should be the URL that was + requested. + :param author: the author of the feed. Must be either a string (the + name) or a dict with name (required) and uri or + email (both optional). Can be a list of (may be + mixed, too) strings and dicts, too, if there are + multiple authors. Required if not every entry has an + author element. + :param icon: an icon for the feed. + :param logo: a logo for the feed. + :param rights: copyright information for the feed. + :param rights_type: the type attribute for the rights element. One of + ``'html'``, ``'text'`` or ``'xhtml'``. Default is + ``'text'``. + :param subtitle: a short description of the feed. + :param subtitle_type: the type attribute for the subtitle element. + One of ``'text'``, ``'html'``, ``'text'`` + or ``'xhtml'``. Default is ``'text'``. + :param links: additional links. Must be a list of dictionaries with + href (required) and rel, type, hreflang, title, length + (all optional) + :param generator: the software that generated this feed. This must be + a tuple in the form ``(name, url, version)``. If + you don't want to specify one of them, set the item + to `None`. + :param entries: a list with the entries for the feed. Entries can also + be added later with :meth:`add`. + + For more information on the elements see + http://www.atomenabled.org/developers/syndication/ + + Everywhere where a list is demanded, any iterable can be used. + """ + + default_generator = ('GNU Mediagoblin', None, None) + default_feed_generator = AtomGenerator() + + def __init__(self, title=None, entries=None, feed_generator=None, + **kwargs): + self.feed_generator = feed_generator + self.title = title + self.title_type = kwargs.get('title_type', 'text') + self.url = kwargs.get('url') + self.feed_url = kwargs.get('feed_url', self.url) + self.id = kwargs.get('id', self.feed_url) + self.updated = kwargs.get('updated') + self.author = kwargs.get('author', ()) + self.icon = kwargs.get('icon') + self.logo = kwargs.get('logo') + self.rights = kwargs.get('rights') + self.rights_type = kwargs.get('rights_type') + self.subtitle = kwargs.get('subtitle') + self.subtitle_type = kwargs.get('subtitle_type', 'text') + self.generator = kwargs.get('generator') + if self.generator is None: + self.generator = self.default_generator + self.links = kwargs.get('links', []) + self.entries = entries and list(entries) or [] + + if not hasattr(self.author, '__iter__') \ + or isinstance(self.author, (basestring, dict)): + self.author = [self.author] + for i, author in enumerate(self.author): + if not isinstance(author, dict): + self.author[i] = {'name': author} + + if not self.feed_generator: + self.feed_generator = self.default_feed_generator + if not self.title: + raise ValueError('title is required') + if not self.id: + raise ValueError('id is required') + for author in self.author: + if 'name' not in author: + raise TypeError('author must contain at least a name') + + # Look for arguments that we haven't matched with object members. + # They will be added to the custom dictionary. + # This way we can have custom fields not specified in this class. + self.custom = {} + properties = dir(self) + + for name, value in kwargs.items(): + if (properties.count(name) == 0): + self.custom[name] = value + + def add(self, *args, **kwargs): + """Add a new entry to the feed. This function can either be called + with a :class:`FeedEntry` or some keyword and positional arguments + that are forwarded to the :class:`FeedEntry` constructor. + """ + if len(args) == 1 and not kwargs and isinstance(args[0], FeedEntry): + args[0].generator = self.generator + self.entries.append(args[0]) + else: + kwargs['feed_url'] = self.feed_url + self.entries.append(FeedEntry(feed_generator=self.feed_generator, + *args, **kwargs)) + + def __repr__(self): + return '<%s %r (%d entries)>' % ( + self.__class__.__name__, + self.title, + len(self.entries) + ) + + def generate(self): + """Return an XML tree representation of the feed.""" + return self.feed_generator.generate(self) + + def to_string(self): + """Convert the feed into a string.""" + return etree.tostring(self.generate(), encoding='UTF-8') + + def get_response(self): + """Return a response object for the feed.""" + return BaseResponse(self.to_string(), mimetype='application/atom+xml') + + def __call__(self, environ, start_response): + """Use the class as WSGI response object.""" + return self.get_response()(environ, start_response) + + def __unicode__(self): + return self.to_string() + + def __str__(self): + return self.to_string().encode('utf-8') + + +## +# Class FeedEntry +# +class FeedEntry(object): + """Represents a single entry in a feed. + + Following Werkzeurg implementation, the constructor takes a lot of + parameters. As an addition, the class will also store custom parameters for + fields not explicitly supported by the library. + + :param feed_generator: The generator that will be used to generate the feed. + defaults to AtomGenerator + :param title: the title of the entry. Required. + :param title_type: the type attribute for the title element. One of + ``'html'``, ``'text'`` or ``'xhtml'``. + :param content: the content of the entry. + :param content_type: the type attribute for the content element. One + of ``'html'``, ``'text'`` or ``'xhtml'``. + :param summary: a summary of the entry's content. + :param summary_type: the type attribute for the summary element. One + of ``'html'``, ``'text'`` or ``'xhtml'``. + :param url: the url for the entry. + :param id: a globally unique id for the entry. Must be an URI. If + not present the URL is used, but one of both is required. + :param updated: the time the entry was modified the last time. Must + be a :class:`datetime.datetime` object. Required. + :param author: the author of the feed. Must be either a string (the + name) or a dict with name (required) and uri or + email (both optional). Can be a list of (may be + mixed, too) strings and dicts, too, if there are + multiple authors. Required if not every entry has an + author element. + :param published: the time the entry was initially published. Must + be a :class:`datetime.datetime` object. + :param rights: copyright information for the entry. + :param rights_type: the type attribute for the rights element. One of + ``'html'``, ``'text'`` or ``'xhtml'``. Default is + ``'text'``. + :param links: additional links. Must be a list of dictionaries with + href (required) and rel, type, hreflang, title, length + (all optional) + :param xml_base: The xml base (url) for this feed item. If not provided + it will default to the item url. + + For more information on the elements see + http://www.atomenabled.org/developers/syndication/ + + Everywhere where a list is demanded, any iterable can be used. + """ + + default_feed_generator = AtomGenerator() + + def __init__(self, title=None, content=None, feed_url=None, + feed_generator=None, **kwargs): + self.feed_generator = feed_generator + self.title = title + self.title_type = kwargs.get('title_type', 'text') + self.content = content + self.content_type = kwargs.get('content_type', 'html') + self.url = kwargs.get('url') + self.id = kwargs.get('id', self.url) + self.updated = kwargs.get('updated') + self.summary = kwargs.get('summary') + self.summary_type = kwargs.get('summary_type', 'html') + self.author = kwargs.get('author') + self.published = kwargs.get('published') + self.rights = kwargs.get('rights') + self.links = kwargs.get('links', []) + self.xml_base = kwargs.get('xml_base', feed_url) + self.thumbnail = kwargs.get('thumbnail') + + + if not hasattr(self.author, '__iter__') \ + or isinstance(self.author, (basestring, dict)): + self.author = [self.author] + for i, author in enumerate(self.author): + if not isinstance(author, dict): + self.author[i] = {'name': author} + + if not self.feed_generator: + self.feed_generator = self.default_feed_generator + if not self.title: + raise ValueError('title is required') + if not self.id: + raise ValueError('id is required') + if not self.updated: + raise ValueError('updated is required') + + # Look for arguments that we haven't matched with object members. + # They will be added to the custom dictionary. + # This way we can have custom fields not specified in this class. + self.custom = {} + properties = dir(self) + + for name, value in kwargs.items(): + if ( properties.count(name) == 0 ): + self.custom[name] = value + + + def __repr__(self): + return '<%s %r>' % ( + self.__class__.__name__, + self.title + ) + + def generate(self): + """Returns lxml element tree representation of the feed entry""" + return self.feed_generator.generate(self) + + def to_string(self): + """Convert the feed item into a unicode object.""" + return etree.tostring(self.generate(), encoding='utf-8') + + def __unicode__(self): + return self.to_string() + + def __str__(self): + return self.to_string().encode('utf-8') + + diff --git a/mediagoblin/webfinger/views.py b/mediagoblin/webfinger/views.py index 7cbd0913..e9aa600c 100644 --- a/mediagoblin/webfinger/views.py +++ b/mediagoblin/webfinger/views.py @@ -15,32 +15,100 @@ # along with this program. If not, see . import re -import mediagoblin.mg_globals as mg_globals -from mediagoblin.tools.response import render_to_response +from urlparse import urlparse -LRDD_TEMPLATE = '{protocol}://{host}/api/webfinger/xrd?uri={{uri}}' +from mediagoblin.tools.response import render_to_response, render_404 def host_meta(request): ''' Webfinger host-meta ''' + + placeholder = 'MG_LRDD_PLACEHOLDER' + + lrdd_title = 'GNU MediaGoblin - User lookup' + + lrdd_template = request.urlgen( + 'mediagoblin.webfinger.xrd', + uri=placeholder, + qualified=True) + return render_to_response( request, 'mediagoblin/webfinger/host-meta.xml', {'request': request, - 'lrdd_template': LRDD_TEMPLATE.format( - protocol='http', - host=request.host)}) + 'lrdd_template': lrdd_template, + 'lrdd_title': lrdd_title, + 'placeholder': placeholder}) + +MATCH_SCHEME_PATTERN = re.compile(r'^acct:') def xrd(request): ''' Find user data based on a webfinger URI ''' - return render_to_response( - request, - 'mediagoblin/webfinger/xrd.xml', - {'request': request, - 'username': re.search( - r'^(acct:)?([^@]*)', - request.GET.get('uri')).group(2)}) + param_uri = request.GET.get('uri') + + if not param_uri: + return render_404(request) + + ''' + :py:module:`urlparse` does not recognize usernames in URIs of the + form ``acct:user@example.org`` or ``user@example.org``. + ''' + if not MATCH_SCHEME_PATTERN.search(param_uri): + # Assume the URI is in the form ``user@example.org`` + uri = 'acct://' + param_uri + else: + # Assumes the URI looks like ``acct:user@example.org + uri = MATCH_SCHEME_PATTERN.sub( + 'acct://', param_uri) + + parsed = urlparse(uri) + + xrd_subject = param_uri + + # TODO: Verify that the user exists + # Q: Does webfinger support error handling in this case? + # Returning 404 seems intuitive, need to check. + if parsed.username: + # The user object + # TODO: Fetch from database instead of using the MockUser + user = MockUser() + user.username = parsed.username + + xrd_links = [ + {'attrs': { + 'rel': 'http://microformats.org/profile/hcard', + 'href': request.urlgen( + 'mediagoblin.user_pages.user_home', + user=user.username, + qualified=True)}}, + {'attrs': { + 'rel': 'http://schemas.google.com/g/2010#updates-from', + 'href': request.urlgen( + 'mediagoblin.user_pages.atom_feed', + user=user.username, + qualified=True)}}] + + xrd_alias = request.urlgen( + 'mediagoblin.user_pages.user_home', + user=user.username, + qualified=True) + + return render_to_response( + request, + 'mediagoblin/webfinger/xrd.xml', + {'request': request, + 'subject': xrd_subject, + 'alias': xrd_alias, + 'links': xrd_links }) + else: + return render_404(request) + +class MockUser(object): + ''' + TEMPORARY user object + ''' + username = None -- cgit v1.2.3 From 448a58534f585aac95db9d04f43d73634e96eb4b Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Tue, 20 Dec 2011 22:13:43 +0100 Subject: Removed mediagoblin.tools.feed which was accidentally included --- mediagoblin/tools/feed.py | 527 ---------------------------------------------- 1 file changed, 527 deletions(-) delete mode 100644 mediagoblin/tools/feed.py diff --git a/mediagoblin/tools/feed.py b/mediagoblin/tools/feed.py deleted file mode 100644 index 7c14a42a..00000000 --- a/mediagoblin/tools/feed.py +++ /dev/null @@ -1,527 +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 . -from lxml import etree -from lxml.builder import ElementMaker -from werkzeug.wrappers import BaseResponse - -import datetime - -""" - Feed engine written for GNU MediaGoblin, - based on werkzeug atom feeds tool (werkzeug.contrib.atom) - - The feed library contains two types of classes: - - Entities that contains the feed data. - - Generators that are injected to the above classes and are able to - generate feeds in a specific format. An atom feed genearator is - provided, but others could be written as well. - - The Werkzeurg library interface have been mimetized, so the replacement can - be done with only switching the import call. - - Example:: - - def atom_feed(request): - feed = AtomFeed("My Blog", feed_url=request.url, - url=request.host_url, - subtitle="My example blog for a feed test.") - for post in Post.query.limit(10).all(): - feed.add(post.title, post.body, content_type='html', - author=post.author, url=post.url, id=post.uid, - updated=post.last_update, published=post.pub_date) - return feed.get_response() -""" - - -## -# Class FeedGenerator -# -class FeedGenerator(object): - def __init__(self): - pass - - def format_iso8601(self, obj): - """Format a datetime object for iso8601""" - return obj.strftime('%Y-%m-%dT%H:%M:%SZ') - - -## -# Class AtomGenerator -# -class AtomGenerator(FeedGenerator): - """ Generator that generate feeds in Atom format """ - NAMESPACE = "http://www.w3.org/2005/Atom" - - def __init__(self): - pass - - def generate(self, data): - """Return an XML tree representation.""" - if isinstance(data, AtomFeed): - return self.generate_feed(data) - elif isinstance(data, FeedEntry): - return self.generate_feedEntry(data) - - def generate_text_block(self, name, content, content_type=None): - """Helper method for the builder that creates an XML text block.""" - root = etree.Element(name) - - if content_type: - root.set('type', content_type) - - if content_type == 'xhtml': - div_ele = etree.Element('div') - div_ele.set('xmlns', XHTML_NAMESPACE) - div_ele.text = content - root.append(div_ele) - else: - root.text = content - - return root - - def generate_feed(self, data): - """Return an XML tree representation of the feed.""" - NSMAP = {None: self.NAMESPACE} - root = etree.Element("feed", nsmap=NSMAP) - - E = ElementMaker() - - # atom demands either an author element in every entry or a global one - if not data.author: - if False in map(lambda e: bool(e.author), data.entries): - data.author = ({'name': 'Unknown author'},) - - if not data.updated: - dates = sorted([entry.updated for entry in data.entries]) - data.updated = dates and dates[-1] or datetime.utcnow() - - title_ele = self.generate_text_block( - 'title', - data.title, - data.title_type) - root.append(title_ele) - - root.append(E.id(data.id)) - root.append(E.updated(self.format_iso8601(data.updated))) - - if data.url: - link_ele = etree.Element("link") - link_ele.set("href", data.url) - root.append(link_ele) - - if data.feed_url: - link_ele = etree.Element("link") - link_ele.set("href", data.feed_url) - link_ele.set("rel", "self") - root.append(link_ele) - - for link in data.links: - link_ele = etree.Element("link") - for name, value in link.items(): - link_ele.set(name, value) - root.append(link_ele) - - for author in data.author: - author_element = etree.Element("author") - author_element.append(E.name(author['name'])) - if 'uri' in author: - author_element.append(E.name(author['uri'])) - if 'email' in author: - author_element.append(E.name(author['email'])) - - root.append(author_element) - - if data.subtitle: - root.append(self.generate_text_block('subtitle', data.subtitle, - data.subtitle_type)) - if data.icon: - root.append(E.icon(data.icon)) - - if data.logo: - root.append(E.logo(data.logo)) - - if data.rights: - root.append(self.generate_text_block('rights', data.rights, - data.rights_type)) - - generator_name, generator_url, generator_version = data.generator - if generator_name or generator_url or generator_version: - generator_ele = etree.Element("generator") - if generator_url: - generator_ele.set("uri", generator_url, True) - if generator_version: - generator_ele.set("version", generator_version) - - generator_ele.text = generator_name - - root.append(generator_ele) - - for entry in data.entries: - root.append(entry.generate()) - - return root - - def generate_feedEntry(self, data): - """Return an XML tree representation of the feed entry.""" - E = ElementMaker() - root = etree.Element("entry") - - if data.xml_base: - root.base = data.xml_base - - title_ele = self.generate_text_block( - 'title', - data.title, - data.title_type) - root.append(title_ele) - - root.append(E.id(data.id)) - root.append(E.updated(self.format_iso8601(data.updated))) - - if data.published: - root.append(E.published(self.format_iso8601(data.published))) - - if data.url: - link_ele = etree.Element("link") - link_ele.set("href", data.url) - root.append(link_ele) - - for author in data.author: - author_element = etree.Element("author") - author_element.append(E.name(author['name'])) - if 'uri' in author: - author_element.append(E.name(author['uri'])) - if 'email' in author: - author_element.append(E.name(author['email'])) - - root.append(author_element) - - for link in data.links: - link_ele = etree.Element("link") - for name, value in link.items(): - link_ele.set(name, value) - root.append(link_ele) - - print data.thumbnail - - if data.thumbnail: - namespace = "http://search.yahoo.com/mrss/" - nsmap = {"media": namespace} - thumbnail_ele = etree.Element( - "{http://search.yahoo.com/mrss/}thumbnail", nsmap=nsmap) - thumbnail_ele.set("url", data.thumbnail) - - root.append(thumbnail_ele) - - if data.summary: - summary_ele = self.generate_text_block('summary', data.summary, - data.summary_type) - root.append(summary_ele) - - if data.content: - content = data.content - - if data.thumbnail: - thumbnail_html = etree.Element("img") - thumbnail_html.set("src", data.thumbnail) - content = etree.tostring(thumbnail_html) + content - - content_ele = self.generate_text_block('content', content, - data.content_type) - root.append(content_ele) - - for name, value in data.custom.items(): - element = etree.Element(name) - element.text = value - root.append(element) - - return root - - -## -# Class AtomFeed -# -class AtomFeed(object): - """ - A helper class that contains feeds. By default, it uses the AtomGenerator - but others could be injected. It has the AtomFeed name to keep the name - it had on werkzeug library - - Following Werkzeurg implementation, the constructor takes a lot of - parameters. As an addition, the class will also store custom parameters for - fields not explicitly supported by the library. - - :param feed_generator: The generator that will be used to generate the feed - defaults to AtomGenerator - :param title: the title of the feed. Required. - :param title_type: the type attribute for the title element. One of - ``'html'``, ``'text'`` or ``'xhtml'``. - :param url: the url for the feed (not the url *of* the feed) - :param id: a globally unique id for the feed. Must be an URI. If - not present the `feed_url` is used, but one of both is - required. - :param updated: the time the feed was modified the last time. Must - be a :class:`datetime.datetime` object. If not - present the latest entry's `updated` is used. - :param feed_url: the URL to the feed. Should be the URL that was - requested. - :param author: the author of the feed. Must be either a string (the - name) or a dict with name (required) and uri or - email (both optional). Can be a list of (may be - mixed, too) strings and dicts, too, if there are - multiple authors. Required if not every entry has an - author element. - :param icon: an icon for the feed. - :param logo: a logo for the feed. - :param rights: copyright information for the feed. - :param rights_type: the type attribute for the rights element. One of - ``'html'``, ``'text'`` or ``'xhtml'``. Default is - ``'text'``. - :param subtitle: a short description of the feed. - :param subtitle_type: the type attribute for the subtitle element. - One of ``'text'``, ``'html'``, ``'text'`` - or ``'xhtml'``. Default is ``'text'``. - :param links: additional links. Must be a list of dictionaries with - href (required) and rel, type, hreflang, title, length - (all optional) - :param generator: the software that generated this feed. This must be - a tuple in the form ``(name, url, version)``. If - you don't want to specify one of them, set the item - to `None`. - :param entries: a list with the entries for the feed. Entries can also - be added later with :meth:`add`. - - For more information on the elements see - http://www.atomenabled.org/developers/syndication/ - - Everywhere where a list is demanded, any iterable can be used. - """ - - default_generator = ('GNU Mediagoblin', None, None) - default_feed_generator = AtomGenerator() - - def __init__(self, title=None, entries=None, feed_generator=None, - **kwargs): - self.feed_generator = feed_generator - self.title = title - self.title_type = kwargs.get('title_type', 'text') - self.url = kwargs.get('url') - self.feed_url = kwargs.get('feed_url', self.url) - self.id = kwargs.get('id', self.feed_url) - self.updated = kwargs.get('updated') - self.author = kwargs.get('author', ()) - self.icon = kwargs.get('icon') - self.logo = kwargs.get('logo') - self.rights = kwargs.get('rights') - self.rights_type = kwargs.get('rights_type') - self.subtitle = kwargs.get('subtitle') - self.subtitle_type = kwargs.get('subtitle_type', 'text') - self.generator = kwargs.get('generator') - if self.generator is None: - self.generator = self.default_generator - self.links = kwargs.get('links', []) - self.entries = entries and list(entries) or [] - - if not hasattr(self.author, '__iter__') \ - or isinstance(self.author, (basestring, dict)): - self.author = [self.author] - for i, author in enumerate(self.author): - if not isinstance(author, dict): - self.author[i] = {'name': author} - - if not self.feed_generator: - self.feed_generator = self.default_feed_generator - if not self.title: - raise ValueError('title is required') - if not self.id: - raise ValueError('id is required') - for author in self.author: - if 'name' not in author: - raise TypeError('author must contain at least a name') - - # Look for arguments that we haven't matched with object members. - # They will be added to the custom dictionary. - # This way we can have custom fields not specified in this class. - self.custom = {} - properties = dir(self) - - for name, value in kwargs.items(): - if (properties.count(name) == 0): - self.custom[name] = value - - def add(self, *args, **kwargs): - """Add a new entry to the feed. This function can either be called - with a :class:`FeedEntry` or some keyword and positional arguments - that are forwarded to the :class:`FeedEntry` constructor. - """ - if len(args) == 1 and not kwargs and isinstance(args[0], FeedEntry): - args[0].generator = self.generator - self.entries.append(args[0]) - else: - kwargs['feed_url'] = self.feed_url - self.entries.append(FeedEntry(feed_generator=self.feed_generator, - *args, **kwargs)) - - def __repr__(self): - return '<%s %r (%d entries)>' % ( - self.__class__.__name__, - self.title, - len(self.entries) - ) - - def generate(self): - """Return an XML tree representation of the feed.""" - return self.feed_generator.generate(self) - - def to_string(self): - """Convert the feed into a string.""" - return etree.tostring(self.generate(), encoding='UTF-8') - - def get_response(self): - """Return a response object for the feed.""" - return BaseResponse(self.to_string(), mimetype='application/atom+xml') - - def __call__(self, environ, start_response): - """Use the class as WSGI response object.""" - return self.get_response()(environ, start_response) - - def __unicode__(self): - return self.to_string() - - def __str__(self): - return self.to_string().encode('utf-8') - - -## -# Class FeedEntry -# -class FeedEntry(object): - """Represents a single entry in a feed. - - Following Werkzeurg implementation, the constructor takes a lot of - parameters. As an addition, the class will also store custom parameters for - fields not explicitly supported by the library. - - :param feed_generator: The generator that will be used to generate the feed. - defaults to AtomGenerator - :param title: the title of the entry. Required. - :param title_type: the type attribute for the title element. One of - ``'html'``, ``'text'`` or ``'xhtml'``. - :param content: the content of the entry. - :param content_type: the type attribute for the content element. One - of ``'html'``, ``'text'`` or ``'xhtml'``. - :param summary: a summary of the entry's content. - :param summary_type: the type attribute for the summary element. One - of ``'html'``, ``'text'`` or ``'xhtml'``. - :param url: the url for the entry. - :param id: a globally unique id for the entry. Must be an URI. If - not present the URL is used, but one of both is required. - :param updated: the time the entry was modified the last time. Must - be a :class:`datetime.datetime` object. Required. - :param author: the author of the feed. Must be either a string (the - name) or a dict with name (required) and uri or - email (both optional). Can be a list of (may be - mixed, too) strings and dicts, too, if there are - multiple authors. Required if not every entry has an - author element. - :param published: the time the entry was initially published. Must - be a :class:`datetime.datetime` object. - :param rights: copyright information for the entry. - :param rights_type: the type attribute for the rights element. One of - ``'html'``, ``'text'`` or ``'xhtml'``. Default is - ``'text'``. - :param links: additional links. Must be a list of dictionaries with - href (required) and rel, type, hreflang, title, length - (all optional) - :param xml_base: The xml base (url) for this feed item. If not provided - it will default to the item url. - - For more information on the elements see - http://www.atomenabled.org/developers/syndication/ - - Everywhere where a list is demanded, any iterable can be used. - """ - - default_feed_generator = AtomGenerator() - - def __init__(self, title=None, content=None, feed_url=None, - feed_generator=None, **kwargs): - self.feed_generator = feed_generator - self.title = title - self.title_type = kwargs.get('title_type', 'text') - self.content = content - self.content_type = kwargs.get('content_type', 'html') - self.url = kwargs.get('url') - self.id = kwargs.get('id', self.url) - self.updated = kwargs.get('updated') - self.summary = kwargs.get('summary') - self.summary_type = kwargs.get('summary_type', 'html') - self.author = kwargs.get('author') - self.published = kwargs.get('published') - self.rights = kwargs.get('rights') - self.links = kwargs.get('links', []) - self.xml_base = kwargs.get('xml_base', feed_url) - self.thumbnail = kwargs.get('thumbnail') - - - if not hasattr(self.author, '__iter__') \ - or isinstance(self.author, (basestring, dict)): - self.author = [self.author] - for i, author in enumerate(self.author): - if not isinstance(author, dict): - self.author[i] = {'name': author} - - if not self.feed_generator: - self.feed_generator = self.default_feed_generator - if not self.title: - raise ValueError('title is required') - if not self.id: - raise ValueError('id is required') - if not self.updated: - raise ValueError('updated is required') - - # Look for arguments that we haven't matched with object members. - # They will be added to the custom dictionary. - # This way we can have custom fields not specified in this class. - self.custom = {} - properties = dir(self) - - for name, value in kwargs.items(): - if ( properties.count(name) == 0 ): - self.custom[name] = value - - - def __repr__(self): - return '<%s %r>' % ( - self.__class__.__name__, - self.title - ) - - def generate(self): - """Returns lxml element tree representation of the feed entry""" - return self.feed_generator.generate(self) - - def to_string(self): - """Convert the feed item into a unicode object.""" - return etree.tostring(self.generate(), encoding='utf-8') - - def __unicode__(self): - return self.to_string() - - def __str__(self): - return self.to_string().encode('utf-8') - - -- cgit v1.2.3 From 85c916919b1e1fe31472feac74f8c216a5df608f Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Tue, 20 Dec 2011 22:55:13 +0100 Subject: Added references to docstring in mediagoblin.webfinger and mediagoblin.webfinger.views [references mediagoblin.webfinger] --- mediagoblin/webfinger/__init__.py | 10 ++++++++++ mediagoblin/webfinger/views.py | 3 +++ 2 files changed, 13 insertions(+) diff --git a/mediagoblin/webfinger/__init__.py b/mediagoblin/webfinger/__init__.py index ba347c69..ec7ec884 100644 --- a/mediagoblin/webfinger/__init__.py +++ b/mediagoblin/webfinger/__init__.py @@ -13,3 +13,13 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +''' +mediagoblin.webfinger_ provides an LRDD discovery service and +a web host meta information file + +Links: +- `LRDD Discovery Draft + `_. +- `RFC 6415 - Web Host Metadata + `_. +''' diff --git a/mediagoblin/webfinger/views.py b/mediagoblin/webfinger/views.py index e9aa600c..22086396 100644 --- a/mediagoblin/webfinger/views.py +++ b/mediagoblin/webfinger/views.py @@ -13,6 +13,9 @@ # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +''' +For references, see docstring in mediagoblin/webfinger/__init__.py +''' import re -- cgit v1.2.3 From 871fc591dd2492d2bdca0a530fdffac14f3feece Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 21 Dec 2011 00:06:38 +0100 Subject: Workaround for Routes/urlgen bug. This is relevant for fcgi: Some servers (cherokee for example) put "HTTP":"off" in the environ. And the following code in urlgen breaks on this: if environ.get('HTTPS') or environ.get('wsgi.url_scheme') == 'https' \ or environ.get('HTTP_X_FORWARDED_PROTO') == 'https': hostinfo['protocol'] = 'https' workaround is to remove HTTPS:off from the environ. --- mediagoblin/app.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mediagoblin/app.py b/mediagoblin/app.py index 04eb2acc..49dc8d97 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -122,6 +122,10 @@ class MediaGoblinApp(object): # The other option would be: # request.full_path = environ["SCRIPT_URL"] + # Fix up environ for urlgen + if environ.get('HTTPS', '').lower() == 'off': + environ.pop('HTTPS') + ## Attach utilities to the request object request.matchdict = route_match request.urlgen = routes.URLGenerator(self.routing, environ) -- cgit v1.2.3 From d23d4b23dad2e14e330664f58994dcbbbaa32720 Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 21 Dec 2011 00:34:02 +0100 Subject: Note reported bug in workaround So that the workaround can eventually be removed, note the URL for the relevant bug in a comment. --- mediagoblin/app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mediagoblin/app.py b/mediagoblin/app.py index 49dc8d97..96b2c8ab 100644 --- a/mediagoblin/app.py +++ b/mediagoblin/app.py @@ -123,6 +123,7 @@ class MediaGoblinApp(object): # request.full_path = environ["SCRIPT_URL"] # Fix up environ for urlgen + # See bug: https://bitbucket.org/bbangert/routes/issue/55/cache_hostinfo-breaks-on-https-off if environ.get('HTTPS', '').lower() == 'off': environ.pop('HTTPS') -- cgit v1.2.3 From 6c191eb3de3bbaf3880ef270461422954554683a Mon Sep 17 00:00:00 2001 From: Karen Rustad Date: Sun, 18 Dec 2011 22:50:36 -0800 Subject: Added a 'you don't have HTML5 so this video will not work' warning using just the inherent properties of the
    -- cgit v1.2.3 From fb7dd855de987d4e3dded1e55cad09a9fe6120cc Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 18 Dec 2011 22:52:49 +0100 Subject: Turn MediaComment's author() into get_author property 1) MediaComment's author method conflicts with the author field. So rename it to get_author. 2) Turn it from a normal function into a python property. That means you call it by ".get_author" not by ".get_author()". This is exactly what sqlalchemy gives us free of charge. --- mediagoblin/db/mongo/models.py | 3 ++- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mediagoblin/db/mongo/models.py b/mediagoblin/db/mongo/models.py index e2ac1b5a..0e31fc1c 100644 --- a/mediagoblin/db/mongo/models.py +++ b/mediagoblin/db/mongo/models.py @@ -346,7 +346,8 @@ class MediaComment(Document): def media_entry(self): return self.db.MediaEntry.find_one({'_id': self['media_entry']}) - def author(self): + @property + def get_author(self): return self.db.User.find_one({'_id': self['author']}) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index b9e31667..c171dd5a 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -109,7 +109,7 @@ {% endif %} {% if comments %} {% for comment in comments %} - {% set comment_author = comment.author() %} + {% set comment_author = comment.get_author %} {% if pagination.active_id == comment._id %}
    -- cgit v1.2.3 From 2608982885477e2f41579240d24a26864f718123 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 24 Dec 2011 19:08:20 +0100 Subject: Add search level one() method And create a _fix_query_dict which converts '_id' to 'id'. --- mediagoblin/db/sql/base.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mediagoblin/db/sql/base.py b/mediagoblin/db/sql/base.py index b8d5cc96..38b04334 100644 --- a/mediagoblin/db/sql/base.py +++ b/mediagoblin/db/sql/base.py @@ -4,13 +4,26 @@ from sqlalchemy.orm import scoped_session, sessionmaker Session = scoped_session(sessionmaker()) +def _fix_query_dict(query_dict): + if '_id' in query_dict: + query_dict['id'] = query_dict.pop('_id') + + class GMGTableBase(object): query = Session.query_property() @classmethod def find(cls, query_dict={}): + _fix_query_dict(query_dict) return cls.query.filter_by(**query_dict) @classmethod def find_one(cls, query_dict={}): + _fix_query_dict(query_dict) return cls.query.filter_by(**query_dict).first() + + @classmethod + def one(cls, query_dict): + retval = cls.find_one(query_dict) + assert retval is not None + return retval -- cgit v1.2.3 From 4305580e8538e5523e9f621c3ffbed14a2ddc350 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 24 Dec 2011 18:19:40 +0100 Subject: Improve .one() by using sqlalchemy's .one() --- mediagoblin/db/sql/base.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mediagoblin/db/sql/base.py b/mediagoblin/db/sql/base.py index 38b04334..5e420bdc 100644 --- a/mediagoblin/db/sql/base.py +++ b/mediagoblin/db/sql/base.py @@ -24,6 +24,4 @@ class GMGTableBase(object): @classmethod def one(cls, query_dict): - retval = cls.find_one(query_dict) - assert retval is not None - return retval + return cls.find(query_dict).one() -- cgit v1.2.3 From 4deda94a380dc4217247b49df6e8a5bce0082ddc Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 19 Dec 2011 22:29:40 +0100 Subject: Replace media.get_uploader()._id by media.uploader media.get_uploader()._id loads a complete user object without actually needing it, because media.uploader already has the id! --- mediagoblin/decorators.py | 6 +++--- mediagoblin/user_pages/views.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mediagoblin/decorators.py b/mediagoblin/decorators.py index 229664d7..4cf14a70 100644 --- a/mediagoblin/decorators.py +++ b/mediagoblin/decorators.py @@ -57,10 +57,10 @@ def user_may_delete_media(controller): Require user ownership of the MediaEntry to delete. """ def wrapper(request, *args, **kwargs): - uploader = request.db.MediaEntry.find_one( - {'_id': ObjectId(request.matchdict['media'])}).get_uploader() + uploader_id = request.db.MediaEntry.find_one( + {'_id': ObjectId(request.matchdict['media'])}).uploader if not (request.user.is_admin or - request.user._id == uploader._id): + request.user._id == uploader_id): return exc.HTTPForbidden() return controller(request, *args, **kwargs) diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 87b82c74..449e3b1c 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -192,7 +192,7 @@ def media_confirm_delete(request, media): location=media.url_for_self(request.urlgen)) if ((request.user.is_admin and - request.user._id != media.get_uploader()._id)): + request.user._id != media.uploader)): messages.add_message( request, messages.WARNING, _("You are about to delete another user's media. " -- cgit v1.2.3 From 0c0ab3227430b3d55ce9d19b37a01cd2a3c90259 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 25 Dec 2011 19:58:37 +0100 Subject: Translate one string "There doesn't seem to be any media here yet..." is now translated also here (it's already in the list from another place). --- mediagoblin/templates/mediagoblin/utils/object_gallery.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/utils/object_gallery.html b/mediagoblin/templates/mediagoblin/utils/object_gallery.html index 65ff09a4..b8155f03 100644 --- a/mediagoblin/templates/mediagoblin/utils/object_gallery.html +++ b/mediagoblin/templates/mediagoblin/utils/object_gallery.html @@ -68,7 +68,11 @@ {% endif %} {% else %}

    - There doesn't seem to be any media here yet... + + {%- trans -%} + There doesn't seem to be any media here yet... + {%- endtrans -%} +

    {% endif %} {% endmacro %} -- cgit v1.2.3 From 479e8a833ba502c976574af77181f60a2a660aec Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 25 Dec 2011 20:11:09 +0100 Subject: Move verification key generation to view Instead of creating the email verication key on the db model as a default for the field, create it in the registration view. Now all verification key generation is only in auth/views.py! --- mediagoblin/auth/views.py | 1 + mediagoblin/db/mongo/models.py | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 919aa3cd..66178371 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -84,6 +84,7 @@ def register(request): user.email = email user.pw_hash = auth_lib.bcrypt_gen_password_hash( request.POST['password']) + user.verification_key = unicode(uuid.uuid4()) user.save(validate=True) # log the user in diff --git a/mediagoblin/db/mongo/models.py b/mediagoblin/db/mongo/models.py index 0e31fc1c..b068fb06 100644 --- a/mediagoblin/db/mongo/models.py +++ b/mediagoblin/db/mongo/models.py @@ -15,7 +15,6 @@ # along with this program. If not, see . import datetime -import uuid from mongokit import Document @@ -88,7 +87,6 @@ class User(Document): 'created': datetime.datetime.utcnow, 'email_verified': False, 'status': u'needs_email_verification', - 'verification_key': lambda: unicode(uuid.uuid4()), 'is_admin': False} def check_login(self, password): -- cgit v1.2.3 From 0eb649ff7ac3f1eb71eb1d2cb66019a860b2c5c7 Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 20 Dec 2011 18:47:33 +0100 Subject: Use media.url_for_self instead of calling urlgen directly Replace urlgen('ID', user=media.get_uploader().username, media=media.*) by media.url_for_self(urlgen) in a few places. It's just a lot nicer! --- mediagoblin/db/mongo/models.py | 12 ++++-------- mediagoblin/templates/mediagoblin/user_pages/media.html | 6 ++---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/mediagoblin/db/mongo/models.py b/mediagoblin/db/mongo/models.py index b068fb06..8cd0da1b 100644 --- a/mediagoblin/db/mongo/models.py +++ b/mediagoblin/db/mongo/models.py @@ -282,10 +282,8 @@ class MediaEntry(Document): 'uploader': self.uploader, 'state': 'processed'}).sort( '_id', ASCENDING).limit(1) - if cursor.count(): - return urlgen('mediagoblin.user_pages.media_home', - user=self.get_uploader().username, - media=unicode(cursor[0].slug)) + for media in cursor: + return media.url_for_self(urlgen) def url_to_next(self, urlgen): """ @@ -296,10 +294,8 @@ class MediaEntry(Document): 'state': 'processed'}).sort( '_id', DESCENDING).limit(1) - if cursor.count(): - return urlgen('mediagoblin.user_pages.media_home', - user=self.get_uploader().username, - media=unicode(cursor[0].slug)) + for media in cursor: + return media.url_for_self(urlgen) def get_uploader(self): return self.db.User.find_one({'_id': self.uploader}) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index c171dd5a..77461983 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -135,10 +135,8 @@
    {% endfor %} - {{ render_pagination(request, pagination, - request.urlgen('mediagoblin.user_pages.media_home', - user = media.get_uploader().username, - media = media._id)) }} + {{ render_pagination(request, pagination, + media.url_for_self(request.urlgen)) }} {% endif %}
    -- cgit v1.2.3 From 05751758469a03835975dd2998aa727fa29c9a16 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 24 Dec 2011 00:08:28 +0100 Subject: Turn media.get_uploader into a property sqlalchemy gives autoloading (hopefully caching) link to other objects as properties. So turn get_uploader on the current mongo based stuff into a property to ease transition. --- mediagoblin/db/mongo/models.py | 3 ++- mediagoblin/listings/views.py | 2 +- mediagoblin/templates/mediagoblin/edit/attachments.html | 2 +- mediagoblin/templates/mediagoblin/edit/edit.html | 2 +- mediagoblin/templates/mediagoblin/user_pages/media.html | 14 +++++++------- .../mediagoblin/user_pages/media_confirm_delete.html | 2 +- mediagoblin/user_pages/views.py | 2 +- 7 files changed, 14 insertions(+), 13 deletions(-) diff --git a/mediagoblin/db/mongo/models.py b/mediagoblin/db/mongo/models.py index 8cd0da1b..5de59c12 100644 --- a/mediagoblin/db/mongo/models.py +++ b/mediagoblin/db/mongo/models.py @@ -261,7 +261,7 @@ class MediaEntry(Document): Use a slug if we have one, else use our '_id'. """ - uploader = self.get_uploader() + uploader = self.get_uploader if self.get('slug'): return urlgen( @@ -297,6 +297,7 @@ class MediaEntry(Document): for media in cursor: return media.url_for_self(urlgen) + @property def get_uploader(self): return self.db.User.find_one({'_id': self.uploader}) diff --git a/mediagoblin/listings/views.py b/mediagoblin/listings/views.py index 6b83ffcf..3ecf06f4 100644 --- a/mediagoblin/listings/views.py +++ b/mediagoblin/listings/views.py @@ -86,7 +86,7 @@ def tag_atom_feed(request): feed.add(entry.get('title'), entry.get('description_html'), content_type='html', - author=entry.get_uploader().username, + author=entry.get_uploader.username, updated=entry.get('created'), url=entry.url_for_self(request.urlgen)) diff --git a/mediagoblin/templates/mediagoblin/edit/attachments.html b/mediagoblin/templates/mediagoblin/edit/attachments.html index 6a5ab896..124d0313 100644 --- a/mediagoblin/templates/mediagoblin/edit/attachments.html +++ b/mediagoblin/templates/mediagoblin/edit/attachments.html @@ -20,7 +20,7 @@ {% import "/mediagoblin/utils/wtforms.html" as wtforms_util %} {% block mediagoblin_content %}
    diff --git a/mediagoblin/templates/mediagoblin/edit/edit.html b/mediagoblin/templates/mediagoblin/edit/edit.html index aa46af3d..2dfaddc8 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit.html +++ b/mediagoblin/templates/mediagoblin/edit/edit.html @@ -22,7 +22,7 @@ {% block mediagoblin_content %}
    diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 77461983..13fa1baa 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -72,11 +72,11 @@ {% if media['uploader'] == request.user._id or request.user['is_admin'] %} {% set edit_url = request.urlgen('mediagoblin.edit.edit_media', - user= media.get_uploader().username, + user= media.get_uploader.username, media= media._id) %} {% trans %}Edit{% endtrans %} {% set delete_url = request.urlgen('mediagoblin.user_pages.media_confirm_delete', - user= media.get_uploader().username, + user= media.get_uploader.username, media= media._id) %} {% trans %}Delete{% endtrans %} {% endif %} @@ -95,7 +95,7 @@ {# 0 comments. Be the first to add one! #} {% if request.user %}

    {% trans %}Type your comment here. You can use Markdown for formatting.{% endtrans %} @@ -128,7 +128,7 @@ {% trans %}at{% endtrans %} {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }} @@ -142,8 +142,8 @@

    {% trans user_url=request.urlgen( 'mediagoblin.user_pages.user_home', - user=media.get_uploader().username), - username=media.get_uploader().username -%} + user=media.get_uploader.username), + username=media.get_uploader.username -%}

    ❖ Browsing media by {{ username }}

    {%- endtrans %} {% include "mediagoblin/utils/prev_next.html" %} @@ -164,7 +164,7 @@ or request.user.is_admin) %}

    Add attachment

    {% endif %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html index 7c7218ae..6c483769 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html @@ -22,7 +22,7 @@ {% block mediagoblin_content %}
    diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index 449e3b1c..f721f012 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -173,7 +173,7 @@ def media_confirm_delete(request, media): if request.method == 'POST' and form.validate(): if form.confirm.data is True: - username = media.get_uploader().username + username = media.get_uploader.username # Delete all files on the public storage delete_media_files(media) -- cgit v1.2.3 From 19ed039ba6d65cecfd6e8ad6e47b5cb008350b04 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 25 Dec 2011 20:03:11 +0100 Subject: Implement _id proxy on sql objects (on User for now) So that the old code can access the primary key still as "._id". Quite simple Python Descriptor thing. Very generic. --- mediagoblin/db/sql/models.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py index b87ff3aa..68b078a5 100644 --- a/mediagoblin/db/sql/models.py +++ b/mediagoblin/db/sql/models.py @@ -11,6 +11,18 @@ from mediagoblin.db.sql.base import GMGTableBase Base = declarative_base(cls=GMGTableBase) +class SimpleFieldAlias(object): + """An alias for any field""" + def __init__(self, fieldname): + self.fieldname = fieldname + + def __get__(self, instance, cls): + return getattr(instance, self.fieldname) + + def __set__(self, instance, val): + setattr(instance, self.fieldname, val) + + class User(Base): __tablename__ = "users" @@ -32,6 +44,8 @@ class User(Base): ## TODO # plugin data would be in a separate model + _id = SimpleFieldAlias("id") + class MediaEntry(Base): __tablename__ = "media_entries" -- cgit v1.2.3 From c6263400cfd334a820122bd1b22eaa4d4d6765cd Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 24 Dec 2011 18:12:38 +0100 Subject: SQL Model: Forgot MediaEntry.state field While creating the new SQL model, the "state" field of MediaEntry was left out. Currently using a plain unicode string for it. Maybe should use sqlalchemy.types.Enum? --- mediagoblin/db/sql/convert.py | 2 +- mediagoblin/db/sql/models.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py index 6de758ed..c6bed1e9 100644 --- a/mediagoblin/db/sql/convert.py +++ b/mediagoblin/db/sql/convert.py @@ -62,7 +62,7 @@ def convert_media_entries(mk_db): copy_attrs(entry, new_entry, ('title', 'slug', 'created', 'description', 'description_html', - 'media_type', + 'media_type', 'state', 'fail_error', 'queued_task_id',)) copy_reference_attr(entry, new_entry, "uploader") diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py index 68b078a5..268f5715 100644 --- a/mediagoblin/db/sql/models.py +++ b/mediagoblin/db/sql/models.py @@ -58,6 +58,7 @@ class MediaEntry(Base): description = Column(UnicodeText) # ?? description_html = Column(UnicodeText) # ?? media_type = Column(Unicode, nullable=False) + state = Column(Unicode, nullable=False) # or use sqlalchemy.types.Enum? fail_error = Column(Unicode) fail_metadata = Column(UnicodeText) -- cgit v1.2.3 From 88e90f41eb86b8aa1fcfef1e0585f314afb5180d Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 24 Dec 2011 16:00:05 +0100 Subject: SQL Model: Add relationship properties MediaEntry now has a get_uploader (property) loading the appropiate User object for the MediaEntry (and caches it). MediaComment has the same for author as get_author. --- mediagoblin/db/sql/models.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py index 268f5715..31a6ed3b 100644 --- a/mediagoblin/db/sql/models.py +++ b/mediagoblin/db/sql/models.py @@ -4,6 +4,7 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import ( Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey, UniqueConstraint) +from sqlalchemy.orm import relationship from mediagoblin.db.sql.base import GMGTableBase @@ -71,6 +72,8 @@ class MediaEntry(Base): UniqueConstraint('uploader', 'slug'), {}) + get_uploader = relationship(User) + ## TODO # media_files # media_data @@ -112,6 +115,8 @@ class MediaComment(Base): content = Column(UnicodeText, nullable=False) content_html = Column(UnicodeText) + get_author = relationship(User) + def show_table_init(): from sqlalchemy import create_engine -- cgit v1.2.3 From 0724930a6880ea9a088785480cfa7803d43a6370 Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 28 Dec 2011 23:27:46 +0100 Subject: Show --log-file option in lazyserver help. --- lazyserver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lazyserver.sh b/lazyserver.sh index 4ca073b5..843993e6 100755 --- a/lazyserver.sh +++ b/lazyserver.sh @@ -26,7 +26,7 @@ then echo "" echo " For example:" echo " $0 -c fcgi.ini port_number=23371" - echo " or: $0 --server-name=fcgi" + echo " or: $0 --server-name=fcgi --log-file=paste.log" echo "" echo " The configfile defaults to paste_local.ini," echo " if that is readable, otherwise paste.ini." -- cgit v1.2.3 From 690672580e333bb6a2dc67466390847a79566045 Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 28 Dec 2011 23:46:36 +0100 Subject: Fix "bin/gmg migrate" after mongo move When moving most stuff from db to db/mongo, "gmg migrate" was left out. Fix it now! --- mediagoblin/gmg_commands/migrate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/gmg_commands/migrate.py b/mediagoblin/gmg_commands/migrate.py index bd3bcb20..0a8ee7dc 100644 --- a/mediagoblin/gmg_commands/migrate.py +++ b/mediagoblin/gmg_commands/migrate.py @@ -16,12 +16,12 @@ import sys -from mediagoblin.db import util as db_util +from mediagoblin.db.mongo import util as db_util from mediagoblin.db.open import setup_connection_and_db_from_config from mediagoblin.init import setup_global_and_app_config # This MUST be imported so as to set up the appropriate migrations! -from mediagoblin.db import migrations +from mediagoblin.db.mongo import migrations def migrate_parser_setup(subparser): -- cgit v1.2.3 From 03c22862322f42a68351e70956e24e512028f0b2 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 25 Dec 2011 16:01:25 +0100 Subject: Support .get(fieldname) on sql db objects Some parts of the code like to call .get("somefield") on the db objects. It's easy to support this on sqlalchemy based objects, so lets do it. --- mediagoblin/db/sql/base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mediagoblin/db/sql/base.py b/mediagoblin/db/sql/base.py index 5e420bdc..1249bace 100644 --- a/mediagoblin/db/sql/base.py +++ b/mediagoblin/db/sql/base.py @@ -25,3 +25,6 @@ class GMGTableBase(object): @classmethod def one(cls, query_dict): return cls.find(query_dict).one() + + def get(self, key): + return getattr(self, key) -- cgit v1.2.3 From 9f264942d88c563f9d310c3fea4a554731c1bbbc Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 25 Dec 2011 19:09:23 +0100 Subject: Add a .save method on the sql db objects This is a shortcut to adding the object to a session (if needed) and giving a commit on the session. In reality, calling code should probably utilize the session on its own and call commit in an appropiate place. --- mediagoblin/db/sql/base.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mediagoblin/db/sql/base.py b/mediagoblin/db/sql/base.py index 1249bace..40140327 100644 --- a/mediagoblin/db/sql/base.py +++ b/mediagoblin/db/sql/base.py @@ -1,4 +1,4 @@ -from sqlalchemy.orm import scoped_session, sessionmaker +from sqlalchemy.orm import scoped_session, sessionmaker, object_session Session = scoped_session(sessionmaker()) @@ -28,3 +28,11 @@ class GMGTableBase(object): def get(self, key): return getattr(self, key) + + def save(self, validate = True): + assert validate + sess = object_session(self) + if sess is None: + sess = Session() + sess.add(self) + sess.commit() -- cgit v1.2.3 From dab1d70280652049078add60c6c44f675fbe267c Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 29 Dec 2011 22:40:45 +0100 Subject: Finished #485 and worked out bugs: password fields always update, added margins, fixed Chrome width bug, wrapped checkbox in label element --- mediagoblin/static/css/base.css | 5 +++++ mediagoblin/templates/mediagoblin/auth/register.html | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 625269a2..ecdd0474 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -251,6 +251,11 @@ textarea#comment_content { text-align: right; } +#password_boolean { + margin-top: 4px; + width: 20px; +} + /* comments */ .comment_author { diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html index bded1d7e..73eae0d8 100644 --- a/mediagoblin/templates/mediagoblin/auth/register.html +++ b/mediagoblin/templates/mediagoblin/auth/register.html @@ -22,7 +22,7 @@ {% block mediagoblin_head %} {% endblock mediagoblin_head %} -- cgit v1.2.3 From 4e9d467fc0b3dfc55db15e84d5d988cefa400fa1 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 29 Dec 2011 22:54:31 +0100 Subject: Isolate JavaScript; add new show_password.js to forgot-password-page as well --- mediagoblin/auth/forms.py | 8 +------- .../templates/mediagoblin/auth/change_fp.html | 5 +++++ .../templates/mediagoblin/auth/register.html | 23 ++-------------------- 3 files changed, 8 insertions(+), 28 deletions(-) diff --git a/mediagoblin/auth/forms.py b/mediagoblin/auth/forms.py index 4cd3e9d8..5a707c7b 100644 --- a/mediagoblin/auth/forms.py +++ b/mediagoblin/auth/forms.py @@ -62,13 +62,7 @@ class ChangePassForm(wtforms.Form): password = wtforms.PasswordField( 'Password', [wtforms.validators.Required(), - wtforms.validators.Length(min=6, max=30), - wtforms.validators.EqualTo( - 'confirm_password', - 'Passwords must match.')]) - confirm_password = wtforms.PasswordField( - 'Confirm password', - [wtforms.validators.Required()]) + wtforms.validators.Length(min=6, max=30)]) userid = wtforms.HiddenField( '', [wtforms.validators.Required()]) diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html index 03a6583b..e8e64023 100644 --- a/mediagoblin/templates/mediagoblin/auth/change_fp.html +++ b/mediagoblin/templates/mediagoblin/auth/change_fp.html @@ -19,6 +19,11 @@ {% import "/mediagoblin/utils/wtforms.html" as wtforms_util %} +{% block mediagoblin_head %} + +{% endblock mediagoblin_head %} + {% block mediagoblin_content %} - $(document).ready(function(){ - $("#password").after(''); - $('#password_clear').hide(); - $('#password_boolean').click(function(){ - if($('#password_boolean').prop("checked")) { - $('#password_clear').val($('#password').val()); - $('#password').hide(); - $('#password_clear').show(); - } else { - $('#password').val($('#password_clear').val()); - $('#password_clear').hide(); - $('#password').show(); - }; - }); - $('#password,#password_clear').keyup(function(){ - $('#password').val($(this).val()); - $('#password_clear').val($(this).val()); - }); - }); - + {% endblock mediagoblin_head %} {% block mediagoblin_content %} -- cgit v1.2.3 From 550d48d04059d94894573d93aed98f4faa63e3fb Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 29 Dec 2011 22:56:42 +0100 Subject: Forgot to include the newly created JS file --- mediagoblin/static/js/show_password.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mediagoblin/static/js/show_password.js diff --git a/mediagoblin/static/js/show_password.js b/mediagoblin/static/js/show_password.js new file mode 100644 index 00000000..519b29c1 --- /dev/null +++ b/mediagoblin/static/js/show_password.js @@ -0,0 +1,19 @@ +$(document).ready(function(){ + $("#password").after(''); + $('#password_clear').hide(); + $('#password_boolean').click(function(){ + if($('#password_boolean').prop("checked")) { + $('#password_clear').val($('#password').val()); + $('#password').hide(); + $('#password_clear').show(); + } else { + $('#password').val($('#password_clear').val()); + $('#password_clear').hide(); + $('#password').show(); + }; + }); + $('#password,#password_clear').keyup(function(){ + $('#password').val($(this).val()); + $('#password_clear').val($(this).val()); + }); +}); -- cgit v1.2.3 From 3ea6a305ce2addc8c2d6322f0d9bdca957bd972c Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 30 Dec 2011 14:23:12 +0100 Subject: Lots of little fixes and removal of all 960.gs classes: * Removed

    margin-top * Vertically align logo so Add-media button does not fall off * Remove last 960.gs traces (grid_X/container_X) and add custom classes/sizes to css * Add clear class * Update form_box and add form_box_xl for bigger forms * Switch all pages that use forms to new classes * Remove padding from notification messages so they take full width * Other tiny fixes I forgot about --- mediagoblin/static/css/base.css | 60 +++++++++++++++++----- mediagoblin/templates/mediagoblin/404.html | 19 +++---- .../templates/mediagoblin/auth/change_fp.html | 6 +-- .../mediagoblin/auth/forgot_password.html | 2 +- mediagoblin/templates/mediagoblin/auth/login.html | 2 +- .../templates/mediagoblin/auth/register.html | 2 +- .../templates/mediagoblin/edit/attachments.html | 2 +- mediagoblin/templates/mediagoblin/edit/edit.html | 2 +- .../templates/mediagoblin/edit/edit_profile.html | 2 +- .../templates/mediagoblin/listings/tag.html | 13 ++--- mediagoblin/templates/mediagoblin/root.html | 28 +++++----- .../templates/mediagoblin/submit/start.html | 2 +- .../templates/mediagoblin/user_pages/gallery.html | 16 +++--- .../user_pages/media_confirm_delete.html | 2 +- .../templates/mediagoblin/user_pages/user.html | 16 +++--- .../templates/mediagoblin/utils/prev_next.html | 46 ++++++++--------- 16 files changed, 115 insertions(+), 105 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 187d1c7a..e8924edf 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -44,24 +44,28 @@ form { /* text styles */ -h1{ +h1 { margin-bottom: 15px; margin-top: 15px; color: #fff; font-size: 1.875em; } -h2{ +h2 { font-size: 1.375em; margin-top: 20px; color: #fff; } -h3{ +h3 { border-bottom: 1px solid #333; font-size: 1.125em; } +p { + margin-top: 0px; +} + a { color: #86D4B1; } @@ -103,12 +107,16 @@ input, textarea { float: right; } -a.mediagoblin_logo{ +a.mediagoblin_logo { color: #fff; font-weight: bold; margin-right: 8px; } +.mediagoblin_logo img { + vertical-align: middle; +} + .mediagoblin_content { width: 940px; margin-left: 10px; @@ -143,6 +151,18 @@ a.mediagoblin_logo{ float: left; } +.profile_sidebar { + width: 340px; + margin-right: 10px; + float: left; +} + +.profile_showcase { + width: 580px; + margin-left: 10px; + float: left; +} + /* common website elements */ .button_action, .button_action_highlight { @@ -219,28 +239,33 @@ text-align: center; float: right; } -textarea#comment_content { - width: 634px; - height: 90px; - border: none; - background-color: #f1f1f1; - padding: 3px; +.clear { + clear: both; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; } /* forms */ -.form_box { +.form_box,.form_box_xl { background-color: #222; background-image: url("../images/background_lines.png"); background-repeat: repeat-x; - padding-bottom: 30px; - padding-top: 30px; + width: 340px; + padding: 30px 60px; margin-left: auto; margin-right: auto; display: block; float: none; } +.form_box_xl { + width: 460px; +} + .edit_box { background-image: url("../images/background_edit.png"); } @@ -294,6 +319,14 @@ textarea#comment_content { margin-bottom: 0px; } +textarea#comment_content { + width: 634px; + height: 90px; + border: none; + background-color: #f1f1f1; + padding: 3px; +} + /* media galleries */ .media_thumbnail { @@ -358,6 +391,7 @@ img.media_icon { ul.mediagoblin_messages { list-style: none inside; color: #f7f7f7; + padding: 0; } .mediagoblin_messages li { diff --git a/mediagoblin/templates/mediagoblin/404.html b/mediagoblin/templates/mediagoblin/404.html index 7db68941..392c14f5 100644 --- a/mediagoblin/templates/mediagoblin/404.html +++ b/mediagoblin/templates/mediagoblin/404.html @@ -18,17 +18,12 @@ {% extends "mediagoblin/base.html" %} {% block mediagoblin_content %} + {% trans %}Image of 404 goblin stressing out{% endtrans %}

    {% trans %}Oops!{% endtrans %}

    - -
    -

    {% trans %}There doesn't seem to be a page at this address. Sorry!{% endtrans %}

    -

    - {%- trans %}If you're sure the address is correct, maybe the page you're looking for has been moved or deleted.{% endtrans -%} -

    -
    - -
    - {% trans %}Image of 404 goblin stressing out{% endtrans %} -
    +

    {% trans %}There doesn't seem to be a page at this address. Sorry!{% endtrans %}

    +

    + {%- trans %}If you're sure the address is correct, maybe the page you're looking for has been moved or deleted.{% endtrans -%} +

    +
    {% endblock %} diff --git a/mediagoblin/templates/mediagoblin/auth/change_fp.html b/mediagoblin/templates/mediagoblin/auth/change_fp.html index 03a6583b..9c8c79bf 100644 --- a/mediagoblin/templates/mediagoblin/auth/change_fp.html +++ b/mediagoblin/templates/mediagoblin/auth/change_fp.html @@ -20,19 +20,15 @@ {% import "/mediagoblin/utils/wtforms.html" as wtforms_util %} {% block mediagoblin_content %} - {{ csrf_token }} - -
    +

    {% trans %}Set your new password{% endtrans %}

    - {{ wtforms_util.render_divs(cp_form) }}
    -
    {% endblock %} diff --git a/mediagoblin/templates/mediagoblin/auth/forgot_password.html b/mediagoblin/templates/mediagoblin/auth/forgot_password.html index 41940742..672e9d9a 100644 --- a/mediagoblin/templates/mediagoblin/auth/forgot_password.html +++ b/mediagoblin/templates/mediagoblin/auth/forgot_password.html @@ -23,7 +23,7 @@
    {{ csrf_token }} -
    +

    {% trans %}Recover password{% endtrans %}

    {{ wtforms_util.render_divs(fp_form) }}
    diff --git a/mediagoblin/templates/mediagoblin/auth/login.html b/mediagoblin/templates/mediagoblin/auth/login.html index c3807e5f..993790eb 100644 --- a/mediagoblin/templates/mediagoblin/auth/login.html +++ b/mediagoblin/templates/mediagoblin/auth/login.html @@ -23,7 +23,7 @@ {{ csrf_token }} -
    +

    {% trans %}Log in{% endtrans %}

    {% if login_failed %}
    diff --git a/mediagoblin/templates/mediagoblin/auth/register.html b/mediagoblin/templates/mediagoblin/auth/register.html index bded1d7e..2520ca9b 100644 --- a/mediagoblin/templates/mediagoblin/auth/register.html +++ b/mediagoblin/templates/mediagoblin/auth/register.html @@ -43,7 +43,7 @@ -
    +

    {% trans %}Create an account!{% endtrans %}

    {{ wtforms_util.render_divs(register_form) }} {{ csrf_token }} diff --git a/mediagoblin/templates/mediagoblin/edit/attachments.html b/mediagoblin/templates/mediagoblin/edit/attachments.html index 6a5ab896..ff357a8c 100644 --- a/mediagoblin/templates/mediagoblin/edit/attachments.html +++ b/mediagoblin/templates/mediagoblin/edit/attachments.html @@ -23,7 +23,7 @@ user= media.get_uploader().username, media= media._id) }}" method="POST" enctype="multipart/form-data"> -
    +

    Editing attachments for {{ media.title }}

    -
    +

    {% trans media_title=media.title %}Editing {{ media_title }}{% endtrans %}

    -
    +

    {%- trans username=user.username -%} Editing {{ username }}'s profile diff --git a/mediagoblin/templates/mediagoblin/listings/tag.html b/mediagoblin/templates/mediagoblin/listings/tag.html index f797f72f..a7cbe241 100644 --- a/mediagoblin/templates/mediagoblin/listings/tag.html +++ b/mediagoblin/templates/mediagoblin/listings/tag.html @@ -35,14 +35,9 @@ {% trans %}Media tagged with: {{ tag_name }}{% endtrans %}

    - + {{ object_gallery(request, media_entries, pagination) }} -
    - {% set feed_url = request.urlgen( - 'mediagoblin.listings.tag_atom_feed', - tag=tag_slug) %} - {% include "mediagoblin/utils/feed_link.html" %} -
    + {% set feed_url = request.urlgen('mediagoblin.listings.tag_atom_feed', + tag=tag_slug) %} + {% include "mediagoblin/utils/feed_link.html" %} {% endblock %} diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html index 0f769f2f..300570ad 100644 --- a/mediagoblin/templates/mediagoblin/root.html +++ b/mediagoblin/templates/mediagoblin/root.html @@ -23,22 +23,18 @@ {% if request.user %}

    {% trans %}Explore{% endtrans %}

    {% else %} -
    -

    {% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}

    -

    {% trans %}This site is running MediaGoblin, an extraordinarily great piece of media hosting software.{% endtrans %}

    -

    {% trans %}To add your own media, place comments, save your favourites and more, you can log in with your MediaGoblin account.{% endtrans %}

    - {% if allow_registration %} -

    {% trans %}Don't have one yet? It's easy!{% endtrans %}

    - {% trans register_url=request.urlgen('mediagoblin.auth.register') -%} - Create an account at this site - or - Set up MediaGoblin on your own server - {%- endtrans %} - {% endif %} -
    -
    - -
    + +

    {% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}

    +

    {% trans %}This site is running MediaGoblin, an extraordinarily great piece of media hosting software.{% endtrans %}

    +

    {% trans %}To add your own media, place comments, save your favourites and more, you can log in with your MediaGoblin account.{% endtrans %}

    + {% if allow_registration %} +

    {% trans %}Don't have one yet? It's easy!{% endtrans %}

    + {% trans register_url=request.urlgen('mediagoblin.auth.register') -%} + Create an account at this site + or + Set up MediaGoblin on your own server + {%- endtrans %} + {% endif %}
    {% endif %}

    {% trans %}Most recent media{% endtrans %}

    diff --git a/mediagoblin/templates/mediagoblin/submit/start.html b/mediagoblin/templates/mediagoblin/submit/start.html index 47914550..afae2f1f 100644 --- a/mediagoblin/templates/mediagoblin/submit/start.html +++ b/mediagoblin/templates/mediagoblin/submit/start.html @@ -22,7 +22,7 @@ {% block mediagoblin_content %} -
    +

    {% trans %}Add your media{% endtrans %}

    {{ wtforms_util.render_divs(submit_form) }}
    diff --git a/mediagoblin/templates/mediagoblin/user_pages/gallery.html b/mediagoblin/templates/mediagoblin/user_pages/gallery.html index b066dd71..b0bfacf8 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/gallery.html +++ b/mediagoblin/templates/mediagoblin/user_pages/gallery.html @@ -42,14 +42,10 @@ {%- endtrans %}

    - - -
    - {% set feed_url = request.urlgen( - 'mediagoblin.user_pages.atom_feed', - user=user.username) %} - {% include "mediagoblin/utils/feed_link.html" %} -
    + {{ object_gallery(request, media_entries, pagination) }} + + {% set feed_url = request.urlgen('mediagoblin.user_pages.atom_feed', + user=user.username) %} + {% include "mediagoblin/utils/feed_link.html" %} + {% endblock %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html index 7c7218ae..8e0f2904 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html @@ -25,7 +25,7 @@ user=media.get_uploader().username, media=media._id) }}" method="POST" enctype="multipart/form-data"> -
    +

    {%- trans title=media.title -%} Really delete {{ title }}? diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index b952e88c..8a1d3a76 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -46,7 +46,7 @@ {% elif user.status == "needs_email_verification" %} {% if user == request.user %} {# this should only be visible when you are this user #} -
    +

    {% trans %}Email verification needed{% endtrans %}

    @@ -66,7 +66,7 @@

    {% else %} {# if the user is not you, but still needs to verify their email #} -
    +

    {% trans %}Email verification needed{% endtrans %}

    @@ -91,7 +91,7 @@ {% if not user.url and not user.bio %} {% if request.user._id == user._id %} -

    +

    {% trans %}Here's a spot to tell others about yourself.{% endtrans %}

    @@ -102,7 +102,7 @@
    {% else %} -
    +

    {% trans -%} This user hasn't filled in their profile (yet). @@ -111,7 +111,7 @@

    {% endif %} {% else %} -
    +
    {% include "mediagoblin/utils/profile.html" %} {% if request.user._id == user._id or request.user.is_admin %} +
    {{ object_gallery(request, media_entries, pagination, pagination_base_url=user_gallery_url, col_number=3) }} {% include "mediagoblin/utils/object_gallery.html" %} @@ -141,7 +141,7 @@
    {% else %} {% if request.user._id == user._id %} -
    + {% else %} -
    +

    {% trans -%} There doesn't seem to be any media here yet... diff --git a/mediagoblin/templates/mediagoblin/utils/prev_next.html b/mediagoblin/templates/mediagoblin/utils/prev_next.html index b0c01963..66766555 100644 --- a/mediagoblin/templates/mediagoblin/utils/prev_next.html +++ b/mediagoblin/templates/mediagoblin/utils/prev_next.html @@ -21,28 +21,26 @@ {% set next_entry_url = media.url_to_next(request.urlgen) %} {% if prev_entry_url or next_entry_url %} -

    - {# There are no previous entries for the very first media entry #} - {% if prev_entry_url %} - - ← {% trans %}newer{% endtrans %} - - {% else %} - {# This is the first entry. display greyed-out 'previous' image #} - - {% endif %} - {# Likewise, this could be the very last media entry #} - {% if next_entry_url %} - - {% trans %}older{% endtrans %} → - - {% else %} - {# This is the last entry. display greyed-out 'next' image #} - - {% endif %} -
    + {# There are no previous entries for the very first media entry #} + {% if prev_entry_url %} + + ← {% trans %}newer{% endtrans %} + + {% else %} + {# This is the first entry. display greyed-out 'previous' image #} + + {% endif %} + {# Likewise, this could be the very last media entry #} + {% if next_entry_url %} + + {% trans %}older{% endtrans %} → + + {% else %} + {# This is the last entry. display greyed-out 'next' image #} + + {% endif %} {% endif %} -- cgit v1.2.3 From 426808cc8fe4961e938bc8f6df10ea755980e6c1 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 30 Dec 2011 18:01:28 +0100 Subject: Random changes that break stuff and eat piglets --- mediagoblin/static/css/base.css | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index e8924edf..8ed94e36 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -29,7 +29,6 @@ body { background-color: #111; background-image: url("../images/background.png"); color: #C3C3C3; - font-family: sans-serif; padding: none; margin: 0px; height: 100%; @@ -94,7 +93,7 @@ input, textarea { } .mediagoblin_header { - width: 940px; + width: 100%; height: 36px; margin-left: 10px; margin-right: 10px; @@ -118,14 +117,14 @@ a.mediagoblin_logo { } .mediagoblin_content { - width: 940px; + width: 100%; margin-left: 10px; margin-right: 10px; padding-bottom: 74px; } .mediagoblin_footer { - width: 940px; + width: 100%; height: 30px; margin-left: 10px; margin-right: 10px; @@ -451,10 +450,22 @@ table.media_panel th { margin-left: 10px; } -@media handheld and (max-width: 480px), screen and (max-device-width: 480px), screen and (max-width: 960px) { - html { - padding:10px; +@media screen and (max-width: 960px) { + .mediagoblin_body { + width: 100%; } + .mediagoblin_footer { + position: fixed; + left: 0px; + top: 100px; + width: 50px; + height: 20px; + background-color: #f00; + } +} + + + /* old code .navigation_button { position: fixed; bottom: 0px; @@ -465,18 +476,4 @@ table.media_panel th { .navigation_left { left: 0px; } - .media_image { - width: 100%; - } - .mediagoblin_body { - width: 100%; - } - .mediagoblin_header, .mediagoblin_content, .mediagoblin_footer, .media_pane { - width: 100%; - margin-left: 0; - margin-right: 0; - } - .mediagoblin_footer { - margin-bottom: 100px; - } -} + */ -- cgit v1.2.3 From 7c7ba01ee3450ded81f3ec9630cde0818865ed03 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Fri, 30 Dec 2011 19:11:47 +0100 Subject: Fixed broken confirm_password test --- mediagoblin/tests/test_auth.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index d3b8caf1..9b0dea66 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -89,7 +89,6 @@ def test_register_views(test_app): form = context['register_form'] assert form.username.errors == [u'This field is required.'] assert form.password.errors == [u'This field is required.'] - assert form.confirm_password.errors == [u'This field is required.'] assert form.email.errors == [u'This field is required.'] # Try to register with fields that are known to be invalid @@ -101,7 +100,6 @@ def test_register_views(test_app): '/auth/register/', { 'username': 'l', 'password': 'o', - 'confirm_password': 'o', 'email': 'l'}) context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] form = context['register_form'] @@ -125,18 +123,6 @@ def test_register_views(test_app): assert form.email.errors == [ u'Invalid email address.'] - ## mismatching passwords - template.clear_test_template_context() - test_app.post( - '/auth/register/', { - 'password': 'herpderp', - 'confirm_password': 'derpherp'}) - context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/auth/register.html'] - form = context['register_form'] - - assert form.password.errors == [ - u'Passwords must match.'] - ## At this point there should be no users in the database ;) assert not mg_globals.database.User.find().count() @@ -147,7 +133,6 @@ def test_register_views(test_app): '/auth/register/', { 'username': 'happygirl', 'password': 'iamsohappy', - 'confirm_password': 'iamsohappy', 'email': 'happygrrl@example.org'}) response.follow() @@ -227,7 +212,6 @@ def test_register_views(test_app): '/auth/register/', { 'username': 'happygirl', 'password': 'iamsohappy2', - 'confirm_password': 'iamsohappy2', 'email': 'happygrrl2@example.org'}) context = template.TEMPLATE_TEST_CONTEXT[ @@ -304,7 +288,6 @@ def test_register_views(test_app): '/auth/forgot_password/verify/', { 'userid': parsed_get_params['userid'], 'password': 'iamveryveryhappy', - 'confirm_password': 'iamveryveryhappy', 'token': parsed_get_params['token']}) response.follow() assert template.TEMPLATE_TEST_CONTEXT.has_key( -- cgit v1.2.3 From 6f559060785270d32a6ca99d2cdb89b5fedfaf9e Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 30 Dec 2011 19:45:00 +0100 Subject: Fix #715: On media submit page, "Separate" is misspelled --- mediagoblin/edit/forms.py | 2 +- mediagoblin/submit/forms.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index dd339e08..f9cc92bf 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -28,7 +28,7 @@ class EditForm(wtforms.Form): _('Tags'), [tag_length_validator], description=_( - "Seperate tags by commas.")) + "Separate tags by commas.")) slug = wtforms.TextField( _('Slug'), [wtforms.validators.Required(message=_("The slug can't be empty"))], diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py index ad420771..e21b00ee 100644 --- a/mediagoblin/submit/forms.py +++ b/mediagoblin/submit/forms.py @@ -32,4 +32,4 @@ class SubmitStartForm(wtforms.Form): _('Tags'), [tag_length_validator], description=_( - "Seperate tags by commas.")) + "Separate tags by commas.")) -- cgit v1.2.3 From 694e965f45b8da0af96e3ae99c85b4f1f4819ee6 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 30 Dec 2011 20:17:59 +0100 Subject: Fix #712: Comment counter always uses plural --- .../templates/mediagoblin/user_pages/media.html | 86 ++++++++++++---------- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 13fa1baa..4c255112 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -81,18 +81,25 @@ {% trans %}Delete{% endtrans %} {% endif %}

    -

    {% trans comment_count=comments.count() -%}{{ comment_count }} comments{%- endtrans %} - -

    - {# 0 comments. Be the first to add one! #} + {% if comments %} +

    + {% if comments.count()==1 %} + {% trans comment_count=comments.count() -%}{{ comment_count }} comment{%- endtrans %} + {% elif comments.count()>1 %} + {% trans comment_count=comments.count() -%}{{ comment_count }} comments{%- endtrans %} + {% else %} + {% trans %}No comments yet.{% endtrans %} + {% endif %} + +

    {% if request.user %} - - {% else %} -
    - {% endif %} -
    - {% autoescape False %} - {{ comment.content_html }} - {% endautoescape %} - - - {{ comment_author.username }} - - {% trans %}at{% endtrans %} - - {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }} - -
    -
    - {% endfor %} + {% for comment in comments %} + {% set comment_author = comment.get_author %} + {% if pagination.active_id == comment._id %} +
    + + {% else %} +
    + {% endif %} +
    + {% autoescape False %} + {{ comment.content_html }} + {% endautoescape %} + + + {{ comment_author.username }} + + {% trans %}at{% endtrans %} + + {{ comment.created.strftime("%I:%M%p %Y-%m-%d") }} + +
    +
    + {% endfor %} {{ render_pagination(request, pagination, media.url_for_self(request.urlgen)) }} {% endif %} -- cgit v1.2.3 From 992e4f80324e5e2d0079fd70cce9d4ad962f7047 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 30 Dec 2011 21:29:15 +0100 Subject: Change forgotten password process: different redirect, added/changed messages --- mediagoblin/auth/views.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 66178371..f707ecbe 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -232,16 +232,12 @@ def forgot_password(request): """ Forgot password view - Sends an email whit an url to renew forgoten password + Sends an email with an url to renew forgotten password """ 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']}) @@ -257,6 +253,14 @@ def forgot_password(request): user.save() send_fp_verification_email(user, request) + + messages.add_message( + request, + messages.INFO, + _("An email has been sent with instructions on how to " + "change your password.")) + email_debug_message(request) + else: # special case... we can't send the email because the # username is inactive / hasn't verified their email @@ -270,9 +274,13 @@ def forgot_password(request): return redirect( request, 'mediagoblin.user_pages.user_home', user=user.username) - - # do not reveal whether or not there is a matching user - return redirect(request, 'mediagoblin.auth.fp_email_sent') + return redirect(request, 'mediagoblin.auth.login') + else: + messages.add_message( + request, + messages.WARNING, + _("Couldn't find someone with that username or email.")) + return redirect(request, 'mediagoblin.auth.forgot_password') return render_to_response( request, -- cgit v1.2.3 From a246ccca69e863904718537f45a17d226b33a123 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Wed, 30 Nov 2011 21:21:39 +0100 Subject: ASCII media type support & fix a bug in file submission error handling * Added ASCII media processing * Added ASCII media display * Added ASCII media type Rebased from Joar Wandborg's ascii art branch (squashed to remove the commits borrowing code of dubious license) Fixed a bug in file submission error handling: - Moved file-extension condition out of loop (what did it do there?) - Updated file submission tests - Changed error handling in file submission, should now report more than absolutely necessary. --- extlib/inconsolata/INFO.txt | 4 + extlib/inconsolata/Inconsolata.otf | Bin 0 -> 58464 bytes extlib/inconsolata/Inconsolata.pfa | 1088 ++++ extlib/inconsolata/Inconsolata.sfd | 5730 ++++++++++++++++++++ extlib/inconsolata/OFL_1.1.txt | 97 + extlib/inconsolata/textest.pdf | Bin 0 -> 22783 bytes mediagoblin/media_types/__init__.py | 20 +- mediagoblin/media_types/ascii/__init__.py | 27 + mediagoblin/media_types/ascii/asciitoimage.py | 172 + .../media_types/ascii/fonts/Inconsolata.otf | 1 + mediagoblin/media_types/ascii/processing.py | 93 + mediagoblin/static/css/base.css | 12 + mediagoblin/static/fonts/Inconsolata.otf | 1 + mediagoblin/submit/views.py | 8 +- .../mediagoblin/media_displays/ascii.html | 40 + .../mediagoblin/media_displays/image.html | 18 + .../mediagoblin/media_displays/video.html | 18 + mediagoblin/tests/test_submission.py | 5 +- 18 files changed, 7323 insertions(+), 11 deletions(-) create mode 100644 extlib/inconsolata/INFO.txt create mode 100644 extlib/inconsolata/Inconsolata.otf create mode 100644 extlib/inconsolata/Inconsolata.pfa create mode 100644 extlib/inconsolata/Inconsolata.sfd create mode 100644 extlib/inconsolata/OFL_1.1.txt create mode 100644 extlib/inconsolata/textest.pdf create mode 100644 mediagoblin/media_types/ascii/__init__.py create mode 100644 mediagoblin/media_types/ascii/asciitoimage.py create mode 120000 mediagoblin/media_types/ascii/fonts/Inconsolata.otf create mode 100644 mediagoblin/media_types/ascii/processing.py create mode 120000 mediagoblin/static/fonts/Inconsolata.otf create mode 100644 mediagoblin/templates/mediagoblin/media_displays/ascii.html diff --git a/extlib/inconsolata/INFO.txt b/extlib/inconsolata/INFO.txt new file mode 100644 index 00000000..61d3a0f1 --- /dev/null +++ b/extlib/inconsolata/INFO.txt @@ -0,0 +1,4 @@ +Inconsolata +----------- + +This font is found at http://www.levien.com/type/myfonts/inconsolata.html diff --git a/extlib/inconsolata/Inconsolata.otf b/extlib/inconsolata/Inconsolata.otf new file mode 100644 index 00000000..34888982 Binary files /dev/null and b/extlib/inconsolata/Inconsolata.otf differ diff --git a/extlib/inconsolata/Inconsolata.pfa b/extlib/inconsolata/Inconsolata.pfa new file mode 100644 index 00000000..83a17d7a --- /dev/null +++ b/extlib/inconsolata/Inconsolata.pfa @@ -0,0 +1,1088 @@ +%!PS-AdobeFont-1.0: Inconsolata 001.010 +%%Title: Inconsolata +%Version: 001.010 +%%CreationDate: Sat Feb 7 12:03:37 2009 +%%Creator: Raph Levien +%Copyright: Created by Raph Levien using his own tools and FontForge. +%Copyright: Copyright 2006 Raph Levien. Released under the SIL Open +%Copyright: Font License, http://scripts.sil.org/OFL. +% 2005-8-26: Created. +% Generated by FontForge 20090121 (http://fontforge.sf.net/) +%%EndComments + +10 dict begin +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def +/FontName /Inconsolata def +/FontBBox {-1 -177 510 835 }readonly def +/PaintType 0 def +/FontInfo 11 dict dup begin + /version (001.010) readonly def + /Notice (Created by Raph Levien using his own tools and FontForge. Copyright 2006 Raph Levien. Released under the SIL Open Font License, http://scripts.sil.org/OFL.) readonly def + /FullName (Inconsolata) readonly def + /FamilyName (Inconsolata) readonly def + /Weight (Medium) readonly def + /FSType 8 def + /ItalicAngle 0 def + /isFixedPitch true def + /UnderlinePosition -100 def + /UnderlineThickness 50 def + /ascent 820 def +end readonly def +/Encoding 256 array + 0 1 255 { 1 index exch /.notdef put} for +dup 1/NameMe.1 put +dup 2/NameMe.2 put +dup 3/NameMe.3 put +dup 4/NameMe.4 put +dup 5/NameMe.5 put +dup 6/NameMe.6 put +dup 7/NameMe.7 put +dup 8/NameMe.8 put +dup 9/NameMe.9 put +dup 10/NameMe.10 put +dup 11/NameMe.11 put +dup 12/NameMe.12 put +dup 13/NameMe.13 put +dup 14/NameMe.14 put +dup 15/NameMe.15 put +dup 16/NameMe.16 put +dup 17/NameMe.17 put +dup 18/NameMe.18 put +dup 19/NameMe.19 put +dup 20/NameMe.20 put +dup 21/NameMe.21 put +dup 22/NameMe.22 put +dup 23/NameMe.23 put +dup 24/NameMe.24 put +dup 25/NameMe.25 put +dup 26/NameMe.26 put +dup 27/NameMe.27 put +dup 28/NameMe.28 put +dup 29/NameMe.29 put +dup 30/NameMe.30 put +dup 31/NameMe.31 put +dup 32/space put +dup 33/exclam put +dup 34/quotedbl put +dup 35/numbersign put +dup 36/dollar put +dup 37/percent put +dup 38/ampersand put +dup 39/quotesingle put +dup 40/parenleft put +dup 41/parenright put +dup 42/asterisk put +dup 43/plus put +dup 44/comma put +dup 45/hyphen put +dup 46/period put +dup 47/slash put +dup 48/zero put +dup 49/one put +dup 50/two put +dup 51/three put +dup 52/four put +dup 53/five put +dup 54/six put +dup 55/seven put +dup 56/eight put +dup 57/nine put +dup 58/colon put +dup 59/semicolon put +dup 60/less put +dup 61/equal put +dup 62/greater put +dup 63/question put +dup 64/at put +dup 65/A put +dup 66/B put +dup 67/C put +dup 68/D put +dup 69/E put +dup 70/F put +dup 71/G put +dup 72/H put +dup 73/I put +dup 74/J put +dup 75/K put +dup 76/L put +dup 77/M put +dup 78/N put +dup 79/O put +dup 80/P put +dup 81/Q put +dup 82/R put +dup 83/S put +dup 84/T put +dup 85/U put +dup 86/V put +dup 87/W put +dup 88/X put +dup 89/Y put +dup 90/Z put +dup 91/bracketleft put +dup 92/backslash put +dup 93/bracketright put +dup 94/asciicircum put +dup 95/underscore put +dup 96/grave put +dup 97/a put +dup 98/b put +dup 99/c put +dup 100/d put +dup 101/e put +dup 102/f put +dup 103/g put +dup 104/h put +dup 105/i put +dup 106/j put +dup 107/k put +dup 108/l put +dup 109/m put +dup 110/n put +dup 111/o put +dup 112/p put +dup 113/q put +dup 114/r put +dup 115/s put +dup 116/t put +dup 117/u put +dup 118/v put +dup 119/w put +dup 120/x put +dup 121/y put +dup 122/z put +dup 123/braceleft put +dup 124/bar put +dup 125/braceright put +dup 126/asciitilde put +dup 127/NameMe.127 put +dup 128/NameMe.128 put +dup 129/NameMe.129 put +dup 130/NameMe.130 put +dup 131/NameMe.131 put +dup 132/NameMe.132 put +dup 133/NameMe.133 put +dup 134/NameMe.134 put +dup 135/NameMe.135 put +dup 136/NameMe.136 put +dup 137/NameMe.137 put +dup 138/NameMe.138 put +dup 139/NameMe.139 put +dup 140/NameMe.140 put +dup 141/NameMe.141 put +dup 142/NameMe.142 put +dup 143/NameMe.143 put +dup 144/NameMe.144 put +dup 145/NameMe.145 put +dup 146/NameMe.146 put +dup 147/NameMe.147 put +dup 148/NameMe.148 put +dup 149/NameMe.149 put +dup 150/NameMe.150 put +dup 151/NameMe.151 put +dup 152/NameMe.152 put +dup 153/NameMe.153 put +dup 154/NameMe.154 put +dup 155/NameMe.155 put +dup 156/NameMe.156 put +dup 157/NameMe.157 put +dup 158/NameMe.158 put +dup 159/NameMe.159 put +dup 160/nonbreakingspace put +dup 161/exclamdown put +dup 162/cent put +dup 163/sterling put +dup 164/euro put +dup 165/yen put +dup 166/Scaron put +dup 167/section put +dup 168/scaron put +dup 169/copyright put +dup 170/ordfeminine put +dup 171/guillemotleft put +dup 172/logicalnot put +dup 173/softhyphen put +dup 174/registered put +dup 175/macron put +dup 176/degree put +dup 177/plusminus put +dup 178/uni00B2 put +dup 179/uni00B3 put +dup 180/Zcaron put +dup 181/micro put +dup 182/paragraph put +dup 183/periodcentered put +dup 184/zcaron put +dup 185/uni00B9 put +dup 186/ordmasculine put +dup 187/guillemotright put +dup 188/OE put +dup 189/oe put +dup 190/Ydieresis put +dup 191/questiondown put +dup 192/Agrave put +dup 193/Aacute put +dup 194/Acircumflex put +dup 195/Atilde put +dup 196/Adieresis put +dup 197/Aring put +dup 198/AE put +dup 199/Ccedilla put +dup 200/Egrave put +dup 201/Eacute put +dup 202/Ecircumflex put +dup 203/Edieresis put +dup 204/Igrave put +dup 205/Iacute put +dup 206/Icircumflex put +dup 207/Idieresis put +dup 208/Eth put +dup 209/Ntilde put +dup 210/Ograve put +dup 211/Oacute put +dup 212/Ocircumflex put +dup 213/Otilde put +dup 214/Odieresis put +dup 215/multiply put +dup 216/Oslash put +dup 217/Ugrave put +dup 218/Uacute put +dup 219/Ucircumflex put +dup 220/Udieresis put +dup 221/Yacute put +dup 222/Thorn put +dup 223/germandbls put +dup 224/agrave put +dup 225/aacute put +dup 226/acircumflex put +dup 227/atilde put +dup 228/adieresis put +dup 229/aring put +dup 230/ae put +dup 231/ccedilla put +dup 232/egrave put +dup 233/eacute put +dup 234/ecircumflex put +dup 235/edieresis put +dup 236/igrave put +dup 237/iacute put +dup 238/icircumflex put +dup 239/idieresis put +dup 240/eth put +dup 241/ntilde put +dup 242/ograve put +dup 243/oacute put +dup 244/ocircumflex put +dup 245/otilde put +dup 246/odieresis put +dup 247/divide put +dup 248/oslash put +dup 249/ugrave put +dup 250/uacute put +dup 251/ucircumflex put +dup 252/udieresis put +dup 253/yacute put +dup 254/thorn put +dup 255/ydieresis put +readonly def +currentdict end +currentfile eexec +743F8413F3636CA85A9FFEFB50B4BB27302A5D8F831C8E7403C0106A132FF59D98092C95 +DC41D4C9241F1BD142718DBFC7990762D5702DF0A9EB7021A4E2963A13092EE8CE8D5420 +1693D02365290EAA96629C387B0C4D1D8F02EB5E206499E04031887F3D8326E1D52DE489 +DAF6385A0DF2C94A15E48C4F20A9A6E49ED44889E52CB5C42B509B29A2E21E2F65EDB849 +6A92804F43E45E2A5F7C701DC5251F457E338E2C67AFBFFFC9F1DC889EE31B6AC70DFF59 +766BC955C317A79D28364884CB3B1485A8CF42F0EB33E3A89026B9BB3082A4357FD4D28D +ED92CF5006DCB258B0583019C44096C4F55E26B71018B6D73D9C82F9CD1FD4D3AF3B373B +86AE36D5F73674AC34BFF15373CCF3744BDD34566C2D355AAA3C7A2BF5F440B13550AB25 +F9774E5E426548CD877393C89D2C66A0223C3B799F1BFADC79A2F135FB491B6A0DBBF42D +E22E06C135617487E09820B8E435C13BB493D18EAB3F09530A17B104E9A21ECC2F6A3099 +8BB197801D507A4D287734EAC59F28F3F1543BB64C64D43516EAF67DC96E4FEF71EC4D98 +C8BCCAE296BF517D3A6927DD85765F85B59CB2FEEA4978825D5BA7832CC9C44F8D7195AE +D2D27773E6A93C1CB545AAB95CE469EBE7DBE770CBB3A4B913542C93B2716BB48C4F5F5E +ABDDBE740AE279051CA883F22E80E4AED31D5D5001A055F97A1FCA1DAA1E4319E97F484D +301D9CD958A63214722032F006332D39C950DDBB0FB2FCDB82E0626291B4DB630BAD5EB4 +429F0484513B463E8EB1E2BE15F7DA7C9F1365025585465A6593B4246C6FF4447CF57700 +BE5577BF3F417FD88630D661D61693F9E92083EFE6EBE8054C4368233C3CF0FCCE71B15D +D33AC388B678D0CC1BC8E5820AC2EEAF141C25BF2A423583ABD12395A6029A283F77B210 +B1C394F8BC8B835B0DD4A668E36FF47E3569DD995A18123945E06C82B043D76C87E57CEF +19BCC653762D133144AFAD088F345F7E9AE84942696C1985529EAB4CE22965A4B256DEBC +9B4A39B65DB7378B9917D76A15E978DD881078BE13967CB730D7A171F9DFCA9294ACA80E +CE24E834CD0FDE0620FE9ECC22B5D72221D6A625B26C69925D22656DEFCCD6534045E522 +B942ADEAA201528C758566E6D9F8FCE0ED25854FD16417A7461A5092E5602ED96CE20787 +975FE5569193B044B83549541DE2226557952E53E90409A11C9BCA440D77A9179EFA65FA +43FF7C10FF7B17D61A758C7F3E658542A0E44D8D84A638CDAC6595CCFDDEB2EF67FBBDF0 +B5B3BABBF5FD497FC88B32AE0EB2C7A62624A74146712946A106E7DAB8F455A8CFD88736 +F917A3EAC075D30BBE94F3D54301637ACA3DF58C7A652420BE7D221C53C8DD6C03C4F22F +28E291C8D8C5C3D6CFE745A7F438EF594812E849D6E54666DAB28F6D0D6EF5E77C456AB8 +BB71F5AA6D677EEF06A784F99E1531C00C02312F42EEAE3A67C87BBE018E1E09895FED1F +3F3712315F712F718BF4E7B672905E8B51522A7684DDDC6C4AED805A04BDFB6930D77A49 +67CD4CF63010A7AE4D88EA75138A9F27B15F50FD125C5182DB692F5B45FFDA25A63C1481 +40837722F0AE5823DAB6757D38A6EADCCDD7A0F2BC6825616CBA755697E699B40A3CA817 +17261FE9E09BE98650FEEB8D1525C2A9E33C174005F9C600832C4E8F426E7479B507F7DA +884C72AF75C1818F6A1D35C1FDBC7B3FAF26A1F0F31B92E58CE39D892245BFB4212E9A77 +5836C9CF189550EFB8B23F147B4CC78B48040A2C2E1D83A35D0691B761DB111D4CCCDCEA +09F13E8831AA4E330E0128105868F6F194771F9317127815D25653AD3F6981596D5C665A +9613A6370D667980AE148B4F2C8B208AC2A3FBD0264FA03610C2764985C46924B6EF3A05 +1A2CD3F33BCC0C1D6D6D96008FCB58D84D88125D5B1A87083397D4302A1B2773F2CC59A9 +A7313CB431EA3A66C05E50EA8D94CF488C792E01C7F773FC42D394B9BB4CF7BFB76E73AD +8B3CA41B172CEBB4BA391BB113CE4DBD6E4956628B4B20BAB6521EBFA45066FC65A2C7F3 +2F3DCBC22D01949EC33D19278FF72B3AEDC014BBF1041466A7C86EB1299881015A826235 +B13D7B3FA708A93686ED59D187050F8FBDB81DD98FC72EA4BCC5A40CEEB88192BB6AB175 +8B6A5A6BF4544F4831CC2AD93B09D1BE11156F97313F927DB21ACCF0DE0C925813365CE1 +1B5DBC508028ADCE89BE4B25DBD6D9906D6BD8AC2B3B1631BAE58619C5319CD83EDFCA29 +BADCE8580BFBFDE29EBE31879EF741795C0B962DCA3AE3F5C6A1AA2CE6D21EE239BB1B9E +C7BBCE8C17CA0C8769773897E69615DB661CA26CD5444805CEA78414BE8A66A1685535C3 +E56A8EB579498386E9017B5233853CB9D031F863B7DFDDCCF39D55FCB073B2E3153DF76D +C738D92FA3BB53B8C5067C347888A3CA135D04A214C30996D8721BFA425BCD69D069F314 +F4E761FC7F18EA5031715F01E89C6DEB95FDA6BB7A1C4CB2123CE36D13EEE81647141D27 +CAE4F80850746CA32876F6DFB1C191EF5B6AAE0A9C74EAAE17EF095996DAAAE24619161B +F3B659ECFD3C4DD95C2229238BFC9E5A495080827D6A747C3B3FD3EF1247D2979C816A5C +CEC294EE4A51A5089850F152D7BF2DC4682129846F159698CEED06499EE842AA45658986 +0E32068679836E0B726CFA1F0FB7E95ACCD3BBD70FD14F14161FE3168789593A659C768D +D0F49748C1EB3D813F7C33ACF19D9627D82A6F457002B731AFFD24A3B9EE378295C37BB4 +11F39323247E845A80DD99625FE0BCAB3545F586BF74993BD3784D307CEC418481748420 +BBF213417639866D6112944C198BCF8E4D20B521B79FC5D935AA1184C2AADC4E7A89180F +6A3380CB10F5542E5AB05881749C0512DBBE9101FFD2B4E79892BAC9428982CE386B64F3 +3B8A7C2FB184F1CC35B0EA584EF80A07D5A280AB944492F84D22FDFE47B9C893EB3F1515 +458859572F0DE48C7E5A10B6E3F946159B630D813CAC9312DA1683D923C4D9099FDD7A15 +B8667037556DF0536E44D3EEBFDD7CE67BCD0B1C09151A5AE07F3021023070C4159799F1 +88FDF758F48FF19E9D6CF06054E22F723BA336A81B127443743AA3D98EF3A209EC712894 +84EC103DE6523F763F944E31718BA6D56FC6DD03A29B49C2FF1894F736AA1AB9BCFAD31C +60407CC4476DF0F69B96F7685141C8B63A5587875198ECE5BDD4924685773715E943A92A +5A22415B8E85911EB72DF7410F6F1BADE8E8FD9348CB4D483C6D1200F35014D82DA9ABE3 +B476C00E7D3C762395A65D29148102224E6593AD80A566D10C8C14D577BFAF6D425FD2DD +FCFB898E1F25199C2F2202ACE9E8425A7476510A4DBEEEE0B925B9D7D53E39E18E7B4F71 +809D01631B121F11C0785ED6D8F63319CFD11D4F810D04CB0D1C1997F50814451FF5E50A +28F7D421CFEA781B89BDB53A9752A2F94A55A3EF211683E4CB4193EC3487909A46511643 +96B8C9F47C038ACB3A2940336596E008F9180171E06B8DDAB417E9FDFE042B952AC201F1 +CA2796E98374A16248C3939CB6FA9ADA4A6E1438E34394E8BB27275EC021F368BEFD7614 +9924EFAA8652A9B2CC4F493AB91452CABAABFCC7CD99D8BCA7F43852D40EB7897130F9A9 +548D091295511913275DB758BEEBEC3C4FEDBFBE13B92BC84412DE875938AEFF92F8B7F5 +5906A4A398768107C74AB503E55335AACFD3D107A3EE49D58CC291D4F507598311FB0FBB +12F343A50237D83D8D281B1CCFFBFA2865EC4BF19998D3B60B5FCF20D1C2B699867EB100 +7A1C3FA5BB0F307C0F1A248225E4426C1E13352A1A1BA2511EF9A977A166106DED6682B8 +41A84D03A090FBE879045EE849E55D47530F269AC5F2212CD29F02F652C29DCED3B79101 +51937689C3BAB8D15DFFBF02676188AB1360792FC364143A6C0FA49494024EDEB72F0E90 +58E6D37CCF2A423120DB91DC7078887ED2561991B9B6C48EC10AB1084918C660A31EEF79 +4F5E1643E30046E876CBF84658483BC815343866EB1652FA6EEF41F98034FAF691169136 +76B9BFF152F9ED8C825BB9692A7E4CEB06AC4266CCADF5182E7A1586BDEC3B411064D6A5 +7B4A78162600FE4461CB0A6FCE4125B19ACB5F4BE5B1C70A565693CEC9BAE9EC277C5CF1 +3EC22CEE695858694DF4BB1D5FCEBE9E496D6A2B780D5FA9AE9E672FE35AF6558340DB82 +4213CE5AF7786FD5BEE2873B6508575C2BE154C4B2E7ED11D317A5058D23B335E3D0C5B2 +10BAAAF8270E01BEB660DA7D441B7A70921000E7564CCAE5FC90DD7E843BFBA1E1752021 +4C99A1411BE9CA4F64B48661B452D1674994DBB3B91F8CD458C787BCF29101F3D3D5236E +37912A31A058EF76E3C74BB472A2C008305D1E8B35E7F40E0257AAE3BC7F24C48C18E5EF +0FDC4DBBFCF48803BD7BBB797E128E39285BCDB6D0874B3764AF273D050264AF5810FCD4 +44A5EB6CFF8D48A1C7648E9D28966CD59EF607293054B22F111FF473C3D41336237DBCB8 +0062D35521EC38382AE3A54782962A18284A3AD75ADF2CBF18C5BD25B34D6594924F652E +55D52507DC2CB831505223A5D86BF5C5AD1B7495C1BC9EBB7A7DF85C88DEB148018D9A79 +BE9954FEA2A3BD0D900FEF063EF37F552E3D5750E02C185F5EE94D7A93833A5EAC075BDC +1C7ECE2D2482EEE2BC8E64D94A186008E6B4E53759ABF9AA74AFC8318BB810FEF89F6145 +BC72F812C6DE3091F3A351E1CF34BC3D1097AB5B7E05CEED21E41E2CE6E519938E4C7BFE +D27C8E7B14B7042FDF155892E806B581977A0B6FF68334D903673DDE588EFC59B4F695F3 +4269A0B280435E546A34CC83D67D92915D842AFF0887903D9DFCC2EB1E64352BF165C1C2 +0767307C99F16D31E343B1A9F58F8CEA1C4F4B1505A75768838D7D7B7EC6CAEB5D464D21 +41A7BC21FD5DA3EFE42C9E6E74DD3BD11A844A395D83FF422E41DF1519C73466385C7779 +C1668D1269004CAD19E2FBCD012A741DB8F8E4B92E32D6121E7EF9808619C1A85E8552D1 +97D6E1C41F7E45708B4EBC90D54887B5A0774A19710EC804544AB557012D7D59BAE248FA +A13614C9F3024F888A211D4F756E32473DA876138C1E7EEDFA604EC3CD33EF1F056F90F6 +4F836C1893A17C2CA4CD7558C9F63745CD659F3A5B5E23B260F0F17756092B5EE980E039 +3405F6289EBD24CB343FC7E68038981670D7407725397D88BB1406E8DD70C31429F74CE8 +A8F86BE6A1662353BD763548AD4A4E5A1318A54EC9A3AB56BFD991AC1E9A43E5BEE0A331 +DE6080DA712C6F2FACD94191EA36BCA53257F8856A7A108469A684012053B3D07813DEBD +B7120CCF3087158F7229A05562A4D414BB9E5AF84EB08E560032862BC7FC1D4D5E00E6E5 +052A9E88327B6C7F018CDB5229EC282EC87E5A9E841D1903D72277E4C82D82F098BB7B7B +D39EED6BB7EC87B5B70AE7219B43E3F6212570E7A2AC7D0738A7FA0303A0269B0BF62D2B +D527026D57E5752527C8AB8D0C63BF1D914574A405C3E2C3944353796D86AA5E2F6B2A04 +C6AD1171377F3E1D26609B050952E0DABD4CE338AFC0BB4775D3779BFBF7F3365594C610 +176E3B0A62F5AFFA655D3ACFB8FF1BD7AF48A56E4AEC7D1B4FAFC8294E84BB9B3C4316FE +B1C99131D63E7681F8F8D4ECDE8B7904CE3307FEA96D569994F63F7C1EB02F93AB1B2BAB +2D95489642AD5FDF9D4ECEFF5619E70AE4A677881EEA0F84DEF708A7F73C5C99E43723ED +3AD445D2A3FE327FA2FFFF37CAC7960E4585C3086735CC1167E73B9628EF17FF7AFEE09D +D98F7016E8963B3CD7BDA0F756A6036D00A6FB11EB2DAF93FAF7A39BC2EC273650ED3E2D +6C0DC9DC875C4BB852A0E0C1C8E546263309373E96DF8221B8309F3D35ECB61906D2A7E4 +0B6A2C92F04BD39E74EEF161D8A2F5EE7F4788E4C65BA7582C63858FD7E9E34250849CE0 +C8EAC1036C2055BDC50BD9D2BD0F228F0F6DD950F5850523C376364E394BBC979FFDE391 +5603CFE721359639069B00E0B09A3831677C1CC0AD41B0741FAFE3153807AECB7CB39A87 +56C53F818B2C0E03F8AE2E7766B1BD43595955E719169FDECBE1E93FFA0719275A971A93 +05FA40D2F715B0DE5AFA9299077A6DD1C46E6E7B98EFD6FE106CC2C5591AF6371054B80D +4B17CF8F7E7A925E2289C9F063D7D6EBE5E2450D3FAAC78F2AED7479A9DCB9E42B0BB39E +1E50801169216DDC66316C628C72A1046C0E414D16465DCAA2BCD7C499DA8511F6BCDC6D +69F68EF6D98497C51749046384A3433906AFAED3058AF24D1827F498733562C6A4813188 +B008C48FCB1BE78F89CD1809D22A984DE092AD78EEA4143A731D1F48322767A1503AAB4C +70E9B42A240B0770CAC79FD58579F57B23FFF37623883B7F33B060D8DAD0C21975CDEEF5 +2F5F2E395DE45E97E22A558F181478A86DAB0CE022C1FA5C513279FBA66536A4D1D13ABC +E569CCD74DF5245190912983CA329C943B421B4CA583A6047AD453FA2E8E9583F6C9081D +1DF2FF6469092B0FBE6EB38F789035EB82933CBF3D16D30C1DBA9F404D0C1C0892A36ED3 +A92D3BBEF436F3F1556536727F16D3F54C00A1A1693F285708ECA695D3B30ED177E353A6 +820E02F738027FDDA3BEEA8DF4B61D51ECB2201AFAFFD71C5D0BC21EFD4B381A8B14D8D5 +599D784FECFE6C0B83A126238ED4DCA2B797F360685049A7407B92C16FAED859CC68FBD0 +6F8A715BE5369E6F702539CDF50244E3414CA90A74D2E63FFF1253AA87F2B8D96874F0D4 +0292C41D3BA060434C45E6E88D8DF9E025196E310D3BA2045AF6570E3F87EB248A942BBA +75528BC7FCA8B0C0B73874496BE86EBFCA8A1F28F18C1B29E924BCD56E8A1ECC202025A0 +4C81CD070F2DF6302F69B890EF4E7F1723D91434D9E2C7DB91E375E5F352F81DEAB15DBF +5B702CF085535F4EA8B62BFD3C10455CB744A0FF840EB52BEE87C94DD8081BB23C3F1132 +D15BE52C4ED0BACA4794C96A2014381B3FEFE22E5B4B37BFF2C99C04C6FC4FBC71B465DC +0AF985148120E96CBB1D34B8F63E3120ED7826D799EDA434B9DF86E00BABC41C9095C69D +341249CDEE62D2F119C8C74029181AA202045AEEFA9EB41050653D356404BFB650DB8DF0 +F5680D8F5EC8A44F423540BBB43771220867F173D8D0CAD7406F8E64287A8DB8FDC947D3 +AEC9B0C5BF050735BF2CC285099C9799DBB9D3FA6FD87AA957683F9569D3261E14DD796B +463F973B16F8895A738177E7CFB94EED7207BE01253F879351B2776C28F361860BD5182D +A21F7B995B7A6B4BB09089DC6618343E0EDD922ED395A3D615CEBC9AE71992438429EE83 +ECB9E64ED7573F2F0C32F41010AAD6EF7F7902B397423433C297AAE40F16CDE76DA7BD43 +7A738C99709A13CE7EEF117B0D01ADD0E240135B754F7E16B7C7CD4E82F0BC951CB069E3 +AB189926C7C07F49C7EA7C3B5FACD93863A8D3E9917B417B2D2A5256ABAA9123B66179D8 +91B4EA97ADA8F1DB43EF175FD3487CDEC72BE6A2B89E43F340630535765411FA15D2B3C6 +350FDB2E3BFD6F660D539CB8120ED86B59AA539BE0AFCF84D03B8BC4BA0F0CA8FDC45893 +F061190878BD44003EB80D54E84CD41FB4244D5749FD17D9C7FB045357E651390A1CB833 +A43390912C1EAC62F86D50F1843D212EA2B72689D2681F46E327B28DFBF8D7D8FA2731F2 +D620C306703A4428DC3E8C22566D84A8F38C61C3F1A64F63FC65D0431BD7CF9C47A66569 +B4FA594DEA0944707062BCBC9E91BF4541A374E167E10E9EF02F5BC483A23FF0C6FEF410 +4618393C9BC5BDC5C2F4B69E81A93E6BC40D70D409B10E85D2CF9CE8E8FA6C8E125AFBEA +452B79C547F82334D49B0EE386446E2351B6C8FD8031EA0E134B2CD41DDD622F0FEAF670 +1486D8288A5BCC146B35F7E75B6970338C6C613F9FC5E24C37E6E7C4C8C959417D30B406 +3CFC5B53E0B1833D10D72AA19D4F9852378E0BDDA8825C726F241E5A973286180C106FB5 +1D285AEAF479F7DBCA63AFD05CE41CB88E0E6D74F60210D66E73EA0E5AAEEA61672C088C +0F86588F749D689E51A205B54A4B3C841B0298C77A3D82AD88BB02886B229371948D1A2D +8D4D9B6E2331C4666FC7257E2ECFC1225093FFAF7A060876A2CB7D828BA0848EA0B52D9F +96F9E7C786B928962DD71E761211432D66CBD6265DAC3FD3D3AB6A87DB72A6C266245B65 +6321255C4EAF77284AE1F46A76D1470C79FC4376DBB53DD7C0B660D629EEE6CA728ECDA9 +E4A7F91D10EADF2A143EA09689139F88BBF9E41DA8F09899669CFAFE4782DCF736BE2429 +8DEEFEE14143BFC8A22DF8A9092013AC3413AD2A6A59ECB2B9047FB27B4B3457B87F670F +6F9A8A4F25C3B3294FB84012C70B90FB25662D6D5C8E9C1F9521FA9A9D9422BF378A6BFE +C25B973C89F1BD470F6B8988AFFC9A87EA0F02693C054DF043A562572744E38B0D0B8FFB +E9270EA45CCFAD6C7FF0374FE0EC402F788007F6025D5D33FCC84573A912F0E63526878D +D09C2855792DC97AB90F6A000FDBDE52DC493363DF430F2B55DD9BC6B6BEB9735686D645 +3DE803AD239321053F764B9C12D8A3D19823B052A8CBBACCBE2A958154E57BAE9257430B +A807220BC18C0141CE899B07BF776A8A50E84923E3163145ED3BBB84C7325FE6210E9776 +44DF731EF1A83F58CC60292D0A7EF1C2DDC93F7C56FBFA24BF220B1908C5600918154444 +F14363DA2D46933FDF42CB5B284777DB7AE316711CDE5FB27FD5A6D8ADBB8BC711395E1C +50BC77674568C7C18A5F9DB1DC31501B263C0CEAE79A1EA01A389E61BCB744C18E6C9345 +C8339E3542A53EC210278175A9FB5476FB32562BAA6A01EE5A06A5D03C9773B8BCDCF7FD +A89420F3B9A04D9A7ACA7A79F6F1DDEF968DF0A568B0062B8D0B14382FCB924170B7752B +56E6AF3B37B5C0D7DF4A7D9FFFF71CA476DB2414372686B1F0223F7BC7D26EE75A4068A5 +8BF93E6E81D04EA847CAC1CA42550AF0956A3E6CBF7CBF28A87395502A8A4FBB49BAA7D6 +22A1A8AF3BBB9CCDFFD99232069ECEAAB36A476F1D0D57AB4F925A7E8F227FA9CB8458E7 +7050221CE4F99776D8862B82E023753CD502B02FD1FE3A041873CBEAD85629B6A1B81AA5 +DCB2A82D368F2BC05672CE027F44BF28ECC41A28C636240F494A8E963319FAE4EFB0059B +B97B5CCAB45B87FA6DE1D67E7717C8295A580AD9860C3A539A62EA5049645174BBA5D93D +6ADA0EC957186C469B13133F7C253424A41D9CFF5D48FF5C1E6D0BFFA39668C2D5254F27 +937F6C113ECB59FAA417C79DC0A0602A03244E81D6AFC40C112504D82AEE2F880FB1418F +B3A13D31BD659820CF24504E230589651BF49F02210D877EFD77F166D02A731612386A4C +0D7E0DF87D77D26DF0FBC832B5F9221EE8003886EB4DD87FDC063278D50C3FC638046C77 +99BA361F5419F74ACD06D18B9330343EAD919AF3BE0EAF2F97FB8C681F1241C661E13DB7 +BC5A42410396360388C76A57917459DF9E3AD893E16E47C6D19DEF058BB6B8F15C9074BB +0D3FED9568CA6016FC6C343F78D3DE779225741E24712206FB7DF5B9E60E6B1A49ADFA80 +4E9C6F59A9372AA2381443D81D3834CCD26DD9A498C511511F0A3C2ED105D31BCC102BA2 +2BCD1E033BE7D90C5078DA0587D44AD84E8C62CE26D5676D92994C01255A999AAA42331A +BC8CAD6BEDA04739C4C6BC6FCB3E584576DC94C44C776783EE4F72DEF2A0F76D9A31CFE8 +66D5DB6220ABA6A643466DAB3F62DDA5D6EDAC1160D0C586F5C0562E73DC27CD1F97CD76 +81EDA5E2D16C486785E7D64B8338EBF758684313E1746B927D3D751DC8BC4F2F53E82AA2 +AABE4BA7A4432E22311F471D45E5F9C1AF00D8537E2B56D14376FEE8244989943ED01F3F +33800310E62BF9DA08DF47C2560EDEF3291D321547D11D478A6FEE8280D6A58DCD0E4704 +565F44CF46537A32AA37EF20F55528894368932B3E0D5CCADD1815237C02D7BF5D38C2C0 +95F0198AB0E775C2A3650CDA6280791093B0F0FDBCC12EB0ED6258FF5A38226FCE85955B +1B5864A9E7414D4A530356CB0A4A59274894E80B03F500332F18F7E53D1B712C17CF2D22 +DC5561320E28F9F9D2CE5A54E51EA54A73D953FF56B3A281F3F4F393E078852A9F08D2F8 +176746C413BC5BBC8C40118E522E7F82758E03A92194FBF92790666F067930381852D53E +655D32AB79475193F6F460F080405F7A7C1D4131207C8B5E9612A0F3906A45C8BBEFC352 +9F536EE2A388C728A73BAE869BC1376DB0F9F0B2B2E8003EE628FB639188499D07420B88 +460C137877AF93A3943A07634A236BEBE206B5CE3BBFABD0F42ABB4F4E2CED4F64D6FB2F +0B1A92A79A5E160846BE6A37D52B75FC3DB80F4213681D9DBB12E093DCD15973530620BE +2B5166E10B3440073246E1CDC87A43925AD4192A758232E8C025D38A31A976FCD40E54FA +47F8E95415C18B5A8F3AE5C9D08EC07C97D72850FB9448D046F731E75A8BE351FE452B7A +582EAA1CDF5360D96E065AF534B7683CE811DA3FA17E4165101CA68FAE7992D39CE9E260 +5ABF320AD456A3859C113076429F1FACD7D7299F4C97FFCBA3E5AB8611167380D46F3620 +2E0203BE1756FD086BA019DB1C3AEE521027A24905D7FEB24DBA39640FD79028C37B0175 +F0105CB9E9D62FB1473ACBDE309461473FDBC7DE6213DFD2AE88B5DCE787CC00C515927B +B8705A3B42B7B702C33BEF950CF965BF5A761FD8706E7C780879916D436FF963DB2F8B17 +B5DE1B7586A88662C1D43A157AE3C82424F42861B7871EFBEB104F5DE9611BAF463A2B2F +C69C34F5BF921FFE2EBB8EC63D63A3E59DD87F9643C44346D8A75D46BF92429404481C15 +32F4F2096C49DC7E8705E48C371E01C17279591A35874BB8B05577E1E758794B661EC58C +5ABE361DEBD59EA914A5E922374B5729CF338575A44120BCAAF373ABB05425B583C3123A +7129335B7BEA84B063261C606A1136CFB4771795968511038513BDC4BA6B2622E3CDABF3 +0ABC3EC8777F26A243528F1BEDB447FFCE543691DC700FD61F88B78F35F54ED90E0EE490 +50BBA809C6A1624CE093B7C07268F8D9B9618728BF9E73788E53DBF1085D0F4261736C05 +3306F412079BB44BF2AD382126D9F5F1A89C2938448B8B2EA584490574AAC3826DD6D0E2 +4D18BADE49B35E5A551495A7E0283C4A6335B46EB7635E1D93BB227A6956F5C99587E524 +D2ECEE3B038CE4C240477F6F052B66918951F1A7C86DAE384A7DF3E6F4C2DF39BB842386 +262F3093D94709E44B4F6C1508B3C8A34AFAA4DDF298EA4E9D452727BCADC3447D4DEF16 +F9158B579098E80FE8528A7EBB4639BEF180933089AE85856C4F1B4B3D9FE3F9993772B8 +87D3A415368ECDE584053E933C6A66512552F161FD7D1F3C089E55180F0FBD42AF74D108 +9A6ECC2A8A0A566861A07EF2D570F1F6A4A0D333FAD864F0C722A10C7E709844F75AA6BE +FEAD7C7C21F947E8764598862CC5A098D8D7A90232B3D4C4A3479CEA0C5AF82B9B22596C +2D4755269FE5187A2BDE3106867CEF50BD128E3489F77930B4B0A81CDD4A2432028AA58E +9580470632FA24C48BEFAF51D726AAB97988058BE56B699D031C957B843DC0197D368E2E +268991D6E0D4064EA111CB25B7843979331DDF2708059ACA15BBD1753326CFF7126C4EBD +5E339C62B17304964057FD31E81E3EB7B66B56CF8C4EFA1026FF09190CBFAB39C62E9F97 +3032C5E2475C6F55B72F2BE77BDB4EE0E635A424B85FF0B4EC0EE96F1C54504094786343 +77E35C4FB1FE64426842E3B9350DC31A3051107525BD8A15BCD93BCB24EF5B0DE378771A +E8803DBA93CBEABDA312EADB3E33D19F307B76D31FE0E60D1BFF457DB8DBBDFB91B040BD +845CDF6EE02A4D81CFBBF5985FD060B763E3C4141F0A9BAE9EB8DF14E40D7C93A46190A8 +9C295AE87281CA6CA9749400BC3F6FFE287CEBB0F6F82C4DB5FA010D833D81816DA700DF +63FC04B324AFD0AD229ED76DB877710E83618F9C621A26870D2A31AA418F4C8FB2E7E7C4 +1B57CFCE2DC46460876BA91246E82477702CF24EFC20FE32C096BF31E38F8AACE860DE81 +D888B1C5B0F195CD6C147A2E422474D1335E2584A67EB6E1FE6133951290C3879F885BFB +ACCD497F349BF7DC76F7A0567225E79A635A85523FB9B5C058A248B60ADE40C1D5DC9537 +9D5111642CE8868CBDFF94BC41714ACBF551D4634955DC86272A31DAA51A460B5B66F379 +DFEC84C2DE47EE94053F3DD318693A3DD0485D08FFD5DF88D2102F18B0787AF6F5A4E312 +69E316FD499B6F36A06355F7D329C27886B24437A67144A7CDAD71299A95AB6B75992DE5 +802935A847B4FBDD755264209E967A434647E026410755664E58290755D47FB7DAF6CA62 +28351DECF90BDCAA9E97A4B683B1BDEC6EDA812D5D27AD68D87F76A05F66D7E8327C855D +FC353D133402B597330650E52BE7E9DF382A2E7664EA34C8DFACA713E06964813ECFD915 +C8FC76E98338772F97C78A250DE27DF108F8EA6A6E01C5279CDCB99DC0E9DEA49E2A6C48 +3C9A3F315DE9866D7AA8A3B84C5C30E43752D497D8AFD4788D2AF10BBAC57EF224A54704 +2E455EA1B15526700697522CB192DD142B6C04A1E5ECC8CBDA2B0531E2742974D427A874 +E93A089B946D41EB841BA2DA3EA57080AE895B4D88953C7DC0CBB55100E7B56475FD7F81 +951238AA52B7376B8B7CB4A08F93CFBC31414CD644F6813FE411A2076A2087467B62C6B0 +47C11619DFAB0E6034DF21C52F6E0687A630D35C2F689EF4ACE325FA6AB3FE47AF250BFD +17A3A34A45E6B3EEF17B402536DBEC877B95730F9CB5370A68094511CBB793258302D883 +117542B2AA7FAC3C1992E1FAACD8D1ED6C26A218CC7ED2E438DEF09CF268CB706C371D79 +282C3B007B0A199DA60DA023C7DD797F8199C8BA4693DC77206D8B455DEDCF45A2C27B06 +CE8B98097E68E34DF45C447722111CAE1FE9A2132A949EC35B928CF31C373F8117B03284 +D48F200B22114E254C08282AAD37418951B825A5E2B3F428DFAC65D48560FDA6DC092155 +FA29A09467E049109C2E5D2BB7CE2EA8B449A1D01F64B996B34625F3D60C5C48DCB6C6AB +99A3431149D1BAA1380AA884F1F21BFC3C28AA9A8D72A3B8AF91541810C05FAEDD7F3DD6 +04574837DE6A378CF04E34C6B6460953B498594F7676B94EA4BE8C3CD8AF20E5B467B175 +D544FE69BE9942340FC0220A2FA134D4B97CC523C9AE4C86A7841590495DCC3DE6ED645B +58F50D11159EDEBCEEDA679D55FB8288D52AAD3F685227C514E43E284DFAC06BDF9C7D9F +ADAF527840DF255E92962C5C78B46E68C72893EABBD1FD4E1858842A9B2EF85663966869 +C734D1E577B3EB650A68D7270659984344CA91BE8F7CCB53A1E3CE26D043C9CF9A94981F +3AC6E593E61128B3093481A80E172528F5B887CD55B5807E3310F55EA87E90AF1F7C9AA4 +BC4CE22E0D3B27A670AB2759C349F596FAB2AA24BCA521F9C22B9C02FAF37FB9F852A3F4 +FD6B3AF1A1F3D1F4EA285BCFB0C0F7C5B8333BD2013EBB6613347824AFF2DB14F28B7712 +3189B3DB4668035E7C7ABCD09CB7A58C02D09EDA98306B567FCCEA4060DEC980901FE159 +C75D65E7EDA505FABC3646E5E48820DECC78552F854DACD0C1E8FCD34BE4513C1D0A5657 +C4429DFBAD3625390AE9CD8C40087E0D1FCC0D1BD0B0504DAFC30C16239ABEE7D9CF9799 +F5E506028BF66E9393BEB384CF20965B03A73B465852CAAC82772D828663AD729DF3F492 +14824703CE36BCBE2F492DC778C8D6467205171BCE00CF11C2ED4651DC9DF4F8C33D9BBE +971E3594BA10511827E453ABEA44AD355B3ACC323EFFA3995651F572988F182431C5593E +4504903AFA37AEFD95DBD5E147BC1E2A29C2C8542F2658C06D212AFDBCF47CB0A3D70665 +355F72AC1DD9CE376E5E717B653860975E2138CD053C496AF9A6551586447A31932F3C75 +9951BC52CBAB7BC6305B6C11C00D1880DD285E3A8F21B7421E1B3C6437BF40675560B499 +1E4291BC2BB91D61C6ACD1770B78FEDA917DFE69656AB91D19FA3F2F35278EC7DC3F75AD +CBF76BF301AC248CC66C2BC0739BFE8339EC1F81A8B81F5CC59F8B38CDE717700998B65A +AD729140C89CE76E44AAFB5720DB8D088FF7028C3BB12EBFF413324B247ACEDCE4706528 +02EED0F9621BD22A9FE207B493B5C2431C172CC1E5E465A2ADF672C917E428E3D9EB628B +01D5D637EE70620DA8639C52389EA2D619DE192620CFB21934B037930B3BDB495D641C5A +532B823AB00B436B69E64AC361331CBC85B9F54E95F8862F85A2FA947399FF1499A63E5B +62F022D3191810521E873AA747A7A7CA664485F539B923B95C2459114034F985E671B240 +263687FF2DECD8A97973A102C95992F3A5315DFA8CD2825A9C8512FDCF8EA5A649E57FA1 +6CB149998608CCAAB6AF6D311DD8444022C0A3D53585786D9AFE05AE23DDBF6461CAB60C +FBA85D7C2B5C983F6AABFD65A02CBD89869B880765B09194B888CFD57D34429581F505B2 +453A0DE55E0A727D9C02561CC3FA538463AE65D91A36D71FF34C1A65981DCA294989C8BE +053166A8627C01610DA5828AB836279AD2C688FA8A96961F4F03B4E0A620C8D60D931F1A +ED6DC195A458D42CC9E18A8290EC050E6C832442857558C6F3984FCC5FE57E3C641B0CB2 +7DC78113D3BF91DED8AB6D2592A90A323AD5FDF725BB3ED60B9BFDE427DEDBFCEC35A147 +1898A2BFD5ED3C39E764393CCD5A41FEAA287E88A828C228B37B3086B91473B913DE0B87 +F5E0A3E6379D1110830B46BD1B9CF1EC261076AD78D5C426D9578589228BD2D0624912BB +A60666E1767EF59F6E88A3E2BC1CD2FEC4E75F8162121E4F1E91E5818B78202D31B8BA09 +9E1B10D90BBA1BB994638CD6E1A53DDA70C41EA727958555F99508899982FAC290D739A6 +A27DCCF89B199F9BB895694CF97349651AACBA7F5C6961D888FDE51CD1D039E7A6B4E249 +D2503A5FC4DA4AC3A4D52E1908CA72733601F38CFC77BDD4627A99C7205644678AF0A119 +B4826C816E4EEE5763B111E7F6F64E94A2E21B4AA165726A3BD4BF7B2D029EA2A5F0D8B2 +121F13F70944F7C4E08BDC081E783931476005BEEF2AA44895125B603E1AD0D5630B9839 +1DE18F15A89B8CAC43E7773985BFACDF40A4AAF72B32B989A97A9CE012BDE6506048910A +950E81528F6836E33E4EA06DBEB483DEAD014F6FF4CCC17FBA14557B93F07738733CD69A +FF3FAD8D030AA5BF7C0DAE9B2293A85FE6685E4CD06D3A3A5FF69233DC41A9256DC96E56 +4DC8804ADCB562AF017EC5371CBE336AA48B8A47353657511C8C345E5FFB5B2D1DCC385D +7ACEDDE127E1C1396E34A63AA9EAB19E3A03542BA99C15CFF99AC5ED8E765AE6A17FA3C2 +6D33DFA0CD291856100A8EEE51D4752A3BDF71E670CB1ADCA1A946F6284370CDB73A57C3 +B92D7ECDE804DD72981CDE024BF09E1A6FEE156FFA5EED52EBFC63CCA6B99DFA55B7C0C9 +D2F6CA796869CED592CC18592A0E52F5BDC1FE6181E8FB38E7F7D8409CC1A52F990163C7 +D4EF1F3C52CFD0EDF376FC5D8D0ADD14E01BE5A6C63A30CA12F10DF0E863B661F94E5187 +66C1640C2E53B05E44FD7F6BBDC704BBCE316C416B8F5440B2007280858AEF3A2D5858DB +174B3A4C51D4973F227D50B433F444C2B015EC09E62FEBA96F71589269374CC4D860F0AA +DDA5838983CF417CD294FBE3B66B3722957C50811482BBEA6E67F64B112A1D41B9AB965A +163DA85EAF8808DA9B8CEA7873C37FFD40CDBD5BF558A687F42F4D85D179377585FB9399 +4C0F941F378C9ACDA1FE1C8000D434F8A6E25761AA589165D3FE816E1121EC41B08C8606 +9633A2FBB88A57C69D0C960AD5670E3D8A23A8E932C56BF10AF7D232B4F509DE979BA0BF +983A7AE7C63D0BDB98DC4DA7F83BA079689FCAB1D3F616FB4F6ACFA1EEDA10154113CFC7 +6F705B6BB560FD91F513B371D645595DA6ACCEDD983F2535401E8805ECFA30A50C0CBEB0 +C9A167E95ABF41E46F6135F16BF263992E53AC0AC674595752E44B646D347DD5006477BD +F689D53471714018FBAB73B6DB59E38E888F156969563AD9A60D1F1DBA5EE335891CEA6F +E09EC37A81B1C01AB0DF819909E7CEB02A652A570C3AE5A709C50B0A84B2372A6BDD0A0B +2D74A26929AE6FACC2085607F274983EA9BD6E4EE5B335F0BB8559031C6A1119FA896259 +1B9B692D9953CA48EDB4DD5620713A7D520DC49539654E83A41AD1E1981AF3FC348456A2 +FDB2615E84A0C04CBE72C5583A0EB2DA8E16BC093343218BFA7B3FAB2F392292642B8E7E +D6D7F60EAFF40C5FE2D5E3922119967C016EEACAA12E9C9BB9E95C543E4142D8FE5B3C59 +F12272D12A5AF94F64B2AB0AA81B5D4E6F021716728450F4FD3A4A124286901F2E569B7E +4B7BAF1FA08D9546C65DDB4D172F0A36F17CFC2E3317A8F602A65539707FCCE7D3EE5F8B +97D4A5EFC7BD49C272068A590A031FD988BEC2B4B243195902F059F15F513C1D0A565F3D +1CF75776E45F913C074E9F92D29C4C495FB210526FF826B16010EF716E721210390F8CA0 +BF5DB3CBEE6A2AA442287C7547FDA4162F35603BD98F76F2DA93566DB89DB7DFC181012D +69C6F57A39A6A11D7BA61F7C5E49974AEF69E08240719EED3BDB3DB39BD1AFAA39DC5B7C +72E19373CEE017D3AC8BE09150DB004D1933346059927C5C3F11A21B0A52C3A9C5E50294 +8A5A29E0C4EDAC562371353454EB5AB59ECCF71656B1B765467F55142E5B42DAEE517065 +04854760D63726F38543DDE1415904ED707A8C75DF3CBF6412CE799DE6FA7B74F92FBA55 +8F75F16B730AFB8BE0425FD7B40EC1ADCE67ED48E804396F104CDA42F7FA7C25E9C45016 +41AAA410BAFE1856E1925DA6B6FC2CCB5C6EF5C78A65B36D1EC2B7C6D65769F69F6DBB5F +556058598F6B7D92FB81A280D60796462F40FBE9623E7FB44C3E1E3232B30421253863C7 +B1518A8CDF2CAD468632D726AD70F61242EDDF20EC15D9E502E8668C26A583A9185C88DA +7678483F8AEA59F97373701E25F698B3C60B8524BD34C596DC7FFE284FD59D4F2765915C +8562A919E48AEF5882B04548426B3F91CE52AC4B0C6B8B055374793DB94D87F37E2EC09C +B5707CFEE332B79327D5832160FEEF1E7256D2D828B3B932CB9596AF1A74F72A5A58B462 +457EC9622EA70C8E7BCCA6010C62D375A1E4B819642937E46BED83AAC3447C9EDDD660A8 +128273CEDE717E93D46C8A445322AAFFE6ABAF50D6EB8647FA9E75893673BD3C3298693D +CCCF823FC5CE853B5B9B894F8CBC00B0CFF16D662785C8A72A83B6817966D27274058804 +361C58B673F78C9CDBB4716EEEC89B7A80BD85003AFC1CC4287ACE0F4CD12DFA940689D0 +357E71E2BD2219BB273AF131B7FC88B0F59E867D7968E77EA32736DF6AA0640D1F7EBE54 +7FA6B4863B3A6D3E61C3F86E9A621B64290EFA830DF1476F70145777B02C9A4EE785BCC5 +1293915FAF0728B0A3C76370080BEFF2C121943FED45A075B90D810209D97AF4A58BFDB9 +C2BEDDFA79AA0398800B0372CEF1C6EBA3639F980469D048FE41FF7F3E62C38BED78439A +172D4974184A55B9F7EE80E58A05DE801577AE94F41A5AA0A58B10A1218C6B211B13EAB0 +5E8E685B4AFF1D9BED162967D352CBD30CC256F5D656189C064CD04F636730EC75C6DC93 +5BD33B933AAB1AE67B9CFAC5CC422EEA6FD1D759D7A9076811D5C16D251DB24F3C84A66A +1B89B0BCCCAD2E602F7CFE6FD81F40B15FA59CE4FFCE9EAB3368555B584A0E7BD1230586 +9BC6935EFF37C0CDA1A2B048850EA555E500048D12DA09F1AF426AEE319B3C29CB084C81 +AF6CB695495F4C4BA7D82F0CCD5B1E37B5B54FA0B4F310946A95A24E4F0EAB558D5DBDF3 +3240960F738A090A7C48ECB77DA89A2F5BCC71E59DCE2CD1D9D60E4CF84162D838394794 +C1128C29861FF5B6D853C2973C5DBEB4B2EA6DC8BF9F39C128FE6C03071D666DCA2F2F59 +034E01F861F6ED0F2A47F929463866D9747755B19E87EAF688F63FF61398982B2B578A6D +1126D12FAD575C6748D9A869280A1DF1A6C065C30127CEF0D320CCF0B70AFE78FDF8F85D +73D92B58CF31CAFBFAE863C733CAF86F0C21CB12BE7AB4685B75192707ACB49072E4DF0C +CB5C8820B266096773164D42D8700F690F3875921B3BD06B5A7547F7F28C0D66E9C847B3 +A6ED4205AB7DC565AD386EF9E9F26300B7DA7815D89ACEF70F7747C4839E077EDAF1425F +516B28DFBDE2A50FA09456FF518BAA484FB2AB219F869159D1C90A367C2D0AD37A41CF2B +F251107318239B0D2AED86B90BC5A609A9E23EB23DA7A9B3B09F5B77160D3107D67279B8 +FB27C672DD2C451210D8ECA64F38A82FFBC5B32DE24BB88FDEF3E00343ACF94C0F70727D +EB162B037C07E42FB61EFA6CD8716B76266AD0736C2DEA741DEAD3C8970856750E626208 +47177E8BA6C165EC9332E89379B0F42895F378E7F40A891EDE85D7D3B269AB3FFB162F6F +5523A5AEEA6C63A09FB477C75F48E84D80944477B3CDE2FFDE7041970DD9F0F2D3C200A4 +28939960C25D39197820ABC862FD747B6351EA1FADF7DCD5469293034E8FB6ED32BB93CA +734B4C6C7309CE8CE974D9464ABCA6FB789915B8BB8F6F9C233ED5CC1B3130481C72DC63 +B766F3C3B4E6881540D3B9701101082E43DFAE894B1EEFDCD7B60E3A441E8F42E47FED67 +CF5478A0E57424B19B6F2B110D7B508EBF532D37E86E4046A0EF69D7E188719640C5DDF4 +F1C8AB2CB2D1A03583E0BBD530CB90097D881466A0FBDC68C8C82C2DF517B0832A695D94 +DC0073F03210A8E9DA4340E9076DC29FEB24F6AF46D11869CD7AF8B03D56A9A9D4DC8B10 +714E558C94D505A160425468277FFB7453A54FA3A048F2E755B836757F590F976E4F57B7 +B34D0C1E931E0F46F665CA10A584111B63FC0D1DBBC583451A390F33010AF97C1A5436F4 +633C63E5FEB3F57CCE852A3264E8D6FC40BFC47AF469563AC79BD0FAF36DB986AAE2291B +426E4FADF2BBB75D097D84E4219B50C69E4BD6B883C399C1A1764BDA9BFA7C8F507BD3DA +043DBAAF1B2A1CED051407DD9904978A3372A237C63201D6AC08F45760F2A9F9A05E17C6 +3BF3FBF88F5C22B84A7C31A93DF8094A22E0BEC8FA6B5B8392E2FEE1167C9BE75C71FC61 +D96B1A64962EA9AD2351E4BC0E9D1251E08B32E46EE414A02E4BDA4EFC756B50BACAC527 +05358FA4E0831DDCC2EA109E658818F4AE3BD1B529EC8290068949CDAF8432B32D761D5B +A189F6D754A6BE6AF0F9B7228B4A0CCECD9C1612FF5267AFF1D80CE0DE78D34AE50DE18E +45DAE4668CD8AD3CD83FBBCD1C9FDFD0DF6D1EB98319F2B0B8FB3160ACF30A50A76519EC +5C6E29AF1858EAE89DF07CEDC156242C097D510DAA16983DBEC439FAFC4B92F644880754 +2C0C9070401A365467D5B92FB0265E36C043DD057689520146CE13AD1202A05DB8EF6FFD +BD83EB5B66A7039819EB3A3569D7934BA17D6843F33B90E29B3B70E41B6E3952627B50A7 +9B22946085E1C3B49ECC799223301FF665267577EB42EDD3F96570BE473D8FADF6E20977 +B828BCCDCA9E99B656F843C421C29C3761AC94B209CF662A504BD6F476270081DF274BF9 +CFBE86EC832EE64AC7594107F77A6F5D32AFEE61FF06EC0916B60EA34CC474F77C8C9360 +C9AB3DF8D00E46865C787F991025EE0B8753CEA8CE04D3CE619FD3FC7989EE6DE3BE2DC8 +DC4AE51580948374F63C5B4DEF6A3218EBFACF11FE052E68086354D82F7CF192A869EB95 +F1C3B82F9C9BDDA35B7664E7CD414756D14BCB4C85F0277055D2C024F97CFCEE848F1218 +C0465D65EE3A2460168E96D8BC5FCA42D002CF8CCA740E88B4BDA4C77B630564D41F6F1B +8E2C293F18B6F11C43552FC1853FA0E56B4A9D4C8B64E36CCEBFB42AA4025DB07A232EA5 +940843188D522F2DC1E18009431A2466B9F5DF0BA85735257068DE21E97893098B8017CA +FF59BB33325E98C8075D2729BDB3EEBB248E070312A158DDBC5F8781335377BE1F9A4D46 +08EC02CFF83D7D2C0CBE5EE3DF3A8D011AA2204D89051CBFFE3FF73793C116C8D143C569 +C04FADA0F8AB036202C4ADA2547CF472700A6CB6F9398678A247707E56A071592D681E0E +1B7D3161AE15052258E9FA1E8FE0B898D71F8F01126DEBC69849A4A74631884F85DC8B10 +714E4D1E1956B81F1C6A1D2B686371FC3C1149A9BF24CC1517D0F91E6445E3175D623D7E +8EAD5AFC6FE9471C6819CEAE1B54E4291357E4B4B0A727FB86661F1EA4D3F4619887CA5C +CFBF0A7BE994EC0407C16A8AF8717F43E41A86DDC430CD2C994D6D8334B3787DF02F40A1 +E79CF18FEE729182E50F8ACFECEECC42975BC8E5F3CE308F3A9F69134264D5C1076F8B6E +6C4EA6DC3C20C6E49391F273E535A26A7FC9EE50AE0FE832C46C05BB0EB4BE92C2137584 +E7110638D5EC824EC36ED32F1C91060A536F655C67BA76BDCBF1CB66116D0792032F000C +85606DC9833581F4C1608D51B057317FC222680FEEAB0B39E8B35068A1AFAC8760880DAC +57D3B55D4B1A1896D50C6D763E7F9D84AA3FAB44492E73EB3E58651B2F165545D812CC0E +DE84339255EF752B634CCA91D3A1439FFF188ED53918FC5851DD87C737716DEF2EF6C51C +ECE2208476B3E08C40A2784CA7AF19353C70C7B5EAEB58203D1467C7B4B70BED56E1ADA5 +69970A0D10311791ACEFB789C507E55703B486B7E99270C89D463767F8454637321B9372 +A328AF3909C4546C3410DA87CDC2BF68FA036E08A0EC5166D23403440814FE86C0D2E416 +6CD26C987EEB9697AEAD9766123084F5EC5D85DE26BAABC45BBD878E585C07CF65C95FAE +0982B682A6B1CAD0CA3328603183E7F5DF27049D82D1AABCBE4BBEC41907FE324CDCF673 +92A65748DA5BED12559BB107ABD75A5A32B41AF45C1935C8855198E7E5CE55AC5E550424 +E55089A346F5F979506BB888AE30D1B7A2E6B1EFCAB878304F9A5C7D8646E1D556875092 +2F1F8659E6C6DB246BFB335BF9B0EE59951590891E58DE50973B2B9E75CA0722050457C1 +48A2B9C300D725495D5F05D770EBFA877CEAA1834C9F4F434F6175DD978B1DDEBA14E3C3 +5617411FB5F674A6268FB29DF3DE86B96CB9447D5277EA57925F7377FD6AB1DD03CA66E9 +6B596711F0071A87E01E623A47B3EA208D4C8E644BAA232941E5800CF2C0DC3C4B5C26D3 +4C38E37318ADF7F39CA908028FB22E858024A3905FC3FB12B298F5A44A11DF87FCD7EB15 +0C846266EA6CF4A2B6175E86CF6AFE500315B7C3AA86D1F604335F752C4047F296CBA798 +D3DBC9377C0D18529AD322C7AB69ECB3453DB53F695BE4CAA84F822F13BCFB78F03C6C27 +DB249DBEF37EAE3097C3EAAD54B9093139C8992DA550A5DD4CA7BA79CC58F10984F759A1 +8A3F9EF2B3CD8C4AA2D7DB6510EF0E86C9C1E876A7AC52551C42B4D33515637FD07C213F +3B91A63E333F0276F7F44E1DD1D1F759D9E1495164D70266EA56A08DE62D0EDB09230885 +2D0BAA1D4CE4A6B115030D7B0046E9EB044E15FEB765FD515346B13B196227AA5AC9C76F +272B6C2FB67DE3442032DD9812BE1181B4A35099239ABF44B2274BD7D057359C45DCEA84 +D8BC14C8D1D32BFD3ACBBFD120C24CDE608625C4BA3661E4038EDB5F45B7959C86643EA8 +FAC43E82B5600ACBDAC16A77E800507CD63399F452823BABB430E3E11B40B046E826296B +C04B5F5755EBE54A5294BD473FF5E4ABC08AB729814F662B446F83203F1620DD8FED7AD0 +C86FC2E50AD277DD72EEF9406878F1A416F16A834EB4202094FBB08877ABB6AD51695BF5 +A60C7C44C5AC2DA5CCEE1A5FCE5AAE9C07BB8746F17ABE4787BEF37862F760944C1E85A9 +2D796850780F6DD44A5172F3D0A2A677F4CFA0E40C06B09776961568DA8EFB910DEFD453 +F20F9748F2F0FC1D5A17541238225B1AC8E22621B24F9A7CD333AD60B287C176EE71C3F1 +6282B327BEF2D375ACC762D18DC468A656E7F4BD033CAE3B231EA1B8DE994D62110A37A5 +D9314CC49579ACB4CF85A7F7B9C41409FCF9CE7247502322D0D3344A193C61A211C9907F +242C2F0FF5EB017F1B77F2FD7B88C66246131BC5975966AC9E81A0396BEC796ECDA76CAE +5BFABB1A0FBCEC6ED3466ADF3205BCF247366EA693C774D215486DB5EE25A6BA41032343 +9CC5F8244D9F5863C52CE2F0C8D99AC7C26D201E2511C4F470402FF7F2B4C093580059CA +CF313F4E34481433F71206DB8579675BEF328E9011BFF3DE8D022338DDE02B66061F7088 +815988CB5C55224C08E67540610EA37D36D3841E78AA828F385EDFC3FDA57220D1988155 +80841533C9CF1DD3D0A1FCFDA06BB2F3A2B93978FEF0EDFD43CCFBA400301D8BAB8B9A57 +FCCD0CCDECF7FC72387D45722ABDF00E89AEADBE8A158729F64B74465C6AFCFBFA93149A +C42CBA17C01C029E88974C944EE96557BEC1B0B3C8C3CAD0B1F013D590BCD448774AD3AF +607F3AE1A0B9C8AB20CEFAE3B44F4DDA7AB0385906A3202D5BEF00E1EE3D7D746C16421B +AA4B9E2B27070C84439DDE56F8A1B71A0CC0AF02FF9DCD8AC122B1C3BC87A0BC820A93C6 +A35B334770DC4DEA570B0CFB4701A2B84DEA09F5A37A4923259DED0280F188E13C57E6D2 +46D604578B97B72D73F2F1A10BE0B56CC1EC28147876D45B4E25EBB8ED2467EB7A482EB4 +CAF28AFEE76C9DD02C34CB329AF07630EBE2B6473C415B0FEA259E79CECF2713303F582D +DF2B507D97FD832A25C4C0C8F531CA12C0E971DBA26F9C6903CD2662FC141EDF3B047103 +0B7B990435AE540AD4A9E8BF58B526A82E9DBB76DC2B12D7CAF24491B082D8383D925534 +C443CA3892D7213A768CB30DE5370A0B80B29A602002FA0DEFF2CEE7CA08F36C6588F4EC +7F0C6129CA4CA71FA746B016F2179E2404D812357A770C7FC90763091EBE3FF724A019D4 +AF46CB7DBB1467D38132EF68D342A0BD675C58FFDB637540C36525B6C0A2E083CB180FCA +C47985138372802E3C664951CAC4AD20C39A270F2E188EC9BABAF6EB85151F368C061A77 +E47E19246A5BF0E11C483865E3FF1B8FEBE7CD2D6E88A63856FAE1F9786A630EF2182327 +79A8AFB30B1795B3E2067FFD182768ACE773729479D8C88B6DCF70E0810B3888DC189F62 +8E0FB822842885123952A8476B6BB1E80FBFBAC64EEBC76063058A59F18BB79F01D157F0 +34C68463297C14F56582163520C5170DFFAB8E8C2289A0C7D98FEF9C6D3763D5BC2DEE13 +402B099AC4AFF19341D0B104F2EFF754D073B411BB4E5F8461D9E74E471638CE2F22460F +4B17AFDB86525079E03F9D53FA1FAC798BA4B1E8934A94EA36644E335AA43E226A39CFA3 +520D1B38EC3A7660BCAF9428CBD29564DFBA6E588ECF65C8977C753FBA30D3C97AD33536 +34B3E8036CB25F49D7D326F7A4C465EFE9DCB3265DFE95D01EC47830A62D9111130685D9 +DAA06DAE163BF469DCADB9CEBF10A632D01352D426D732AA93042CE3F6312E6DEB456EF0 +78656751EF0D7C1F39CEAE7C27D4E55C35901C45547AAB8ECF631EE91A75B926A8EB877B +B73253F7BF74EDABB131705E13BA733CA7CF88D3D6F59226D9C6EC5C9B0050BF104C0ED5 +333CB2B417DD1BE2BF416591F3B3D98C0E711111843D7537F3F8CDA6C9FDA7377794E11A +34209562AE12078766488C00C8EBFF7312055FFD94D35B56933E39A77095206911AFE9D5 +C2F2898784E19E06297701AEA9272380F34B66C70730EF6AD704340CB739F721A749BD33 +28CC458CD29F363F3C7D767AA4087DB56607A875CA33E729D6974437479A70E3D1524045 +3B9E06DDBD5593FA8F894AA18AA673199D2DD71AF92FE8B869552FFA10E9855D64E352AB +B37FD730FD30FFAF7B32FEE7869A78A035931977302369838F960F2C99B0EEA106E3A8E7 +BCEF05F2E34235BEBE41CF85B9DA4693985C7691B77BBC03DA6C3DA49512681DAA302AE2 +13863FCD1EE2C1AA2A9E02E073C10F25A9FD798892B60A79727D23EA39591B617E8B08D9 +77F2F7B60A371AC227D2EEE3B2094153B619A5AD541FCAB29F27015BBFAE6CCFB1CC2EAD +0D6C1A4E28A67FC438E476109AAEB67956634812A0BF3E9257163A82B0A57459F1150C1A +0F13AD982CB26FD01CCDF78C3C267B372D8E331129D4E83609FADD5DCBFA7D18D93D8367 +2F422874A6699DFC45E2A0B76A19935CD20A66CD278CA3A7AB9893685475E0F7E3D75C50 +22B8A9F17E1776B2960C31A972B19475BCFC90973CB642823E77E8455A363F66524BC0A9 +22A24A3D2DB5E71AF729A911BE97EDE5971612CED400BE5A2C961B2336F37B92512AB53E +153434325BCCA89A56A9DCC8694BE02496F4BD2DAFE14ED9F9ACCA3807FE1ACF6B0E4D67 +0D5AA3340A2217EE7BA81379852965832A4DBD1C24025FDD3FA69D7299C7619344F7DDB0 +484CA724CEEFB12BC12456A1E025D4506BCB9D6DBA5E9FCE5B7333DDA2E4C2567CF6CAF3 +B4247A8B4724AD346CABF550B0048C3FE0CCF9972CCBC27DF540E8BF4CB21938731CAA4D +95FC5E97DDA9572B4D80D4DAB8D1611045BD4D167AAC9CFCA24240CFCE5590CFF8292A6B +BA2338FE074609B6E79447E9719C6E742AC8C70FD49F86799CDF01B6991F7AD227789AF9 +EEB32C33DFB91A6F5D0406560F8317D7FD29077F0247E018B8E3E17F9E45D81379031D9C +1B0F488BDE49FC8A2EE6144858FA62385BBDC6B059E4DB9EBA87632108356196E0635846 +0A64BD1BD2C84B65D68CFF9C9F2FE26EDD945568DBFE2DA290A494C60B6518EB078BCA18 +4520D7A760473C1EEBB4D445DA7DB6B07CB64FB9DD54BE65CAB634DD2A84E9389EE0B802 +2B36DB3BE097C5B1BBC4730391B20177893535ACE5DD439EEC48BDEB1DC360841896BEA9 +48CFC8E52DBCD3395074C6A452E07CA86B48C403386B24BDCE0FA1AC0457E66555A37E6E +B7F1E0C4DE61A8DFB64512F17C59A8146D8A696D9C78287348AD410C30C390346EB85479 +4A1B95FCA1A460486C75270009E9259DEBB8EA4DEA89C92A88E699B33BE47441D8531681 +2006CBC6A79BA334E32B9E8462FC79214050BF435FC8F761FEAD9C5BB2B43D478F2D9DF9 +8E852CBAB9D2027BA02249CF0D51A8E9E67FDB7216E1FB9AA19CFABFEE4FA7E750D51418 +82FFFEB96CDA1D70E30C522A46536000F848914EE4DB09E87C87D9D6A4139E380A8BB504 +DFAB13992E51643100EBAC3C643B0EDF6ED2221AB1AFA7CA0AA8638D487D46ADB2D87428 +3F5FBB88784F373B9382BF51B014B7BD5B1AB56E07708AB0F86BC92B19496DE0FA422436 +D58E13970762EC3F077B5A5D13F5D846F25EBEB1E5BA587957888E0C799991BC474FB65A +0D8549E4C71979EF3EE15067F463605487328A1C0C43424ED2A8B2A708F882C1565370B1 +F34E3CDCFFD50B425A39D4D77E4462B211C18055E0C78468ED3EB67DD723E90565332C1A +E2715A7C2280CE585A2C90C7ABC6498030690C6404042035E3409AE39DA7423922C05DF5 +89082510AE3C530C41B28346DFD3EA56DE3902D7628839573BA4A407A258630836526D27 +2EA67666F6DFCA7371964BD4A134D8C1636683C1541CA1EA1E3E0F21056BFCFFA1174DB4 +65D249623BC98DF5143D8BA83615803D8AC0331ED613FE6EBC2AA378AD31156CA35D3A64 +CE42EE3AA148C9D8AF84CC71C0C3D2903939962E4B8AE3599D65A430FC53FF8C861E6DB6 +3D40A050AD7DA591CF7022DAF4C39DDE990CBF87E5FF207682722E133B2ABBDEF737F861 +B8894BD16849E211B45863B0A04A081DEC99C417A1A868F10FC1FE5CD1CBF59E130989A9 +9A616B1E371E8E1EBA3798D93BFA918679C4F111ED67DFBDD654CEB0F013D051B5C638A0 +6A3D87E2D67A5B5778C85D591795CD3AF53C402497274ADFB41E82778862C8FBA2491348 +FE69F11A49E1530714290D270410C4176BF193FCB0B7A6A540E2E8DF659B55C31241A834 +2181080534AD74DB0D901E4AED75DC4947E76C6FFABB530216F365A8E15213E6CD93D442 +213AF03E5C31D88C13CA104CAC3AC8C61D7E013125A5ECB8F614F4C3D3119CAC6B5887F6 +6E0A3FBCDA41C9C70FC9CAD83AFBC5963BA0BE0359B116CAB3E22AAD48415912AB97DF85 +F1725B8CB130CDAA459C4B1160046DCBA8AB1492489A1BF0A78D6EE8856C3BF6675200FF +01E4C1DF4DD6C5255EA056C4948ACCD662722BA288D24112584AA6FB8BB2556D3E387F84 +853E15C9BAF3A95D4538A77DCE6D87EFD432845C23BE92930E4C515524BF88FFAEA89627 +D063D9A0C33868D452E4C919E97A526833DAE1A520B4A73F799C0596B627F8D454F5D294 +3CCEB0F168701B3EE0372EC4F2053CAA10A03389D51FB0211E5A2BEC78960D9009C7F8A0 +1098E47636371CA07F63798C7D6D28F3D543B7F045C148151EE2875257505CC73F004DB0 +C80FA641966E382B93268367FE1A86E26A3A441987243402046C3A644F10604D63BBDB68 +102E44331F1289A2430C190F8D1C117915AA2EDA80DB1BF53034F5FE0381A8C86E91FD02 +C20FE7796311639A78A6354320109D59BD0644E07DC2D6E7828570FCEDD755634D808390 +DF3958672AE4430469FE4C749464393504B1DB4FF33A75FAB1A3900FB314E16B16E9EE54 +64FE7FCDB952C502C43EFB543538FBF7332CCCBDA721F15F0FFE3F8D07C3F21929FBDC94 +7585286FAAF20E85EEDA2F24FC7DD486448953BDA34005911B26C054F3F7DB8DFDB79FB0 +34467B2306B6B7C0DACC36605B902DEC41741AD0C8A8674A6EA9F084CAD9B8F5AB9C228D +26A30D2072F564A9F686824684D6CAA6CE487EB1F180CAA1E0A05A22F09B2A652AAE3CCE +14B0ABE95EA58FB109FA2D69F3E6888244F910104DF7849F2560C9641E290A2B58A90F62 +C6A712DA56D46787AA8B15E15E27BC88C3F597253A993E19D7150D4B5A4EF00B30912289 +2F912C9A985A2B467DF999F850068ED2BD6E601D8DC62DFC549EA79D707F964737043DD2 +71497FE7A62E6E17C4BBDC28D27E332A467C49B38D35FBBC078B755A1068BDCE06ED48B3 +CFE23FE250426E551F5081D8353BCA6F48C4D5E29C9134F728A77DC014CD81295E94ED5A +3E4C5DE2E668051112C6D512E91B14001ED0B897F95D5D5CE152C743A34488E4EA5603E0 +8B500C5E8CD0F289CE321AC01262C00CDFE79EF7E5907106CC94B38B54998D648158BBBA +896FF3ED5DB7D4A65567DE77202DADF99AE89B0A81E795AF26C989C0A268B7B3CFA38EC3 +E9F47CC72DE23783E0E98674871D632A80127EB72ACB44A32DDADD2826B7FD75DD34363A +9802925456A9C75D1A63593D7C7A2CA85404C9AC5F17DA23D3B2FFA177740C9ABC114453 +9096CCCB278AD177AC129A12B05D1DB56B1C8B05F0232D28D33264692E4CE2C5F738AC0D +DE16A2C22336CDC6836C63326BB6ADE37DFC0276440D4E77C8748915855D497E3E10B8DE +5D1A6911242BCD1B0BA1E521359B5141DA815459BB250A85F1BABB939428B972367E96F8 +BFAD9A9A5DB65640FC2ECD1B8E012F437D156629605301F68A83022C66D55114E0A9E894 +0EC3A7D6C12574DC2F13C70C92B900560D3D2EA6271437F57ACFACD10998DD584134832B +4DC51C207173824B4F907435F4579505CFCB0DE2710BBF9C562EA874BC4D1CD4443F367F +80226AD929CD3CA7D903B0932EC58A6B577306F7AFAF505AE6ECF6204B7C22236ECC73AC +87C5B84748ADC6DD20644B0F279AC21BCC70B0974B1E98B771203D6BA583EC68AE2428EE +DB849E2FE9AB201D412779871E456021BF7735F59FD757D3B82A2D571D951774A231E9CE +DB89DB0B00E57972FEC2BE1473464C965D9978BEBE027F4BA96B965C83C4642928F240C8 +C6E34605182C4D48239AD52DDEDB18715CC463E9DD9EAC3E423334E380B71D9E1EA2BC85 +6CA424B9289185505FB5230C10CC9AC1E7C527CB950F957168350E7A4690C52D4E994195 +36B5B2F662AED95029784FF3CAC75365449E8192103E85E5A5BBD9EA92BA1A33F5BF3C07 +F7E249904F35D98297A35761492FA533DFFC52AAB59C0603499710C9266FCE7AF71CCD17 +07EB519BF7561E6CC6CA964A091F944F1FEA70BADE12416C70CBCFDBFDECCFE17FC13DA3 +9B537FC4948C3EF99B33B5B77B575149A3B960717724D77B5A2EBC6FA7FBEAB74505EE9A +120B384013684C4FC246E5DF1C72904C5CC46CD98C078E348C470C2D9FE80B26616BD146 +6AFF56EEF2BAE0409935CC85F9C0677DE18C304CD3D9D0C42E777920CCD17D3279923439 +734CD43F1CE70017603E8BC790B6536016436CCFFB47578936709527C3755581B365EEBD +1E9DBBA2B305A64930C87E1F194378356E119B636D45F683604E22485328D19E2824DB1D +129D57253A7589AB6AF57F56E9983CA2DCAB946D06863A9F85A860D1FA777212A8D2B8DB +E7EDA1A901DB70F486BFF4695B3BA2EF0E443F87280BD82210335EA90A9018EEE52D9C3E +26C08A82076F174B01DDA052C7BCF761E59CE04BFD12375D04392C73CF4110DF029F41C6 +2FB0C8D5275857B84E5F0C6EC2DB27679077CF1912AA522887A9D0DA75DDD0CDD726AAB6 +FDF02C2546D0721ACE715FF5904EE52F3B0469C6ECC767C1522C114B662857F05FB14890 +3E927D39BAF05D3D85F9D1E0CA8989D5AFA42F9088289998BD422E56C1556C5506D93351 +8A313AB966CA8AE369474E3C3E61ED6FCC1FD4E190E8DCDA65F4D6CBE86CD66955CB2DFE +11BD578A277FC4CCD7C73B44029C4FCDBAE216863CB6735EDEAA35EB914EC8A6F57B0230 +AAFD580737C9DC91A39192FE58B98B0DADA0373E6F6EE30A66F664CA11F5E6D7BC221CDB +E1039D67D317900574BCB27C5D8F3F84C5FDD49FFE5D8C1FF2FF160981BAF653FC44D19C +33A2DD9B18497A3C1CC2A87AB080F39AA7B434360733F91D8815FE29A046F9C8EC1616AE +1FFFCCFB9DE60E8AD1E2F9856F74CCAD5FA26A1A15D3B81613B2BECACE1A07F2A683FBED +AB23D39A515FEB186715565F3732C663EABC8B0ABE2CEF70D9812DE0B8233DA1892D2F16 +E551650A097E6907331A6F06FDC0D159F08A8A1012FC9667DD421405B09BC488DBCD72B3 +2D15D54566B858C0CB14D7EB591EB58C4C61E4A89CCA95EA78BBF76BE3DE2FF49286F4A0 +41DCB403996B18FEF60A07220F6E0A3CD2EDD1492C93662398542BEC29453C3975C9E9B0 +FA0F5E3E5ACEDCE222D4D5A1A3DAAAD27DFBCC2EAD423D8D67A00C7F8B66682CEC168AF5 +52A639EC758C65DA1D296A4EA98BBEAA87358166BD3DEC7EF724B34A5BB440FA2CB36FDC +163292CDF1BE9E828354CB8F9B28D17DBDBEDF4DB850126C4072CF9ED3C4D3A3BF7FA9BE +5F6B6DBAD11DF57E6142122F9644C2915D4E915867F39A7BE786D1D2F1C9BF24ABA46D40 +E2DA32712FFBBB07529750B2FCFE14269DAAA3DCB17F88AF45048D16A54AEC645A87F7FE +06A843E9D65921C63E7E9FD162ADCB84E0A46259A29E04734A447158A6501EEA3D40889B +2DC9C945A3688F018C1BF849693A1ABBEDE397DF6E3DB71C1B4397E0A600E699B59F32AC +9DF8C9AE80670204EF7BDC61F1AE4534E990DAA975A26F26B6E44AD026E5C4AF6AA8087E +4F2A0BF2055B7B61C2C7F9140F301EC739252F755DC8572498FAB49F66D6C073C19593A4 +82155BEB06EE04D7950DFB2E67C6648C2AAAAC8727F83A5E195FE06244FDF8AC0334DCD9 +497AAA571DC490A3240F4CC4DC5F14BE0816E05356F75255072AA4EC6EF524E8A6206432 +3A268F4369290986496FB10FEA939AC4F6639286B6C46871AE21A24AFFF626774EA79961 +04E304E4AF97D4A154B151BEF4FEFC189B5C4A937B6AB0A16861C4FE37AE52A6FA70B1E5 +C3E72C69100EB33401E1C51BB985096BF3DE3229EE0ED44ED76C5338CEA2F39B405D4362 +AB8EF09A0648C835DACB5697B55FE97B699BC61F52229DDBE2673EDB704D7A48A323F63D +121D25F4013609DD069FDEA816D1FD749098D2D9E16DB63BCE13DEBCD52DFBE3F062964B +EDF5ECB154922C1E021DC13FA0ECE4629E6194BAD1DC165C96F7D764F6307AF084B2B293 +F353DC0900FE772A5A5F642C074B3D3BD52C5F1416F0B0D2365CA07A625AB7607F20C8B8 +AFB6B89AC456BB3C5196AC21E976438675FEB49AC93378048CBF69BDC0A028C5BAEF39E8 +C4B009B0CBEF2979033E55912FD8664E0116CD58213BED64359E5A68F01032FF733F8799 +258724D01A2E1B7953C19DAB829184601545011BD76FA53C55ADD11CF5568CFFF5A1CEAC +8FE43EBE767045975029E210D481D6F0AB6E403546F1C72D4C17466DED4A0C8A071AA7F3 +C828FFEFAC73D46A1A461466CB132D0283DBB07271C0AE4E3917DE5FBB22A3C0CA6CDDAE +A500192B7C7331EB1703A0020EECB68BFBDD927546068D107AEF60E2C9D7C77542D8806C +C1BE2B954F0A7755A9BA1496D8C62076A5B49CC7B8B07CB10D966A223A7197B69D4CABD0 +64AD6E9AC671ED3A7BA87A3D605BA045A8AF1C3DE284B527CFFA9FC5213B2D185FD73E69 +9658DD7B97F479BF66710B13290CA72E16E8BF0C3E16222730C83706FDBFC39DE6B3876B +C3AE08BB9CDC4A3F9904598F68F50375EFBB60E0E2BC63F20E4A133DC1A86DFA0875B3D4 +64DFAF465DD3DDD0323EBE52E5A7C6544CDBAC27B8001B0B7F0A219B99C547154302966F +301E4BA8EF6A29D7B4F71CC91CEB83F567C4ED07F16308DEEAC5C10B906AEA5B308ADCEE +93DD66850765EDEBE947EDD62749C9DD4C22D81D7310F6700F49D55AD6DA522A30D87088 +47B08459299C124E9C5446D5A01EFFFA7A1B9C4DA0184DF2F9C33E15092C9B94C6A1A152 +38BE2498B202534CADFFD96216B5BBF0A8C93F5FDEF9711A38AEFF2D2487944ADAEE7FD5 +1C4B1345D11030312AF66BE535150F3D944CA32B86B318713C4DBC8CC39C425E3D939C3A +BF93F86FD924DFD1067C1A692A557DA5E2E12F7E620FFA9497353D0CF34824B467FDAF82 +63E4B2CCA0B3FE909D5C62A24733575FAEC6892CD7883F09B2476C1796D3D19D89AD2B5B +6AD25BE6920947AC99CF196F77523D2E52D639107D5788AE985F9C59E56895317DC8E3C9 +44B05744201FFA75CEC2C0C1B88BC01AB444D0A63967C93CBB54DD6248D8A2ECDF906D65 +E03BD0C920DC424755EF7DBFCD9E75554D139FA38969E66CBF914AFBF161E24EFEB3D5D2 +3684BD113C1BFBC3DBDDA1DC334C79A4372D1B2943AA534393C0FA8BF6DAF9A89F6A941E +A5234C56DC788AA8FADC705FDD87B6E47BB5C6A175CCDEC1E4C48DD6C8425103157ACCB2 +70D3E54D16E609280F511A5F7358B9EF8DF16E69C970F465EE188067C619BC80EA9504F9 +4C55667F7AFA8614C87514EF2BAE3F9A556607F1BD4E686D161E3B8F2ED6D7C056E7ACEE +24D78CEACB7DC5A70AFD13D815612483409C6B3F4E736CDC0DB3AD2637905D49D3B18BC1 +531F98F22F268DCC658B4A6A263A984046D643EAA1BE3FA1A0AB42432D7214F2D67BF68E +C36481229EF94AA4D99117E5DF72DEA397FB16F71E00AE1EE676545E647B2E5BA86D6C41 +0F0A54B270FA6F1C0970586F3FEC2C9F5FB23C6EFB6A7A982BAA45F50135BD1D46B3CA7B +134C3CE39F195A447B23EB3532EE7C17A03CEAC710B45FA419D022EE4D59E3D03ABCABA2 +6D5854BF6FAB1494E0817D1A884DB4EE52A230BED371F18B2E8BCBD78AEF92D0EDA42497 +FD3278222FD696B07713A0383FE3C6A1485950B6402E43AFD1C293228E17CD9BF76788EB +EA31D28DA718A19DBF5908DE8B9AE27F1F74A5EE23859901E47BDD323385C3412A2FA672 +8D542AE01690894A02FC14084E48389F7DCFA93AE87BBA8B77C766394C46F8BC3103A69A +441D4BB7035003E242663D2E2DE99AA7CB51EB473C3F4DCFBA36F1FA0A6242736A73FBCF +2DCD98BFD0031485641FAE1501B92680A347059ADA5526903E7B2EB28582010A0816A93F +8A921674C87EE149D80820C859E8383D1E27B88665E1919D4CC63FB38A162581D08235E5 +99410FDB67D6113048EE02BA570DCA25FCDFD216D5E609BCEE6844506300BAA6B0249547 +C5B0EDEF6F01B97EC4996EA1E997211294B55779298AC81BDF612FED978BB6A82FCA144E +455B41746D2CB7A468324DB1D179BDE9352ED8729488623F1F4F6B83609A425F12374F2D +A058510E997DC7BCED1C4D00F1BEEE0D7CE92C99287B965112994FC2A0EAD8A6D48C8A3F +37D09BEBD6BA74F344B4630FEA04951CC3D320094CFE066A9D1563984074A678701A51FC +B379148165AC421D4FE67C2046F98DFC638366E55B958FF6753E24704BD9EDAB877CAEFB +6C6CCA8B1753940EA08A3284DB2F831F5562F4BA152D94DB9B755AD4C61E482AA018D160 +020A03BB441DBF1A0158E19B38E85B3883AF7C8F4ACBA54A90ECEF5360819159F7B23A49 +7A6D75B0CD2A23E5F94718B45550EFF77318CD7E81BC64B67876867114340AF64CBEE039 +709FDD10EDD1D841F43724DD464501E523D09BFB6A6674DAC7AC4D7D8A7D4CC8DC41CE74 +5EFEAE2EBB03189D6B908195CF644E621E1417FFB8DB507DDE8121EA5CFA4F86FD1D4E2C +032666342DE81F4B4A726D9C2E053BBBFA8E6EE04C30A9A38A6667AFA346458E8535E6CC +D7D81614AE3828AE428BBA8272C1A3D3118AC00DD852B112AE85217F21BCCF879824764E +5D70F17114F256D71D0E865CEDFCC39759962AA8FEDBA34AAC01DAD722BB4F0F26D69660 +A5886F0B58EEDE6FCED9DD72580EB3D345A3519FE4B20CC154FD4C9BDB92E9CF953B5108 +6097A5DA323B48124F004AB16035D5464B37C5C1F115DE6F9D67D42D179C70B42EF8AE2B +533745B020D0C27E662446BA2E2704FADAB63CD2EA88895F06D6A65ECC9FA7AA0D904734 +66E3EBFB475B7DE4DFC639B3C1F24F1C8E15A6CA4C0B890EF2F848925EA54372F662A899 +F72A0E658C8812C076C1280C0321493AF73217F48C189F3D5B05D590518CB5BBABB38BAE +7DD209BA73C47638BC2E125F686B01D0B69AAFD1579EC5EEFEED33365B0B389E48B5EFDF +8480E6F60ADC2B291FBFDED2087ACB94658B3AC91DD89B27E46DF498C586E74E9639FE94 +3AFF60352BF9B9CBD6D747EE9EFAD079F13F362DB2B3B6BEE70D0769C2FAD11E578C753F +AC2E13246D0C1EFD8DB91A72DCAFD2837288B2694B7F98D85189750A8ED83EFE24AE7DE3 +C1E6143CAEFDC3158A89432E6CD0D7CF76FD01A37FB632E75DE7E978A769A78FDCCF8DE7 +189C25EED67C42D17922B2E7E0ECD02A12148C847BBA0C7039F7641271048CF720B62657 +2C90A8E734EFF686CF8900A56CD1BAA4175FE1D956C8E384E8639B27C7DAB95EBB6D7621 +8E2F4FB19733E3D2B8453BA19542338BB677AD08AF33DF746BA3CE6145589106E8BD6402 +92DE977B8B647726A522ACFB9D608F3A2086BC0D571777CDD16B7C67D6DE8264400969B8 +4283A29AAAA9CB965CAD70F6AA8536F10CAFC0F011E6771A5D026203DB34BB67B643CD53 +3EFA2E2305C70B64C49BA305C99A861D4985510371FAABD574E293029616F056E690CE15 +996B9231BC5274AE3436797415A1CE9555B9CDDFA5B5B2CF1D52023D6B59F205050B413E +D2835B8879EA5C14241C8D4157C05B863F02E7F53067CABC864508C3E4573EA3DDAFD85A +6EEB9D9A4E4C20946F1CB9BDAB6FDC5BE017765A663673A7FA93212C4FC4A3A0A1D3DFD7 +536579D8A6AB08A3F62C4ED9902118938B3324EC14EE509465DBA5A7DB37BA6F461A9748 +82CB3F7F5AC826A622711A3DBBA6F9F6CCE8F9151E5B79AF081519224F9C7926249AD1AD +E98017B2C724C5C4D2E2B43DF4A581CD906FA42F734E0F006D4E2FA48FB27DF408F8BF48 +0975F73FBE94ADCADEBDBDF934E8B079732BE957C5F64CB95368B6BCB0914C4C6C4B1343 +CC697E1D56C5C8B6396652754A621ADBB8F76215A0291176C92420502063A45F05A73227 +9CEE6B197E37062422C4715B195B06626F753F3441C83409193A43596A40B14B7A627D2E +8E2DF6A3B6599BBF3E189C0975CBB8AAD384AD51A92B04DF688C7ED7F381A585793A661A +C57A6FD17944B8F8AB511D4783F1256F598C23BF09EE63531F7802EB86AA57BBACD6B35E +C0FEF97D7969F5B7FD1BAE7161D512815C7A99E6949B3DCB42604F2016EBD5A8ED4E65DF +39B0BCE9F1468F0CC6F8803F3016A4C409B3C06688848D6BC42C5458B22954FDC9AC300E +0CA3350A57E31D536BCD1B430B54939B1D9F6FA179470042555981891ECDDA2279273FC9 +09F7284A182219E9E488CF5BBAD809323DFB4F8BE7677771CD7915E46FE2D471A9BD0667 +7798BBFF9030135542A72ABF81B773F9B8CDA74427A947EDA4CBC79AB74B960E983C7AFB +DC6ADA57F5284B278048D791F6BDA50367DF7093D763BA62BA5ACC0820BD593EC2C0FAA5 +7C698F2052CC1389F4449529C0BBB5885647D6B14845D59A91FB46E556D14882DC39146A +FE98351D0D93486967B8FC121DCF5258CEA66C3A156CC055E60B2FCB147BCFCEC5E5D3B0 +1D5D4779B9C04F4F6C6C84EA66C9A3058FDD4F4D0D9BDC64E0667700A1FB54DC6949E547 +998A33320E0BF8739956DB6B6C1E79498CE81E3FC7666C8B63CB129172714628D1BCFFD9 +7302B93F7712FF9548E99043B89412D71903E6D339936295157B29C3CCC79FF43ABA8A7C +3D118BFB3C6BB430BD0CE932751792EAE59A1E1452F44006DB57B741BF8E8FEBA824624E +748C719D448B56D657DBDA89504C3C59B2A8F52D193472E004DE32E77DC04BEC1CBFD555 +141E7CF9968BAFC38CC322F734EC9D1A77BBCA1C7B0443F626FCEA4A1B000EA5250629F0 +30FE73ECD04A99D3FAB80CDB3B7E35B2D66EA563E8B552C0A3AD1A6080B91F4A72CE9437 +E23FC75D146BF9CD75908321C433E1D740CC7E4536F3C1B21786CD40EEFB1272421DA616 +40F2ABC43EFD01B9C8AD954B9223B0D58C5374AF7ECFCC8D92E729A78887BB4BF4B3AA5D +FF0F0275523EE1A8C507E79A7E778575FB9BD2C68D573CF1FE4DD89B70CE0399B534E06B +98D44CD700BDCA211B0A79CCA45FB7F6CB6DF389698B0279CFC9A686F84CD102B4CFF224 +B9712D26B8F6EB004413A729A03C13DB1793538113F314EA9A421957A71A623108717C09 +E231F3B418DA57E6B74F591B1AC8FF3135E87A2C0E17EBC0DBFEB9E060460528DAE4BD95 +D4199FF544176441856CF2162998BB9CAE3327BE0B0331B2DE7FCF6B8F1156B34754BD6F +E668A096BD8762482D814CB5B66C98112FA8EF724C1A271D47A6043E588BC5F963172F39 +EE634F4D433C885FCDD395204ABF027C55210CB8B733E36B465359DBDD074F6ED7D917F8 +C2D8DBC8E7EFA564CB194ECBB5C03E60254143E15AE940670CC156A6C40F8F1937FB8697 +3AB99C97CB43E2FF36FAA721F2EA3C675E53FA12CB838E0A40921CDAE8593E466B7BDEC4 +F7777CE4B9A7A8522414BEC29E7EFCF6A4FCD8CF872D5825A8743841C0AA881B2F4D293A +C2AB4CD36A780A58B20F4BF8557CA8DB5BE772B2790FDEEE20D30161FE5897DFDF2749B9 +018AAF5031017C9405EF04CA4F5FEB1C62F48A1536550F2D07625F84EAFC567FF88D0B9C +BAD85C30AF56163470ED619CF33C32B032A0DAEF5BD0F3FCF08005AFD8251A0E8FC15ACD +4D4D6CEA19F5BEE36E14FD91942E5284F635F6713043D4CEC1BF5E80703867B963DD0655 +179ED91BC2A94EDE291B2B34A1B53F7464D475CE3844F61B3AC34B258CA202B1BCDCCD76 +F81C170704E741156833A14E84120C10D4974D98F9A64967658236F3796A15F4715EE660 +F4356DAF786522D829D5F64AC39BA6FD4A5F9831A2B180DD76983D6B3510332A1350EF68 +DEE95CFF7E22D1DFA1B83790DEF05713733B2C98678810D1B863B2CF11AB0DBF62327741 +E4541051C333F43542367B4C0F581668AEDD2E5071436A4A50D07368F4AAC3F6FD25F903 +B11AC0D050CF88AE29928516A369C963116DC58E2984D7849E0F12F40E8807332DEE7642 +A44A4D1C9CF9E4CB01C819EDC63E7986AB3907C825886127E54D643F429E63EAA62C4655 +E12459DC40DA2216FA76ABC1F62206D6E26FD74240B67240F0A59325EAC5815493A5DC32 +2F936D086139C334BB102BABE70008D39BABAD2E8DFC7F6556E8916C8071F414A1468232 +7D430B20BFC0DCFF09A05DE9015F95CEAC2B33D3269977B04712AFAEAB6A0CF1DBF151A3 +C49FFD79DF318A96E7AB3BF9916F3B63DF6FFB63BF6B09637D02AA5DAA4DF410E37A52B4 +D24D93659CDD4F8D093E7DCB77A966B065991F5D858ABFD24E7CF353A29103BDCD78C5DA +C279A5EF2E66AF66B0BC5705E0F445FDEE26037F5712BA69958866259B47D7A0C6163932 +4A519757D0DC2BB945F4D54F2A948268F023AC8AC93DE6CA49A8B69FAD310DA292BF34D6 +72A4F5987A948AF5B3077F9E3AD60772A97ABF83A28A7E9BB2F1C49DC533AE9F157FB9BD +7F226B58103FDD5C38E599483DE93D923B8184453EFF9DC237BFC31417AD09117009FC8C +87391FB0BE7E011336228D81198B2E23C51EBDB26CC8D976978BC2C3BAD7418504BD30AF +AFA333E52B306B25E1CAC2D19482F4C08D57E68D8D6F152A6AF4A83FFB3DC6079CDC7D6C +62D1625CCF55B0D84D1A381EFE53F6FC0A2D3060DC19B20BB71DF70598304E430FAA9735 +6FB0CD51F28FF859E07F859CC2DE30D9B0C61443A68341573857D03E3B17DD1DA6BFFF7A +15DE805C05B6C8D0D38E105836BC590A233EE35C9035BB23384A48257D36A79A525CB7AC +AC3DAC11B4C78ACE64F5148F0DF009C79D7272AC879D9647C9ABC2EABCA007E955CE3C80 +4EA43D8F81303D9C4DB7039D84A7214D1CAB1DE644575612CC4D96B6A12EB9FBC47223E9 +1EE4A38BEB3E44B70FC03A1AEF6D55EBCBAE8181F9FED9BC352DF768F5C1204D16C73B18 +612C48FB955DA7E1ECF9A38B13182D8782F55405299BFC1555CBC1C8B2D3187824572BAE +2FD8B7D7A34FD5A2B31A108DB5908A94C6161F8109124E4210F38D53217A9362A384CB0D +9EAA16DF6A30580E8CCAE71152F2A0441703175C90DDB9D3D4AB8886199B14B38E846DEE +9397794CB3B0E709139EF09B4D1F39F406E46AB7780A496C04B1D058A7AA51D09F35F6EE +DCC2720D34EC9F7003E4FDD48D09FA67A5244F461EF4D8B66970A990E992285CFD068C25 +F3C5734C6FFEFE7C9D1CA87E9829007FED4083A1FFC8025F8D14C270D95581A2F46D9869 +FEB681A8C199E8BF2C4D13525709FD0F0215B818FCE1E5BE59EC4C2B455283EC6A7BC5B0 +5ECFF4F4A80672776C20B8C09124D3E0D0A5B2079F7F2392397D7E0CADFA288391347454 +487F1EB52262C53F30D1D02F5C2D2B3B810A76BFFC4286408F772ADABF1277E19031703B +676FBCE5DBEFB35E53D5B09CA9549E447EF6B5F917B080CCD466FE5AD1286A0982F6B04E +8CC59378BA5F999CC7C1E0899E69F7629BFEA7D2642930F05385A7767AF2CCA54831D0E5 +3A78C373A52D8A4987265DC54BCCE9DD3F950B18E4B4C6BAA653BDCCAAD9654A64040C5F +01B51F1C6E456259954739FA3E632CDCC78E1B7E5B364AFE33CAC76B56A8E68D260B8880 +7B15AB439AC1F9E379C6492257C0BDC14BFF623B2406EE4C0820E06D1498E862C69A60E2 +3333D7678120E8949F1552505F8D9234604CFCC2C0AE4361FE33C3C2792F33618099B296 +6EC69B58B589B11AB8F3678A797BBDB5D40754397873D41EF9DB3D26405D5D0AC64D4331 +31147C38F40512F63D63D21EE432D19C566A9FB62F7E1343990F5B6A1A45B0D90AA9276F +35C1C7E2DD322A7B2BBC758B7748703BF28CE1E4943C3C956831147297D4D23446BFA194 +92BCEE0AC533F7A1776365299F1E8B9727687E1A0EB7942D8F20C402372B56D951CA9268 +5FA6931EE0CCC3C4D6DF269B0AA6A9969A86339482F9B7B20FC245CF284B6C1787F8712D +1B7A5893E8E5B535F45321AB2882960A3A3D660E624BB68F5E453519F07B307408016AD2 +ED623A7931F3C25D16C55BC5FF05A37628B354B347FD0DAC5FC7088D20C777E86C51D541 +A8A73D729E43F798F473B36C1526A34179A34871626FBE64866A20247BCE6A0B8EC16CAF +7F04892C3265CC2D2ED7122E3583AB662F3FA612643382A8B071B052BA7BDDD0D17F3787 +B73678342F7AC5CB452C24A1ED57CB976E3B0E0AE0E1F7BAF615024BD874E65AB8576885 +00D2113078A44D8FAA468FAA53C39330E480023E4D901645F2FF3DC69735CE5109EC5648 +A58BDFD166B5410B1C52A19AF5EAE5B335621FC6C3A636E63E808502BCBD39C1B18B3D78 +D53DFC209664485C2FE7078A4C1ED53DD25CA9E4AF287385DFEAF67180F66A7D924A1C1D +A48309ADDBFD9EEDF2E0FDA513779C7D4E14BDF49DA3534A6F0CA66093CC884F778AA14A +EA804C43C94E6609CB1BE12A2EE09C33FC455C10BBE8F1A86E37469FC84D3D36FA92BD45 +70C7F34664353C1E999D3C684A7F57A920FB1F3CB2C6154674217E37758B75FC3BDE0644 +6EB5DE501F7B33232783F18A0743EF63C6153BE284BB9CCDEB5EF3F74127F5157D997376 +31A4CF3706756E9C273BBC8FC91890A13736BF03B0965BAB474463EB51A222F20D4C0DF2 +7101ABAB804A6F2D1A2EBD713DF7787319A520F06942F0234D8B8F75039E8C18147590B0 +9895FB4AE19F8AB3CAA93D77ABBA7FBEF6450A5C32A5D2325D26C79BCB3A5021D4DAD6B0 +D998F7B05E8EEBDCD762E972126AC5A831E3F2840D1E276AB173580CCEA003D28332FB26 +CB301880CDA511510480FFFEE849CF496079757E89902141277143A0D534B1C43C77FCF7 +E07398191EEFADDED6A222577BB9BC144B0B9E4B3894DA1B1A8CED51BADD8EF33C12E7C4 +83A4B1A32E8154EC7DC52E935EEFAB25432330A5959A5FE0898B3C3729A953D54F31CD43 +488EB4A0C2BA351E00EB0F41733E1231DE089B5183E6611B6075639E3B221641B7C4FF3E +B67EF531C9DD81FC4B1B98490C6B4050619CF6594E126D66BA0F2F187C229AAC7D69D8EA +937DE324990F72E47B9DA3C90C05D8D0A1F08C5EDEC145436D9FEAF82D27051F8BBD5D5E +249498A36AE396CB1D848B8250A8C005DE98907FF3B4BB16C62F4781A605EFE61B0757C9 +8FFE6F65450556C59F3D0E51ABF63DFBDD378BB94E12CD21BA4413FC05E717DFD54CC63D +AD68396CDC334446B603C826B5CCA1A06959F355E54CCAD7118E492471C60ED383E02ED1 +D95CA17911FC3271B6088A3C09205C1A8B04B3DAC2C8E92199FCAE0D3F0BA09AB1CEB719 +004A936FEB0E35166591FF051461B8E19671216EF16AB67113878C3C5D6A3D7D810E2C1A +988D519672C21E7D711389CDDB6DE03EEEC77A063E0FAB6893650DFC8D041B316711D922 +4B622FFF02FFA06545F5082BECDF430B69E2F839C9F1D3AB53E1FBE68F778F7EA0D4E68E +1ABFAF43139BF00FA4A306BF5D6ED688702A3ACD7B6A8E607402D45EFEEF86E28272A142 +6A7953C2DA42605487328A313D3264191C127014A613FE97806901D12A94A7CC6437FCAF +7DD14D33F2937C7AAEFCB2B07B45DE22D60C8ED4C0DAA5039803870A0CE4AF90AC3BB9B3 +248033B297B842044DAAF16C0479C8A3226A999EFD0FF6FDCF8BB331E27445F7B6B27EAF +3AFE02A75318BEEFD57CABDCA3BBF53C734E489AED62313E29CBF47634E650D26F95F243 +56AB5F5A7BDC0C4ABBD0373FAB6056451D9F6863871D49019012FCF90BF30DE0CFF003C3 +37E21A9BB502F37F24E599C882AC03BC5805850E189AAD1BBD869A5C713A44B13D853403 +D7BE84885E9E3B8283D972FE7E891F3FA1C3D785EFA99186F0C4F2D6A71BEC5A4537C4AA +0EE42126B49831684BCC2992316FB29E20EACB2AE0C0AA6AD22BEDE3394A19D1FBF0F899 +3C3AE559AC6E998BC28F148C9E4FFA70B343EA64C05A17587B4DB0D4E1450C3B55D35C0B +BC0F9ED68B669176C5E110276E295D632B712925DEF6F46B6FEFC7DDAE8904EB2D890AE7 +F7E514330EEDBCD45616B620C6514529B426B8C2DC4B0F302330662112B3F41F2A7D6B08 +30C7FAA87E0A41B5B37A166A0ED59572A98FC99E7B79DE270DCCC068A284031D8975BA09 +C5B8865D24586EFD7669E012974B4B7FAE26ECBE5293BF8059C9D41616E5CDEED6774E9A +9721BFD35178FB026A26DD2EC8B2A17B712129F18061B25BF34D75EBE8751EBD7F103464 +8FD62A60EE0BA9EF57C033DD35261DD3FF832F7759FCC67C5DE884D6A75087D1902CF681 +8241E6B1224B0515C5BA +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark diff --git a/extlib/inconsolata/Inconsolata.sfd b/extlib/inconsolata/Inconsolata.sfd new file mode 100644 index 00000000..3415c8b9 --- /dev/null +++ b/extlib/inconsolata/Inconsolata.sfd @@ -0,0 +1,5730 @@ +SplineFontDB: 3.0 +FontName: Inconsolata +FullName: Inconsolata +FamilyName: Inconsolata +Weight: Medium +Copyright: Created by Raph Levien using his own tools and FontForge. Copyright 2006 Raph Levien. Released under the SIL Open Font License, http://scripts.sil.org/OFL. +UComments: "2005-8-26: Created." +Version: 001.010 +ItalicAngle: 0 +UnderlinePosition: -100 +UnderlineWidth: 50 +Ascent: 820 +Descent: 180 +LayerCount: 2 +Layer: 0 0 "Back" 1 +Layer: 1 0 "Fore" 0 +XUID: [1021 77 1780377399 11264577] +FSType: 8 +OS2Version: 0 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 0 +CreationTime: 1161020814 +ModificationTime: 1234036730 +PfmFamily: 17 +TTFWeight: 500 +TTFWidth: 5 +LineGap: 200 +VLineGap: 0 +Panose: 2 11 6 9 3 0 3 0 0 0 +OS2TypoAscent: 0 +OS2TypoAOffset: 1 +OS2TypoDescent: 0 +OS2TypoDOffset: 1 +OS2TypoLinegap: 0 +OS2WinAscent: 0 +OS2WinAOffset: 1 +OS2WinDescent: 0 +OS2WinDOffset: 1 +HheadAscent: 0 +HheadAOffset: 1 +HheadDescent: 0 +HheadDOffset: 1 +OS2Vendor: 'PfEd' +DEI: 91125 +LangName: 1033 +Encoding: Custom +UnicodeInterp: none +NameList: Adobe Glyph List +DisplaySize: -36 +AntiAlias: 1 +FitToEm: 1 +WinInfo: 64 16 14 +Grid +168 917 m 25 + 406.5 917 l 25 +EndSplineSet +TeXData: 1 0 0 629145 314572 209715 554697 1048576 209715 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144 +BeginChars: 359 294 + +StartChar: a +Encoding: 97 97 0 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +SplineSet +115 467 m 0 + 164.456 518.083 232.512 541.055 303.925 541.055 c 0 + 386.091 541.055 453.267 510.995 488.008 453.097 c 0 + 512.442 412.375 514 371.39 514 328 c 0 + 514 0 l 0 + 435 0 l 0 + 435 58 l 0 + 377.24 10.665 309.94 -13.0023 244.918 -13.0023 c 0 + 134.316 -13.0023 66.8187 59.1626 66.8187 136.825 c 0 + 66.8187 195.507 104.707 257.379 188.205 288.065 c 0 + 255.557 312.817 339.023 312 417 312 c 0 + 434 312 l 0 + 434 331 l 0 + 434 359.055 434.409 393.114 416.772 422.078 c 0 + 401.83 446.615 370.745 473.031 307.869 473.031 c 0 + 258.955 473.031 199.358 459.393 156 414 c 0 + 115 467 l 0 +437 248 m 0 + 418 248 l 0 + 362.991 248 292.114 251.465 244.035 239.987 c 0 + 177.665 224.143 150.668 180.909 150.668 142.456 c 0 + 150.668 95.137 191.681 50.8142 261.864 50.8142 c 0 + 331.199 50.8142 381.823 92.8437 401.058 113.287 c 0 + 436.77 151.242 437 185.578 437 213 c 0 + 437 248 l 0 +EndSplineSet +EndChar + +StartChar: c +Encoding: 99 99 1 +Width: 600 +Flags: HMW +TeX: 99 0 +LayerCount: 2 +Fore +SplineSet +539 442 m 4 + 480 373 l 4 + 470.825 379.924 477.126 390.809 472.703 399.753 c 4 + 469.634 405.96 426.164 469.074 335.78 469.074 c 4 + 238.504 469.074 160.969 393.768 160.969 273.126 c 4 + 160.969 149.42 239.6 62.9789 342.756 62.9789 c 4 + 395.811 62.9789 447.209 86.4429 483 127 c 4 + 531 71 l 4 + 480.516 16.5812 409.687 -13.0011 335.781 -13.0011 c 4 + 186.048 -13.0011 74.9996 104.892 74.9996 264.509 c 4 + 74.9996 423.38 185.476 540.028 341.051 540.028 c 4 + 426.18 540.028 497.315 503.103 539 442 c 4 +EndSplineSet +EndChar + +StartChar: m +Encoding: 109 109 2 +Width: 600 +Flags: HMW +TeX: 109 0 +LayerCount: 2 +Fore +SplineSet +54 0 m 0 + 54 529 l 0 + 131 529 l 0 + 130 477 l 0 + 154.337 514.017 194.92 542.056 238.342 542.056 c 0 + 285.783 542.056 323.7 508.722 332 465 c 0 + 352.564 511.823 399.84 542.002 450.616 542.002 c 0 + 480.394 542.002 513.14 530.575 533.429 499.943 c 0 + 556.856 464.574 555 419.808 555 376 c 0 + 555 -1 l 0 + 476 -1 l 0 + 476 375 l 0 + 476 399.068 478.585 429.361 468.835 451.652 c 0 + 460.274 471.228 443.933 481.204 426.805 481.204 c 0 + 394.659 481.204 374.014 448.262 365.249 433.479 c 0 + 345.703 400.513 343 377.821 343 350 c 0 + 343 0 l 0 + 265 0 l 0 + 265 368 l 0 + 265 389.832 266.608 415.372 259.774 437.513 c 0 + 250.804 466.572 229.599 478.297 210.74 478.297 c 0 + 189.54 478.297 165.885 464.471 146.732 428.907 c 0 + 131.729 401.049 130 377.928 130 353 c 0 + 130 0 l 0 + 54 0 l 0 +EndSplineSet +EndChar + +StartChar: s +Encoding: 115 115 3 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +Fore +SplineSet +511 459 m 0 + 462 386 l 0 + 459.954 386.487 455.921 388.387 455.967 395.318 c 0 + 455.994 399.389 456.754 402.17 453.49 406.383 c 0 + 433.342 432.386 382.005 479.074 306.539 479.074 c 0 + 246.687 479.074 195 449.386 195 406.786 c 0 + 195 389 204.202 363.327 247.446 342.429 c 0 + 296.926 318.517 382.175 306.563 441.996 272.983 c 0 + 504.635 237.822 519.699 189.926 519.699 153.285 c 0 + 519.699 73.3785 444.137 -12.0003 299.462 -12.0003 c 0 + 219.049 -12.0003 138.142 14.2177 76 72 c 0 + 124 155 l 0 + 129.709 152.331 129.203 145.694 129.13 144.104 c 0 + 128.917 139.47 128.401 136.208 132.349 131.72 c 0 + 149.099 112.681 207.222 58 297.964 58 c 0 + 373.592 58 434.068 92.1676 434.068 141.757 c 0 + 434.068 160.887 424.919 188.765 381.245 209.208 c 0 + 342.194 227.486 283.74 241.548 238.968 257.732 c 0 + 210.234 268.119 109.997 301.799 109.997 394.231 c 0 + 109.997 473.3 190.548 542.004 313.496 542.004 c 0 + 391.8 542.004 462.083 512.905 511 459 c 0 +EndSplineSet +EndChar + +StartChar: I +Encoding: 73 73 4 +Width: 600 +Flags: HMW +TeX: 73 0 +LayerCount: 2 +Fore +SplineSet +112 722 m 0 + 470 722 l 0 + 470 654 l 0 + 327 654 l 0 + 327 66 l 0 + 477 66 l 0 + 477 -1 l 0 + 104 -1 l 0 + 104 67 l 0 + 246 67 l 0 + 246 654 l 0 + 112 654 l 0 + 112 722 l 0 +EndSplineSet +EndChar + +StartChar: o +Encoding: 111 111 5 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +SplineSet +543.113 262.304 m 0 + 543.113 86.8043 430.326 -14 304.969 -14 c 0 + 171.548 -14 56.8677 99.5323 56.8677 260.578 c 0 + 56.8677 424.14 172.53 541.005 307.44 541.005 c 0 + 427.751 541.005 543.113 445.084 543.113 262.304 c 0 +301.758 470.103 m 0 + 220.795 470.103 144.985 397.575 144.985 267.806 c 0 + 144.985 137.225 221.249 57.9927 305.614 57.9927 c 0 + 382.884 57.9927 459.167 125.6 459.167 258.844 c 0 + 459.167 404.202 378.128 470.103 301.758 470.103 c 0 +EndSplineSet +EndChar + +StartChar: n +Encoding: 110 110 6 +Width: 600 +Flags: HMW +TeX: 110 0 +LayerCount: 2 +Fore +SplineSet +89 0 m 0 + 89 529 l 0 + 174 529 l 0 + 174 436 l 0 + 212.871 495.002 278.12 542.003 349.957 542.003 c 0 + 410.281 542.003 464.544 508.129 490.899 448.568 c 0 + 509.729 406.014 510 362.334 510 321 c 0 + 510 321 l 0 + 510 0 l 0 + 428 0 l 0 + 428 319 l 0 + 428 356.393 427.762 401.823 399.11 436.061 c 0 + 380.097 458.781 353.908 469.58 327.341 469.58 c 0 + 271.362 469.58 220.49 422.787 200.308 395.893 c 0 + 178.287 366.55 174 340.651 174 305 c 0 + 174 0 l 0 + 89 0 l 0 +EndSplineSet +EndChar + +StartChar: l +Encoding: 108 108 7 +Width: 600 +Flags: HMW +TeX: 108 0 +LayerCount: 2 +Fore +SplineSet +108 770 m 0 + 342 770 l 0 + 342 67 l 0 + 498 67 l 0 + 498 0 l 0 + 101 0 l 0 + 101 67 l 0 + 258 67 l 0 + 258 703 l 0 + 108 703 l 0 + 108 770 l 0 +EndSplineSet +EndChar + +StartChar: t +Encoding: 116 116 8 +Width: 600 +Flags: HMW +TeX: 116 0 +LayerCount: 2 +Fore +SplineSet +228 671 m 0 + 319 686 l 0 + 323.069 674.25 314.74 667.101 312.438 654.7 c 0 + 306.99 625.35 299 530 299 530 c 0 + 472 530 l 0 + 472 461 l 0 + 298 461 l 0 + 291.31 392.178 287.955 323.066 287.955 253.871 c 0 + 287.955 177.138 290.735 156.77 291.356 152.111 c 0 + 299.829 88.539 340.908 66.6734 380.424 66.6734 c 0 + 413.027 66.6734 454.079 81.5989 499 115 c 0 + 525 49 l 0 + 480.23 16.2302 418.815 -10.1214 355.783 -10.1214 c 0 + 301.714 -10.1214 260.342 10.8883 235.238 46.2593 c 0 + 204.429 89.6687 204 142.866 204 190.358 c 0 + 204 280.259 207.611 370.358 215 461 c 0 + 91 461 l 0 + 92 529 l 0 + 218 529 l 0 + 228 671 l 0 +EndSplineSet +EndChar + +StartChar: e +Encoding: 101 101 9 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +SplineSet +309.698 542.272 m 0 + 396.487 542.272 495.286 496.221 519.331 354.102 c 0 + 524.53 323.371 526.211 289.371 523 253 c 1 + 147.298 253 l 1 + 153.598 94.4857 256.131 55.4411 326.953 55.4411 c 0 + 379.589 55.4411 429.496 76.3575 464 115 c 1 + 510 70 l 1 + 464.675 15.507 396.045 -12.143 320.487 -12.143 c 0 + 176.7 -12.143 66.2985 82.2264 66.2985 258.611 c 0 + 66.2985 451.856 183.262 542.272 309.698 542.272 c 0 +150.008 317 m 1 + 441 317 l 1 + 450.942 402.839 389.68 478.169 303.883 478.169 c 0 + 247.072 478.169 166.495 441.85 150.008 317 c 1 +EndSplineSet +EndChar + +StartChar: space +Encoding: 32 32 10 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +EndChar + +StartChar: b +Encoding: 98 98 11 +Width: 600 +Flags: HMW +TeX: 98 0 +LayerCount: 2 +Fore +SplineSet +79 771 m 0 + 177 771 l 0 + 178.976 764.036 172.638 759.556 170.696 758.012 c 0 + 165.256 753.69 164 751.156 164 745 c 0 + 164 448 l 0 + 197.57 506.183 259.707 542.07 327.128 542.07 c 0 + 431.167 542.07 540.005 456.138 540.005 271.2 c 0 + 540.005 79.1558 427.245 -13.0764 318.695 -13.0764 c 0 + 255.173 -13.0764 196.766 18.3503 162 70 c 0 + 133 0 l 0 + 79 0 l 0 + 79 771 l 0 +298.069 470.353 m 0 + 245.668 470.353 197.567 440.714 177.844 392.983 c 0 + 165.809 363.856 163.969 329.782 163.969 281.904 c 0 + 163.969 236.092 163.584 204.899 167.224 177.364 c 0 + 180.563 76.4436 260.537 61.9726 296.744 61.9726 c 0 + 348.522 61.9726 453.238 91.5609 453.238 253.679 c 0 + 453.238 440.584 347.817 470.353 298.069 470.353 c 0 +EndSplineSet +EndChar + +StartChar: H +Encoding: 72 72 12 +Width: 600 +Flags: HMW +TeX: 72 0 +LayerCount: 2 +Fore +SplineSet +73 722 m 0 + 163 722 l 0 + 163.822 720.356 164.252 718.529 164.252 716.663 c 0 + 164.252 707.549 157 706.38 157 694 c 0 + 157 413 l 0 + 440 413 l 0 + 440 722 l 0 + 528 722 l 0 + 528.872 720.545 529.336 718.865 529.336 717.137 c 0 + 529.336 708.364 521 708.006 521 696 c 0 + 521 -1 l 0 + 439 -1 l 0 + 439 344 l 0 + 157 344 l 0 + 157 0 l 0 + 73 0 l 0 + 73 722 l 0 +EndSplineSet +EndChar + +StartChar: g +Encoding: 103 103 13 +Width: 600 +Flags: HMW +TeX: 103 0 +LayerCount: 2 +Fore +SplineSet +155.954 364.263 m 0 + 155.954 300.152 208.143 247.999 272.491 247.999 c 0 + 336.833 247.999 389.059 300.157 389.059 364.307 c 0 + 389.059 428.413 336.878 480.571 272.536 480.571 c 0 + 208.19 480.571 155.954 428.416 155.954 364.263 c 0 +277.609 546.548 m 0 + 325.887 546.548 370.362 528.527 403 496 c 1 + 443.962 530.332 496.755 547.196 550 543 c 1 + 560 475 l 1 + 549.913 476.74 539.695 477.615 529.459 477.615 c 0 + 496.841 477.615 464.884 468.735 437 452 c 1 + 454.566 425.561 464.002 394.366 464.002 362.278 c 0 + 464.002 264.564 378.096 180.942 273.257 180.942 c 0 + 250.3 180.942 227.525 185.021 206 193 c 1 + 200.797 188.707 168.184 161.819 168.184 133.805 c 0 + 168.184 117.119 179.985 104.638 200.262 99.0661 c 0 + 211.549 95.9645 236.341 92.4042 275.863 92.4042 c 0 + 335.853 92.4042 399.797 99.8481 455.06 77.4073 c 0 + 511.29 54.5739 537.372 8.31551 537.372 -37.512 c 0 + 537.372 -108.516 473.087 -199.384 293.795 -199.384 c 0 + 108.265 -199.384 54.4288 -131.698 54.4288 -73.9838 c 0 + 54.4288 -31.9211 83.7043 7.00723 140.521 43.2787 c 1 + 107.075 60.8546 98.0562 91.7838 98.0562 113.827 c 0 + 98.0562 147.839 119.806 183.618 158 216 c 1 + 109.489 247.565 79.7405 301.443 79.7405 359.36 c 0 + 79.7405 462.8 172.219 546.548 277.609 546.548 c 0 +196.923 28.2968 m 1 + 166.505 11.5929 130.974 -16.2077 130.974 -54.2593 c 0 + 130.974 -72.7564 140.35 -101.884 183.142 -118.899 c 0 + 223.159 -134.81 268.208 -136.199 292.38 -136.199 c 0 + 327.814 -136.199 372.581 -133.958 411.372 -113.024 c 0 + 447.725 -93.4056 460.904 -65.7032 460.904 -42.7611 c 0 + 460.904 -19.4526 446.825 11.4411 397.736 18.8405 c 0 + 367.367 23.4181 324.656 20.4798 285.59 21.9264 c 0 + 245.08 23.4265 216.987 25.7017 196.923 28.2968 c 1 +EndSplineSet +EndChar + +StartChar: h +Encoding: 104 104 14 +Width: 600 +Flags: HMW +TeX: 104 0 +LayerCount: 2 +Fore +SplineSet +91 0 m 4 + 91 770 l 4 + 187 770 l 4 + 187.379 768.886 187.572 767.712 187.572 766.526 c 4 + 187.572 760.484 182.866 756.916 180.206 754.11 c 4 + 176.27 749.956 176 746.931 176 743 c 4 + 176 436 l 4 + 214.871 495.002 280.12 542.003 351.957 542.003 c 4 + 412.281 542.003 466.544 508.129 492.899 448.568 c 4 + 511.729 406.014 512 362.334 512 321 c 4 + 512 321 l 4 + 512 0 l 4 + 430 0 l 4 + 430 319 l 4 + 430 356.393 429.762 401.823 401.11 436.061 c 4 + 382.097 458.781 355.908 469.58 329.341 469.58 c 4 + 273.362 469.58 222.49 422.787 202.308 395.893 c 4 + 180.287 366.55 176 340.651 176 305 c 4 + 176 0 l 4 + 91 0 l 4 +EndSplineSet +EndChar + +StartChar: u +Encoding: 117 117 15 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +SplineSet +83 529 m 0 + 167 529 l 0 + 167 234 l 0 + 167 198.5 166.87 157.109 185.678 119.763 c 0 + 206.758 77.9067 245.414 54.9999 286.847 54.9999 c 0 + 337.84 54.9999 384.893 89.1882 409.153 133.494 c 0 + 426.843 165.8 430 197.247 430 238 c 0 + 430 529 l 0 + 514 529 l 0 + 514 48 l 0 + 514 32.4901 514.914 15.8204 520 0 c 0 + 432 0 l 0 + 429.806 13.6499 429.662 27.494 430 41 c 0 + 431 81 l 0 + 396.509 22.5849 333.904 -13.0167 267.52 -13.0167 c 0 + 198.648 -13.0167 133.916 25.4335 102.995 94.9656 c 0 + 82.3165 141.466 81.8438 187.899 82 234 c 0 + 83 529 l 0 +EndSplineSet +EndChar + +StartChar: r +Encoding: 114 114 16 +Width: 600 +Flags: HMW +TeX: 114 0 +LayerCount: 2 +Fore +SplineSet +125 529 m 0 + 212 529 l 0 + 209 427 l 0 + 243.671 502.684 322.168 541.803 399.502 541.803 c 0 + 458.959 541.803 507.697 518.114 541 484 c 0 + 502 404 l 0 + 493.106 412.505 489.308 421.668 482.352 430.554 c 0 + 467.489 449.542 439.485 470.205 394.944 470.205 c 0 + 357.514 470.205 294.325 457.033 246.222 380.981 c 0 + 210.237 324.088 209 288.944 209 257 c 0 + 209 -1 l 0 + 125 -1 l 0 + 125 529 l 0 +EndSplineSet +EndChar + +StartChar: i +Encoding: 105 105 17 +Width: 600 +Flags: HMW +TeX: 105 0 +LayerCount: 2 +Fore +SplineSet +133 530 m 4 + 345 530 l 4 + 345 67 l 4 + 469 67 l 4 + 469 0 l 4 + 126 0 l 4 + 126 67 l 4 + 261 67 l 4 + 261 462 l 4 + 133 462 l 4 + 133 530 l 4 +305.003 760 m 4 + 338.171 760 365.019 733.28 365.019 700.493 c 4 + 365.019 667.727 338.182 640.992 304.99 640.992 c 4 + 271.818 640.992 244.981 667.716 244.981 700.486 c 4 + 244.981 733.264 271.822 760 305.003 760 c 4 +EndSplineSet +EndChar + +StartChar: f +Encoding: 102 102 18 +Width: 600 +Flags: HMW +TeX: 102 0 +LayerCount: 2 +Fore +SplineSet +408.022 777.453 m 0 + 474.61 777.453 532.121 750.586 570 705 c 1 + 532 628 l 1 + 528.434 627.638 523.23 629.721 522.592 637.659 c 0 + 522.194 642.608 523.122 645.776 519.403 651.402 c 0 + 497.139 685.077 454.727 711.981 403.749 711.981 c 0 + 359.969 711.981 319.106 692.476 297.273 653.356 c 0 + 277.495 617.916 278 577.346 278 539 c 2 + 278 498 l 1 + 451 498 l 1 + 451 432 l 1 + 278 432 l 1 + 278 0 l 1 + 198 0 l 1 + 198 432 l 1 + 83 432 l 1 + 83 498 l 1 + 198 498 l 1 + 198 550 l 2 + 198 596.99 199.926 641.1 227.059 685.226 c 0 + 264.056 745.394 333.642 777.453 408.022 777.453 c 0 +EndSplineSet +EndChar + +StartChar: v +Encoding: 118 118 19 +Width: 600 +Flags: HMW +TeX: 118 0 +LayerCount: 2 +Fore +SplineSet +56 530 m 0 + 156 530 l 0 + 158 520.53 152.295 514.363 152.295 507.316 c 0 + 152.295 504.529 153.032 502.45 154 500 c 0 + 307 113 l 0 + 392 310 l 0 + 421.967 379.454 449.99 452.863 464 530 c 0 + 539 530 l 0 + 521.386 449.313 491.663 372.127 460 298 c 0 + 331 -4 l 0 + 266 -4 l 0 + 56 530 l 0 +EndSplineSet +EndChar + +StartChar: d +Encoding: 100 100 20 +Width: 600 +Flags: HMW +TeX: 100 0 +LayerCount: 2 +Fore +SplineSet +440 452 m 0 + 440 771 l 0 + 529 771 l 0 + 529.429 763.115 525.033 757.358 522.644 753.665 c 0 + 518.515 747.282 517.991 744.04 518 738 c 0 + 519 49 l 0 + 519.023 32.976 519.825 16.2095 524 0 c 0 + 441 0 l 0 + 436.758 12.8474 436 26.4226 436 39 c 0 + 436 85 l 0 + 402.754 25.5822 340.198 -11.7426 272.502 -11.7426 c 0 + 170.172 -11.7426 61.9989 73.6686 61.9989 269.088 c 0 + 61.9989 471.408 183.85 543.089 284.756 543.089 c 0 + 357.905 543.089 414.551 506.411 440 452 c 0 +288.638 475.041 m 0 + 227.729 475.041 142.873 433.439 142.873 282.731 c 0 + 142.873 108.363 231.935 61.8091 291.87 61.8091 c 0 + 347.081 61.8091 401.871 98.7178 422.26 162.214 c 0 + 430.843 188.943 433.29 218.613 433.29 258.526 c 0 + 433.29 317.62 430.953 347.168 424.391 371.787 c 0 + 403.443 450.383 335.053 475.041 288.638 475.041 c 0 +EndSplineSet +EndChar + +StartChar: p +Encoding: 112 112 21 +Width: 600 +Flags: HMW +TeX: 112 0 +LayerCount: 2 +Fore +SplineSet +79 529 m 0 + 164 529 l 0 + 164 448 l 0 + 199.965 505.862 263.255 541 331.196 541 c 0 + 435.346 541 546.008 457.517 546.008 270.69 c 0 + 546.008 76.5707 432.1 -14.1497 323.885 -14.1497 c 0 + 259.582 -14.1497 200.339 17.6548 165 70 c 0 + 165 -193 l 0 + 80 -193 l 0 + 79 529 l 0 +300.599 469.911 m 0 + 247.269 469.911 198.023 440.745 177.865 393.197 c 0 + 166.21 365.704 163.875 333.505 163.875 288.853 c 0 + 163.875 212.177 163.543 168.56 179.045 132.849 c 0 + 199.943 84.7085 249.872 59.8372 300.077 59.8372 c 0 + 349.666 59.8372 459.207 86.5412 459.207 253.487 c 0 + 459.207 445.62 347.069 469.911 300.599 469.911 c 0 +EndSplineSet +EndChar + +StartChar: q +Encoding: 113 113 22 +Width: 600 +Flags: HMW +TeX: 113 0 +LayerCount: 2 +Fore +SplineSet +443 452 m 0 + 443 529 l 0 + 522 529 l 0 + 522 -193 l 0 + 439 -193 l 0 + 439 85 l 0 + 405.898 26.0553 344.027 -11.6567 276.61 -11.6567 c 0 + 159.718 -11.6567 58.9968 98.0805 58.9968 269.638 c 0 + 58.9968 449.541 172.706 543.066 288.684 543.066 c 0 + 406.139 543.066 443 451.618 443 452 c 0 +291.949 475.034 m 0 + 220.924 475.034 142.881 419.676 142.881 281.575 c 0 + 142.881 131.999 219.654 61.7898 295.168 61.7898 c 0 + 350.366 61.7898 404.936 99.0666 425.25 162.164 c 0 + 433.889 188.997 436.294 218.713 436.294 258.291 c 0 + 436.294 322.298 433.787 355.626 423.349 384.853 c 0 + 400.165 449.771 339.214 475.034 291.949 475.034 c 0 +EndSplineSet +EndChar + +StartChar: y +Encoding: 121 121 23 +Width: 600 +Flags: HMW +TeX: 121 0 +LayerCount: 2 +Fore +SplineSet +63 529 m 0 + 167 529 l 0 + 167.651 518.579 161.833 512.755 161.833 504.226 c 0 + 161.833 500.853 162.694 498.287 164 495 c 0 + 319 105 l 0 + 420 389 l 0 + 436.209 434.578 451.255 481.532 460 530 c 0 + 547 530 l 0 + 531.434 478.243 513.035 427.412 494 377 c 0 + 329 -60 l 0 + 317.685 -89.9672 306.505 -117.887 283.381 -143.905 c 0 + 248.107 -183.593 198.508 -201.18 150.696 -201.18 c 0 + 107.172 -201.18 66.5488 -186.251 36 -157 c 0 + 79 -82 l 0 + 85.8372 -87.3566 85.2476 -95.0835 88.2407 -100.819 c 0 + 91.1874 -106.465 111.21 -132.772 150.447 -132.772 c 0 + 175.241 -132.772 202.436 -121.95 224.474 -98.4823 c 0 + 241.247 -80.621 251.822 -58.0558 261 -37 c 0 + 278 2 l 0 + 63 529 l 0 +EndSplineSet +EndChar + +StartChar: period +Encoding: 46 46 24 +Width: 600 +Flags: HMW +TeX: 112 0 +LayerCount: 2 +Fore +SplineSet +355.002 53.4929 m 0 + 355.002 17.0088 324.552 -13.046 286.441 -13.046 c 0 + 248.415 -13.046 217.952 16.9803 217.952 53.509 c 0 + 217.952 89.9628 248.383 120.002 286.462 120.002 c 0 + 324.556 120.002 355.002 89.961 355.002 53.4929 c 0 +EndSplineSet +EndChar + +StartChar: comma +Encoding: 44 44 25 +Width: 600 +Flags: HMW +TeX: 99 0 +LayerCount: 2 +Fore +SplineSet +364.152 22.8349 m 0 + 364.152 -37.4943 321.706 -113.057 241 -195 c 0 + 201 -160 l 0 + 228.481 -134.726 247.951 -106.529 259.27 -87.9335 c 0 + 264.928 -78.6381 276.427 -58.8335 276.427 -39.6582 c 0 + 276.427 -15.8026 259.351 -5.13308 249.284 1.56253 c 0 + 239.047 8.37111 216.973 21.6939 216.973 52.8528 c 0 + 216.973 87.8494 245.536 118.93 283.672 118.93 c 0 + 324.887 118.93 364.152 82.133 364.152 22.8349 c 0 +EndSplineSet +EndChar + +StartChar: colon +Encoding: 58 58 26 +Width: 600 +Flags: HMW +TeX: 99 0 +LayerCount: 2 +Fore +Refer: 24 46 S 1 0 0 1 0 370 2 +Refer: 24 46 S 1 0 0 1 0 0 2 +EndChar + +StartChar: semicolon +Encoding: 59 59 27 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +Fore +Refer: 25 44 N 1 0 0 1 0 0 2 +Refer: 24 46 S 1 0 0 1 0 370 2 +EndChar + +StartChar: plus +Encoding: 43 43 28 +Width: 600 +Flags: HMW +TeX: 112 0 +LayerCount: 2 +Fore +SplineSet +267 606 m 5 + 340 606 l 5 + 340 408 l 5 + 538 408 l 5 + 538 337 l 5 + 340 337 l 5 + 340 120 l 5 + 267 120 l 5 + 267 337 l 5 + 62 337 l 5 + 62 408 l 5 + 267 408 l 5 + 267 606 l 5 +EndSplineSet +EndChar + +StartChar: minus +Encoding: 256 8722 29 +Width: 600 +Flags: HMW +TeX: 104 0 +LayerCount: 2 +Fore +SplineSet +62 398 m 29 + 538 398 l 29 + 538 327 l 29 + 62 327 l 29 + 62 398 l 29 +EndSplineSet +EndChar + +StartChar: equal +Encoding: 61 61 30 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +Refer: 29 8722 N 1 0 0 1 0 110 2 +Refer: 29 8722 N 1 0 0 1 0 -130 2 +EndChar + +StartChar: underscore +Encoding: 95 95 31 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +SplineSet +50 -22 m 29 + 550 -22 l 29 + 550 -93 l 29 + 50 -93 l 29 + 50 -22 l 29 +EndSplineSet +EndChar + +StartChar: less +Encoding: 60 60 32 +Width: 600 +Flags: HMW +TeX: 108 0 +LayerCount: 2 +Fore +SplineSet +541 575 m 29 + 541 657 l 29 + 50 399 l 29 + 50 343 l 29 + 544 55 l 29 + 544 142 l 29 + 139 370 l 29 + 541 575 l 29 +EndSplineSet +EndChar + +StartChar: greater +Encoding: 62 62 33 +Width: 600 +Flags: HMW +TeX: 103 0 +LayerCount: 2 +Fore +Refer: 32 60 S -1 0 0 1 600 0 2 +EndChar + +StartChar: quotesingle +Encoding: 39 39 34 +Width: 600 +Flags: HMWO +TeX: 113 0 +LayerCount: 2 +Fore +SplineSet +379.671 700.649 m 0 + 379.671 670.206 369.816 633.244 341 554 c 0 + 313 477 l 0 + 249 493 l 0 + 274 571 l 0 + 280.25 590.5 285.304 612.364 285.304 635.105 c 0 + 285.304 660.263 278.044 683.429 278.044 708.518 c 0 + 278.044 754.3 305.162 772.143 327.505 772.143 c 0 + 350.267 772.143 379.671 753.082 379.671 700.649 c 0 +EndSplineSet +EndChar + +StartChar: grave +Encoding: 96 96 35 +Width: 600 +Flags: HMW +TeX: 103 0 +LayerCount: 2 +Fore +Refer: 34 39 S -0.766045 -0.642788 0.642788 -0.766045 104.985 1311.87 2 +EndChar + +StartChar: slash +Encoding: 47 47 36 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +Fore +SplineSet +84 -15 m 25 + 447 770 l 25 + 516 735 l 25 + 152 -49 l 25 + 84 -15 l 25 +EndSplineSet +EndChar + +StartChar: backslash +Encoding: 92 92 37 +Width: 600 +Flags: HMW +TeX: 98 0 +LayerCount: 2 +Fore +Refer: 36 47 N -1 0 0 1 600 0 2 +EndChar + +StartChar: micro +Encoding: 181 181 38 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +SplineSet +38 -193 m 0 + 38.9384 -58.9867 61 87.3183 61 234 c 0 + 61 529 l 0 + 137 529 l 0 + 137 215 l 0 + 137 180.23 138.185 147.14 154.248 114.565 c 0 + 174.86 72.7648 211.805 49.9847 248.66 49.9847 c 0 + 290.595 49.9847 331.561 78.8859 352.027 125.633 c 0 + 365.243 155.818 367 186.455 367 222 c 0 + 367 529 l 0 + 441 529 l 0 + 441 134 l 0 + 441 116.206 440.844 95.0245 450.744 77.6249 c 0 + 459.417 62.3819 473.241 54.8661 487.238 54.8661 c 0 + 526.513 54.8661 551 111 551 111 c 0 + 582 52 l 0 + 559.818 18.1186 523.188 -12.1017 480.237 -12.1017 c 0 + 431.193 -12.1017 391.479 28.1352 385 78 c 0 + 358.195 22.6019 302.55 -13.0043 242.87 -13.0043 c 0 + 186.505 -13.0043 135.089 18.999 111 70 c 0 + 111.199 -18.023 110.861 -105.668 110 -193 c 0 + 38 -193 l 0 +EndSplineSet +EndChar + +StartChar: braceleft +Encoding: 123 123 39 +Width: 600 +Flags: HMW +TeX: 98 0 +LayerCount: 2 +Fore +SplineSet +71 329 m 0 + 94 329 l 0 + 114.58 329 146.235 328.585 171.534 355.122 c 0 + 198.692 383.608 201.554 425.157 201.554 453.492 c 0 + 201.554 481.497 198.598 507.731 198.598 536.425 c 0 + 198.598 580.04 204.818 645.199 255.772 691.645 c 0 + 311.368 742.324 385.82 738 448 738 c 0 + 483 738 l 0 + 483 672 l 0 + 443 672 l 0 + 392.342 672 357.045 676.742 325.874 657.279 c 0 + 281.263 629.425 279.43 573.026 279.43 549.494 c 0 + 279.43 521.751 282.855 496.368 282.855 468.063 c 0 + 282.855 440.501 279.771 406.244 264.439 374.889 c 0 + 247.328 339.898 217.845 312.378 182 297 c 0 + 225.958 281.72 279.876 237.615 279.876 116.516 c 0 + 279.876 80.6922 276.205 50.3097 276.205 19.6336 c 0 + 276.205 -20.2481 282.098 -70.9759 323.519 -99.512 c 0 + 355.221 -121.352 391.356 -119 439 -119 c 0 + 482 -119 l 0 + 482 -184 l 0 + 440 -184 l 0 + 368.421 -184 309.076 -187.506 259.023 -149.094 c 0 + 197.979 -102.247 194.437 -23.0053 194.437 19.058 c 0 + 194.437 64.2177 198.784 98.7588 198.784 134.884 c 0 + 198.784 184.919 190.964 218.659 168.219 240.946 c 0 + 144.453 264.235 114.606 264 95 264 c 0 + 71 264 l 0 + 71 329 l 0 +EndSplineSet +EndChar + +StartChar: braceright +Encoding: 125 125 40 +Width: 600 +Flags: HMW +TeX: 98 0 +LayerCount: 2 +Fore +Refer: 39 123 S -1 0 0 1 600 0 2 +EndChar + +StartChar: asterisk +Encoding: 42 42 41 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +SplineSet +257 601 m 0 + 351 601 l 0 + 349.036 587.217 345.49 584.406 344 570 c 0 + 326 396 l 0 + 510 480 l 0 + 541 409 l 0 + 342 349 l 0 + 488 174 l 0 + 425 124 l 0 + 300 316 l 0 + 170 123 l 0 + 107 174 l 0 + 258 348 l 0 + 58 409 l 0 + 88 484 l 0 + 275 396 l 0 + 257 601 l 0 +EndSplineSet +EndChar + +StartChar: O +Encoding: 79 79 42 +Width: 600 +Flags: HMW +TeX: 79 0 +LayerCount: 2 +Fore +SplineSet +556.008 359.504 m 0 + 556.008 296.095 551.428 206.273 513.069 128.645 c 0 + 465.538 32.4568 382.426 -11.0151 304.485 -11.0151 c 0 + 193.976 -11.0151 43.9996 78.3988 43.9996 362.113 c 0 + 43.9996 645.884 196.081 730 303.761 730 c 0 + 382.353 730 464.443 686.67 511.792 593.902 c 0 + 551.172 516.748 556.008 427.05 556.008 359.504 c 0 +300.361 654.01 m 0 + 224.496 654.01 123.971 587.911 123.971 372.659 c 0 + 123.971 143.053 223.619 67.987 304.834 67.987 c 0 + 353.415 67.987 409.355 95.4454 442.765 165.717 c 0 + 472.355 227.951 475.085 301.614 475.085 348.897 c 0 + 475.085 410.01 471.386 479.154 446.984 539.849 c 0 + 413.335 623.543 351.591 654.01 300.361 654.01 c 0 +EndSplineSet +EndChar + +StartChar: zero +Encoding: 48 48 43 +Width: 600 +Flags: HMWO +TeX: 122 0 +LayerCount: 2 +Fore +SplineSet +301.249 727 m 0 + 412.345 727 531.007 595.219 531.007 348.788 c 0 + 531.007 100.694 407.312 -13.0219 302.525 -13.0219 c 0 + 188.358 -13.0219 67.9924 121.658 67.9924 355.222 c 0 + 67.9924 586.285 186.665 727 301.249 727 c 0 +414.067 561.958 m 1 + 383.092 625.695 339.657 656 300.157 656 c 0 + 228.597 656 143.795 554.031 143.795 369.311 c 0 + 143.795 318.267 149.725 272.506 159.907 232.842 c 1 + 414.067 561.958 l 1 +440.863 484.525 m 1 + 186.653 159.413 l 1 + 218.03 96.0835 262.445 60.8848 305.327 60.8848 c 0 + 369.033 60.8848 456.099 137.611 456.099 339.376 c 0 + 456.099 395.528 450.46 443.805 440.863 484.525 c 1 +EndSplineSet +EndChar + +StartChar: one +Encoding: 49 49 44 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +SplineSet +357 723 m 0 + 357 -1 l 0 + 276 -1 l 0 + 276 622 l 0 + 131 579 l 0 + 112 624 l 0 + 301 723 l 0 + 357 723 l 0 +EndSplineSet +EndChar + +StartChar: two +Encoding: 50 50 45 +Width: 600 +Flags: HMW +TeX: 116 0 +LayerCount: 2 +Fore +SplineSet +100 610 m 0 + 142.552 682.72 220.175 727.008 302.107 727.008 c 0 + 419.975 727.008 511.536 636.692 511.536 524.194 c 0 + 511.536 420.356 437.434 346.096 384.502 296.506 c 0 + 332.446 247.737 248.223 175.987 188 71 c 0 + 491 71 l 0 + 496.284 71 498.692 71.7409 503.392 75.7939 c 0 + 505.8 77.8706 511.479 83.4955 519 81 c 0 + 519 0 l 0 + 95 0 l 0 + 95 51 l 0 + 155.807 170.93 222.305 245.442 304.763 319.728 c 0 + 357.118 366.894 431.226 430.278 431.226 518.244 c 0 + 431.226 595.847 369.481 655.449 292.555 655.449 c 0 + 229.497 655.449 186.147 616.16 169.108 589.668 c 0 + 162.928 580.06 165.889 572.819 159 563 c 0 + 100 610 l 0 +EndSplineSet +EndChar + +StartChar: N +Encoding: 78 78 46 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +68 0 m 0 + 68 722 l 0 + 147 722 l 0 + 450 187 l 0 + 450 723 l 0 + 536 723 l 0 + 536.929 716.255 533.916 710.683 532.621 708.22 c 0 + 529.844 702.938 528 700.058 528 692 c 0 + 528 -1 l 0 + 464 -1 l 0 + 146 568 l 0 + 146 0 l 0 + 68 0 l 0 +EndSplineSet +EndChar + +StartChar: four +Encoding: 52 52 47 +Width: 600 +Flags: HMW +TeX: 102 0 +LayerCount: 2 +Fore +SplineSet +373 723 m 0 + 441 723 l 0 + 441 271 l 0 + 534 271 l 0 + 534 199 l 0 + 441 199 l 0 + 441 0 l 0 + 357 0 l 0 + 357 200 l 0 + 66 200 l 0 + 66 260 l 0 + 373 723 l 0 +358 594 m 0 + 146 271 l 0 + 358 271 l 0 + 358 594 l 0 +EndSplineSet +EndChar + +StartChar: eight +Encoding: 56 56 48 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +SplineSet +309.222 731.061 m 0 + 415.174 731.061 497.201 655.222 497.201 560.081 c 0 + 497.201 490.519 451.989 422.756 382 386 c 0 + 463.398 348.449 521.364 271.387 521.364 186.38 c 0 + 521.364 76.38 425.926 -12.0638 299.122 -12.0638 c 0 + 174.777 -12.0638 79.845 73.9895 79.845 181.557 c 0 + 79.845 264.873 138.311 343.716 224 384 c 0 + 158.829 417.286 113.953 482.052 113.953 553.066 c 0 + 113.953 650.336 198.716 731.061 309.222 731.061 c 0 +285 351 m 0 + 216.282 322.472 162.993 260.535 162.993 192.304 c 0 + 162.993 119.655 224.278 60.9956 302.825 60.9956 c 0 + 380.01 60.9956 439.255 117.609 439.255 187.223 c 0 + 439.255 257.778 377.894 321.691 285 351 c 0 +303.003 663.016 m 0 + 239.989 663.016 191.919 616.894 191.919 559.982 c 0 + 191.919 464.568 319 415 319 415 c 0 + 375.248 445.252 418 499.154 418 554.724 c 0 + 418 615.015 367.541 663.016 303.003 663.016 c 0 +EndSplineSet +EndChar + +StartChar: five +Encoding: 53 53 49 +Width: 600 +Flags: HMW +TeX: 102 0 +LayerCount: 2 +Fore +SplineSet +133 722 m 0 + 499 722 l 0 + 499 649 l 0 + 201 649 l 0 + 190 441 l 0 + 227.409 459.661 267.74 469.014 307.613 469.014 c 0 + 428.503 469.014 526.046 382.829 526.046 228.267 c 0 + 526.046 71.7703 422.799 -13.0166 297.988 -13.0166 c 0 + 212.187 -13.0166 131.88 27.3246 84 98 c 0 + 156 152 l 0 + 165.915 144.928 159.968 133.516 164.636 124.688 c 0 + 168.652 117.094 219.025 57.9865 296.99 57.9865 c 0 + 374.5 57.9865 443.032 118.764 443.032 229.807 c 0 + 443.032 344.87 371.274 402.108 295.262 402.108 c 0 + 245.957 402.108 194.845 377.882 160 334 c 0 + 108 355 l 0 + 133 722 l 0 +EndSplineSet +EndChar + +StartChar: S +Encoding: 83 83 50 +Width: 600 +Flags: HMW +TeX: 83 0 +LayerCount: 2 +Fore +SplineSet +514 636 m 0 + 463 567 l 0 + 460.467 567.77 457.129 570.059 456.897 576.479 c 0 + 456.744 580.739 457.326 583.155 454.259 587.627 c 0 + 426.295 628.402 374.583 659.139 307.322 659.139 c 0 + 224.667 659.139 176.928 608.659 176.928 553.304 c 0 + 176.928 523.788 190.278 480.959 250.701 445.621 c 0 + 316.767 406.982 418.491 386.478 481.296 327.335 c 0 + 526.491 284.776 537.39 234.352 537.39 196.567 c 0 + 537.39 105.698 472.479 -12.0688 296.743 -12.0688 c 0 + 207.646 -12.0688 126.78 19.1667 70 81 c 0 + 118 164 l 0 + 123.54 161.188 123.285 154.812 123.259 152.899 c 0 + 123.193 148.118 122.894 145.188 126.519 140.598 c 0 + 158.801 99.712 219.842 60.9499 299.1 60.9499 c 0 + 403.921 60.9499 456.763 129.108 456.763 191.929 c 0 + 456.763 224.218 443.541 261.931 396.186 291.612 c 0 + 341.618 325.813 237.401 350.797 170.523 400.177 c 0 + 110.323 444.627 93.8001 498.906 93.8001 541.004 c 0 + 93.8001 639.749 183.363 726.008 313.761 726.008 c 0 + 392.466 726.008 465.102 694.099 514 636 c 0 +EndSplineSet +EndChar + +StartChar: M +Encoding: 77 77 51 +Width: 600 +Flags: HMW +TeX: 77 0 +LayerCount: 2 +Fore +SplineSet +57 722 m 0 + 121 722 l 0 + 300 369 l 0 + 482 723 l 0 + 543 723 l 0 + 543 -1 l 0 + 466 -1 l 0 + 466 545 l 0 + 310 254 l 0 + 279 254 l 0 + 133 541 l 0 + 133 -1 l 0 + 57 -1 l 0 + 57 722 l 0 +EndSplineSet +EndChar + +StartChar: L +Encoding: 76 76 52 +Width: 600 +Flags: HMW +TeX: 76 0 +LayerCount: 2 +Fore +SplineSet +87 722 m 0 + 181 722 l 0 + 182.252 713.763 178.671 707.037 176.957 703.776 c 0 + 173.543 697.278 171 693.469 171 683 c 0 + 171 69 l 0 + 519 69 l 0 + 519 -1 l 0 + 87 -1 l 0 + 87 722 l 0 +EndSplineSet +EndChar + +StartChar: ampersand +Encoding: 38 38 53 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +275.219 729.113 m 0 + 362.09 729.113 430.049 664.093 430.049 574.842 c 0 + 430.049 499.041 380.587 423.321 305 382 c 0 + 435 201 l 0 + 462.526 232.964 478.373 266.737 487.03 294.093 c 0 + 487.898 296.839 488.581 299.921 488.581 303.138 c 0 + 488.581 307.706 486.98 312.21 486.98 316.938 c 0 + 486.98 322.596 489.256 326.511 492 329 c 0 + 567 277 l 0 + 540.906 230.061 511.512 184.947 479 142 c 0 + 560 37 l 0 + 492 -14 l 0 + 428 88 l 0 + 382.006 30.9903 310.65 -12.0313 232.619 -12.0313 c 0 + 128.337 -12.0313 51.7317 66.2734 51.7317 169.432 c 0 + 51.7317 258.731 108.958 348.313 198 397 c 0 + 155.129 448.798 115.988 513.456 115.988 577.085 c 0 + 115.988 663.563 187.113 729.113 275.219 729.113 c 0 +195.898 575.613 m 0 + 195.898 545.141 208.5 503.946 266 432 c 0 + 319.757 461.715 354.165 516.513 354.165 569.305 c 0 + 354.165 624.184 316.438 660.403 273.735 660.403 c 0 + 232.647 660.403 195.898 626.428 195.898 575.613 c 0 +238 343 m 0 + 176.427 303.101 139.365 237.448 139.365 177.45 c 0 + 139.365 110.152 186.019 62.8265 245.174 62.8265 c 0 + 322.406 62.8265 386 143 386 143 c 0 + 238 343 l 0 +EndSplineSet +EndChar + +StartChar: F +Encoding: 70 70 54 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +100 723 m 0 + 516 723 l 0 + 516 652 l 0 + 182 652 l 0 + 182 425 l 0 + 452 425 l 0 + 452 355 l 0 + 182 355 l 0 + 182 0 l 0 + 100 0 l 0 + 100 723 l 0 +EndSplineSet +EndChar + +StartChar: w +Encoding: 119 119 55 +Width: 600 +Flags: HMW +TeX: 119 0 +LayerCount: 2 +Fore +SplineSet +28 530 m 0 + 113 530 l 0 + 116.047 520.997 112.999 513.233 111.087 507.077 c 0 + 108.216 497.832 108.458 493.651 110 486 c 0 + 187 104 l 0 + 278 480 l 0 + 329 480 l 0 + 441 105 l 0 + 486.611 406.209 492.089 465.021 490 529 c 0 + 567 529 l 0 + 544.196 351.317 514.841 174.519 479 -1 c 0 + 401 -1 l 0 + 303 342 l 0 + 210 -1 l 0 + 135 -1 l 0 + 28 530 l 0 +EndSplineSet +EndChar + +StartChar: quoteright +Encoding: 257 8217 56 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 25 44 S 1 0 0 1 0 620 2 +EndChar + +StartChar: quoteleft +Encoding: 258 8216 57 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 56 8217 N -1 0 0 -1 565.146 1163.92 2 +EndChar + +StartChar: quotedbl +Encoding: 34 34 58 +Width: 600 +Flags: HMW +TeX: 113 0 +LayerCount: 2 +Fore +Refer: 34 39 S 1 0 0 1 90 0 2 +Refer: 34 39 S 1 0 0 1 -110 0 2 +EndChar + +StartChar: T +Encoding: 84 84 59 +Width: 600 +Flags: HMW +TeX: 84 0 +LayerCount: 2 +Fore +SplineSet +46 723 m 0 + 546 723 l 0 + 546 650 l 0 + 333 650 l 0 + 333 -1 l 0 + 251 -1 l 0 + 251 650 l 0 + 46 650 l 0 + 46 723 l 0 +EndSplineSet +EndChar + +StartChar: hyphen +Encoding: 45 45 60 +Width: 600 +Flags: HMW +TeX: 104 0 +LayerCount: 2 +Fore +SplineSet +92 403 m 0 + 509 403 l 0 + 509 326 l 0 + 92 326 l 0 + 92 403 l 0 +EndSplineSet +EndChar + +StartChar: exclam +Encoding: 33 33 61 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +SplineSet +356.002 55.4912 m 0 + 356.002 17.7 325.296 -13.0169 287.479 -13.0169 c 0 + 249.672 -13.0169 218.954 17.6866 218.954 55.4935 c 0 + 218.954 93.2861 249.66 124.002 287.478 124.002 c 0 + 325.284 124.002 356.002 93.2972 356.002 55.4912 c 0 +289.272 774.001 m 0 + 311.02 774.001 335.403 759.407 344.346 724.32 c 0 + 346.091 717.475 348.76 704.489 348.76 677.25 c 0 + 348.76 632.978 340.895 589.116 338 545 c 0 + 317 225 l 0 + 259 225 l 0 + 242 545 l 0 + 237.955 621.137 230.565 649.274 230.565 686.67 c 0 + 230.565 708.378 233.144 724.012 238.462 736.818 c 0 + 248.803 761.721 269.202 774.001 289.272 774.001 c 0 +EndSplineSet +EndChar + +StartChar: exclamdown +Encoding: 161 161 62 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +Refer: 61 33 N -1 0 0 -1 574.958 760.985 2 +EndChar + +StartChar: U +Encoding: 85 85 63 +Width: 600 +Flags: HMW +TeX: 85 0 +LayerCount: 2 +Fore +SplineSet +68 722 m 0 + 159 722 l 0 + 159.791 720.163 160.2 718.172 160.2 716.15 c 0 + 160.2 709.235 155.631 704.498 152.571 700.195 c 0 + 148.296 694.182 148 690.266 148 685 c 0 + 148 248 l 0 + 148 212.142 148.701 177.155 165.336 141.578 c 0 + 191.299 86.0528 245.805 55.9211 303.067 55.9211 c 0 + 359.414 55.9211 413.783 85.3437 440.467 140.549 c 0 + 458.225 177.288 459 213.693 459 251 c 0 + 459 722 l 0 + 536 722 l 0 + 536 253 l 0 + 536 200.192 534.408 150.173 507.085 99.8136 c 0 + 466.018 24.1247 384.91 -13.0732 301.461 -13.0732 c 0 + 216.265 -13.0732 136.155 24.9771 96.1412 99.2172 c 0 + 69.4091 148.814 68 197.96 68 249 c 0 + 68 249 l 0 + 68 722 l 0 +EndSplineSet +EndChar + +StartChar: numbersign +Encoding: 35 35 64 +Width: 600 +Flags: HMW +TeX: 110 0 +LayerCount: 2 +Fore +SplineSet +211 723 m 5 + 281 726 l 5 + 256.94 527.366 l 5 + 384.587 528.891 l 5 + 407 717 l 5 + 479 720 l 5 + 455.758 529.742 l 5 + 561 531 l 5 + 555 475 l 5 + 448.941 473.939 l 5 + 425.118 278.915 l 5 + 540 281 l 5 + 534 227 l 5 + 418.548 225.134 l 5 + 393 16 l 5 + 323 12 l 5 + 348.259 223.998 l 5 + 219.943 221.924 l 5 + 195 16 l 5 + 127 13 l 5 + 151.587 220.82 l 5 + 39 219 l 5 + 44 272 l 5 + 157.887 274.066 l 5 + 181.217 471.262 l 5 + 55 470 l 5 + 59 525 l 5 + 187.757 526.539 l 5 + 211 723 l 5 +250.228 471.952 m 5 + 226.409 275.31 l 5 + 354.65 277.637 l 5 + 377.955 473.23 l 5 + 250.228 471.952 l 5 +EndSplineSet +EndChar + +StartChar: j +Encoding: 106 106 65 +Width: 600 +Flags: HMW +TeX: 106 0 +LayerCount: 2 +Fore +SplineSet +156 530 m 4 + 437 530 l 4 + 437 37 l 4 + 437 -8.68478 435.772 -52.1052 413.163 -96.3812 c 4 + 377.277 -166.657 303.238 -202.181 227.699 -202.181 c 4 + 162.017 -202.181 103.902 -175.027 66 -128 c 4 + 120 -56 l 4 + 127.204 -61.9473 125.358 -69.4816 130.11 -77.2483 c 4 + 134.378 -84.2222 169.009 -130.016 233.016 -130.016 c 4 + 277.791 -130.016 319.506 -106.298 339.459 -63.2398 c 4 + 352.497 -35.1019 353 -7.27543 353 21 c 4 + 353 461 l 4 + 156 461 l 4 + 156 530 l 4 +396.003 760 m 4 + 429.171 760 456.019 733.28 456.019 700.493 c 4 + 456.019 667.727 429.182 640.992 395.99 640.992 c 4 + 362.818 640.992 335.981 667.716 335.981 700.486 c 4 + 335.981 733.264 362.822 760 396.003 760 c 4 +EndSplineSet +EndChar + +StartChar: x +Encoding: 120 120 66 +Width: 600 +Flags: HMW +TeX: 120 0 +LayerCount: 2 +Fore +SplineSet +430 530 m 1 + 515 530 l 1 + 343.447 272.196 l 1 + 538 0 l 1 + 443 0 l 1 + 297.06 205.835 l 1 + 159 0 l 1 + 65 0 l 1 + 250.856 269.049 l 1 + 68 530 l 1 + 159 530 l 1 + 297.737 333.918 l 1 + 430 530 l 1 +EndSplineSet +EndChar + +StartChar: G +Encoding: 71 71 67 +Width: 600 +Flags: HMW +TeX: 71 0 +LayerCount: 2 +Fore +SplineSet +331.256 729.021 m 0 + 420.211 729.021 499.721 682.82 541 608 c 0 + 484 550 l 0 + 474.934 555.815 472.124 564.988 468.568 572.778 c 0 + 446.485 621.163 395.191 658.068 330.753 658.068 c 0 + 269.931 658.068 205.563 624.733 168.312 554.634 c 0 + 140.066 501.479 131.993 436.71 131.993 369.475 c 0 + 131.993 293.213 140.467 191.911 200.744 123.216 c 0 + 240.013 78.4622 291.335 59.9971 338.046 59.9971 c 0 + 381.069 59.9971 427.485 75.1275 468 104 c 0 + 468 276 l 0 + 337 276 l 0 + 337 346 l 0 + 543 346 l 0 + 543 64 l 0 + 474.935 13.8821 397.763 -11.0487 330.884 -11.0487 c 0 + 204.891 -11.0487 51.8871 79.1096 51.8871 352.371 c 0 + 51.8871 669.165 235.235 729.021 331.256 729.021 c 0 +EndSplineSet +EndChar + +StartChar: k +Encoding: 107 107 68 +Width: 600 +Flags: HMW +TeX: 107 0 +LayerCount: 2 +Fore +SplineSet +87 770 m 0 + 182 770 l 0 + 183.286 762.176 178.153 756.852 175.466 753.359 c 0 + 171.419 748.094 171 745.015 171 740 c 0 + 171 286 l 0 + 436 532 l 0 + 456.53 526.949 477.704 526 498 526 c 0 + 528 526 l 0 + 305 316 l 0 + 565 -1 l 0 + 562.299 -0.982364 559.597 -0.973546 556.896 -0.973546 c 0 + 501.401 -0.973546 457 -5 457 -5 c 0 + 241 265 l 0 + 171 200 l 0 + 171 -1 l 0 + 87 -1 l 0 + 87 770 l 0 +EndSplineSet +EndChar + +StartChar: z +Encoding: 122 122 69 +Width: 600 +Flags: HMW +TeX: 122 0 +LayerCount: 2 +Fore +SplineSet +92 530 m 0 + 504 530 l 0 + 504 473 l 0 + 181 71 l 0 + 496 71 l 0 + 512.142 71 516.579 80.1398 531 78 c 0 + 531 -1 l 0 + 68 -1 l 0 + 68 56 l 0 + 396 457 l 0 + 92 457 l 0 + 92 530 l 0 +EndSplineSet +EndChar + +StartChar: dollar +Encoding: 36 36 70 +Width: 600 +Flags: HMW +TeX: 100 0 +LayerCount: 2 +Fore +SplineSet +282 754 m 1 + 357 754 l 1 + 357.544 752.762 357.825 751.416 357.825 750.046 c 0 + 357.825 741.462 350 741.128 350 730 c 2 + 350 685.53 l 1 + 418.468 678.631 479.448 647.798 522 597 c 1 + 472 534 l 1 + 469.529 534.647 466.405 536.859 465.998 542.031 c 0 + 465.734 545.385 466.586 548.59 464.873 552.132 c 0 + 464.366 553.181 463.571 554.432 459.966 558.804 c 0 + 435.884 588.015 400.197 609.606 350 617.169 c 1 + 350 394.007 l 1 + 376.209 385.213 402.685 376.233 426.693 365.906 c 0 + 451.098 355.408 542.789 316.114 542.789 210.306 c 0 + 542.789 127.201 481.207 35.8962 350 18.7898 c 1 + 350 -54 l 1 + 282 -54 l 1 + 282 16.6512 l 1 + 202.131 21.6382 130.573 53.0648 79 109 c 1 + 129 178 l 1 + 134.731 175.387 134.178 168.719 134.1 167.269 c 0 + 133.829 162.202 133.224 159.078 137.667 154.35 c 0 + 170.199 119.732 221.081 90.2105 282 83.4419 c 1 + 282 338.141 l 1 + 260.848 345.221 239.279 353.278 218.422 363.137 c 0 + 121.008 409.184 101.838 474.448 101.838 516.644 c 0 + 101.838 600.059 175.207 670.816 282 684.586 c 1 + 282 754 l 1 +350 316.849 m 1 + 350 85.8432 l 1 + 424.317 100.222 467.128 152.561 467.128 204.903 c 0 + 467.128 228.695 458.246 267.247 409.599 293.705 c 0 + 393.686 302.36 373.118 309.563 350 316.849 c 1 +282 418.096 m 1 + 282 618.618 l 1 + 209.129 610.103 178.407 566.678 178.407 526.615 c 0 + 178.407 501.336 190.349 466.609 241.42 437.196 c 0 + 253.404 430.294 267.16 424.024 282 418.096 c 1 +EndSplineSet +EndChar + +StartChar: A +Encoding: 65 65 71 +Width: 600 +Flags: HMW +TeX: 65 0 +LayerCount: 2 +Fore +SplineSet +27 -1 m 0 + 282 735 l 0 + 291 735 l 0 + 570 0 l 0 + 486 0 l 0 + 406 211 l 0 + 177 211 l 0 + 107 -1 l 0 + 27 -1 l 0 +388 274 m 0 + 286 549 l 0 + 193 274 l 0 + 388 274 l 0 +EndSplineSet +EndChar + +StartChar: C +Encoding: 67 67 72 +Width: 600 +Flags: HMW +TeX: 67 0 +LayerCount: 2 +Fore +SplineSet +331.618 728 m 0 + 427.542 728 514.176 672.042 553 585 c 0 + 476 547 l 0 + 470.67 550.736 470.716 557.019 470.716 558.375 c 0 + 470.716 561.257 471.207 564.142 471.207 567.016 c 0 + 471.207 572.403 469.516 575.396 467.216 579.368 c 0 + 438.075 629.699 385.397 663.168 328.882 663.168 c 0 + 226.816 663.168 135.987 555.779 135.987 363.969 c 0 + 135.987 168.839 229.418 57.9939 335.655 57.9939 c 0 + 392.317 57.9939 449.702 90.8843 483 146 c 0 + 543 107 l 0 + 497.694 32.979 417.217 -12.0016 331.109 -12.0016 c 0 + 212.178 -12.0016 56.9666 77.8506 56.9666 356.807 c 0 + 56.9666 645.838 219.327 728 331.618 728 c 0 +EndSplineSet +EndChar + +StartChar: B +Encoding: 66 66 73 +Width: 600 +Flags: HMW +TeX: 66 0 +LayerCount: 2 +Fore +SplineSet +66 722 m 0 + 271 722 l 0 + 315.399 722 360.704 721.5 405.879 701.856 c 0 + 473.724 672.354 511 610.49 511 545.61 c 0 + 511 476.391 468.788 413.433 404 387 c 0 + 484.894 359.735 539.123 283.98 539.123 199.903 c 0 + 539.123 125.489 496.411 54.7898 418.712 21.7722 c 0 + 368.818 0.569996 319.11 0 270 0 c 0 + 66 0 l 0 + 66 722 l 0 +146 653 m 0 + 146 423 l 0 + 259 423 l 0 + 291.145 423 325.727 423.132 358.963 437.515 c 0 + 404.424 457.189 429.169 496.927 429.169 538.138 c 0 + 429.169 579.684 403.799 620.586 355.923 639.925 c 0 + 323.833 652.887 290.834 653 260 653 c 0 + 146 653 l 0 +146 355 m 0 + 146 71 l 0 + 284 71 l 0 + 315.204 71 345.804 71.5467 376.985 85.5968 c 0 + 426.877 108.078 454.347 156.379 454.347 208.01 c 0 + 454.347 260.227 425.928 311.754 372.336 337.19 c 0 + 336.297 354.296 300.473 355 264 355 c 0 + 146 355 l 0 +EndSplineSet +EndChar + +StartChar: bracketleft +Encoding: 91 91 74 +Width: 600 +Flags: HMW +TeX: 98 0 +LayerCount: 2 +Fore +SplineSet +162 776 m 0 + 493 776 l 0 + 493 707 l 0 + 236 707 l 0 + 236 -37 l 0 + 494 -37 l 0 + 494 -103 l 0 + 162 -103 l 0 + 162 776 l 0 +EndSplineSet +EndChar + +StartChar: bracketright +Encoding: 93 93 75 +Width: 600 +Flags: HMW +TeX: 98 0 +LayerCount: 2 +Fore +Refer: 74 91 S -1 0 0 1 600 0 2 +EndChar + +StartChar: parenleft +Encoding: 40 40 76 +Width: 600 +Flags: HMW +TeX: 112 0 +LayerCount: 2 +Fore +SplineSet +464 772 m 4 + 499 701 l 4 + 495.074 698.763 491.329 698.611 489.669 698.611 c 4 + 485.073 698.611 481.395 699.932 477.323 699.932 c 4 + 472.717 699.932 469.928 698.14 466.835 696.315 c 4 + 331.453 616.467 251.273 468.859 251.273 303.345 c 4 + 251.273 123.314 344.63 -46.9685 503 -139 c 4 + 465 -200 l 4 + 281.456 -103.658 170.68 88.9922 170.68 299.462 c 4 + 170.68 511.567 284.678 693.118 464 772 c 4 +EndSplineSet +EndChar + +StartChar: parenright +Encoding: 41 41 77 +Width: 600 +Flags: HMW +TeX: 112 0 +LayerCount: 2 +Fore +SplineSet +100 699 m 0 + 122 771 l 0 + 310.266 684.352 432 496.633 432 290.289 c 0 + 432 82.1043 308.169 -110.384 116 -202 c 0 + 94 -132 l 0 + 250.594 -49.1168 350.028 112.597 350.028 286.978 c 0 + 350.028 458.955 253.152 617.58 100 699 c 0 +EndSplineSet +EndChar + +StartChar: three +Encoding: 51 51 78 +Width: 600 +Flags: HMW +TeX: 116 0 +LayerCount: 2 +Fore +SplineSet +486.039 541.353 m 0 + 486.039 471.159 442.787 409.132 378 385 c 0 + 452.906 357.628 502.026 284.533 502.026 198.625 c 0 + 502.026 86.4453 418.041 -12.1905 279.723 -12.1905 c 0 + 207.414 -12.1905 138.424 16.1652 90 70 c 0 + 151 143 l 0 + 161.292 132.464 156.135 121.234 165.975 110.147 c 0 + 171.105 104.367 211.734 61.2614 278.997 61.2614 c 0 + 363.525 61.2614 424.303 129.155 424.303 208.449 c 0 + 424.303 294.507 352.456 345.579 254.688 345.579 c 0 + 242.418 345.579 230.159 344.711 218 343 c 0 + 218 408 l 0 + 286.501 408.15 319.346 420.748 332.04 426.323 c 0 + 382.02 448.274 409.043 495.946 409.043 539.93 c 0 + 409.043 600.917 357.627 652.425 283.533 652.425 c 0 + 238.887 652.425 192.677 633.092 159 597 c 0 + 114 647 l 0 + 159.315 696.504 222.364 724.29 287.492 724.29 c 0 + 401.687 724.29 486.039 639.912 486.039 541.353 c 0 +EndSplineSet +EndChar + +StartChar: D +Encoding: 68 68 79 +Width: 600 +Flags: HMW +TeX: 68 0 +LayerCount: 2 +Fore +SplineSet +72 722 m 0 + 241 722 l 0 + 304.677 722 356.645 717.434 409.104 683.3 c 0 + 501.966 622.876 543.181 501.213 543.181 362.199 c 0 + 543.181 204.202 486.7 81.1929 383.192 27.9784 c 0 + 332.292 1.81019 284.391 -1 227 -1 c 0 + 72 -1 l 0 + 72 722 l 0 +149 653 m 0 + 149 63 l 0 + 223 63 l 0 + 268.397 63 312.737 65.0195 358.002 95.5625 c 0 + 415.69 134.488 461.352 213.696 461.352 351.331 c 0 + 461.352 455.017 438.945 557.739 371.85 613.352 c 0 + 327.165 650.39 281.491 653 236 653 c 0 + 149 653 l 0 +EndSplineSet +EndChar + +StartChar: E +Encoding: 69 69 80 +Width: 600 +Flags: HMW +TeX: 69 0 +LayerCount: 2 +Fore +SplineSet +78 723 m 0 + 521 723 l 0 + 521 651 l 0 + 155 651 l 0 + 155 414 l 0 + 457 414 l 0 + 457 340 l 0 + 155 340 l 0 + 155 72 l 0 + 518 72 l 0 + 518 0 l 0 + 78 0 l 0 + 78 723 l 0 +EndSplineSet +EndChar + +StartChar: V +Encoding: 86 86 81 +Width: 600 +Flags: HMW +TeX: 86 0 +LayerCount: 2 +Fore +SplineSet +39 723 m 0 + 124 723 l 0 + 309 168 l 0 + 484 722 l 0 + 564 722 l 0 + 322 -5 l 0 + 285 -5 l 0 + 39 723 l 0 +EndSplineSet +EndChar + +StartChar: percent +Encoding: 37 37 82 +Width: 600 +Flags: HMW +TeX: 112 0 +LayerCount: 2 +Fore +SplineSet +463 722 m 0 + 541 722 l 0 + 137 0 l 0 + 63 0 l 0 + 463 722 l 0 +171.904 735.106 m 0 + 242.474 735.106 302.16 670.55 302.16 582.187 c 0 + 302.16 496.123 243.528 431.982 172.952 431.982 c 0 + 101.84 431.982 42.8516 496.911 42.8516 583.448 c 0 + 42.8516 672.526 103.042 735.106 171.904 735.106 c 0 +170.33 674.005 m 0 + 147.48 674.005 112.978 656.124 112.978 587.43 c 0 + 112.978 508.953 151.261 493.911 172.149 493.911 c 0 + 195.202 493.911 229.092 512.141 229.092 579.148 c 0 + 229.092 661.667 189.098 674.005 170.33 674.005 c 0 +569.018 138.593 m 0 + 569.018 51.7449 509.983 -12.1238 439.695 -12.1238 c 0 + 369.049 -12.1238 309.98 52.0529 309.98 138.262 c 0 + 309.98 225.089 369.219 289.001 439.589 289.001 c 0 + 510.127 289.001 569.018 224.871 569.018 138.593 c 0 +439.32 229.005 m 0 + 414.436 229.005 378.994 208.941 378.994 138.34 c 0 + 378.994 69.8907 413.149 46.7696 440.303 46.7696 c 0 + 465.114 46.7696 500.009 66.7942 500.009 135.903 c 0 + 500.009 210.33 463.157 229.005 439.32 229.005 c 0 +EndSplineSet +EndChar + +StartChar: J +Encoding: 74 74 83 +Width: 600 +Flags: HMW +TeX: 74 0 +LayerCount: 2 +Fore +SplineSet +209 722 m 0 + 539 722 l 0 + 539 654 l 0 + 428 654 l 0 + 428 242 l 0 + 428 189.714 427.529 134.891 399.871 83.1312 c 0 + 366.41 20.5134 303.824 -13.1014 235.465 -13.1014 c 0 + 171.621 -13.1014 109.768 15.8267 67 67 c 0 + 121 133 l 0 + 127.875 126.68 123.023 118.695 128.162 112.068 c 0 + 130.663 108.842 176.362 58.6812 236.758 58.6812 c 0 + 271.444 58.6812 302.787 75.9435 322.107 104.722 c 0 + 348.989 144.764 348 196.3 348 241 c 0 + 348 654 l 0 + 209 654 l 0 + 209 722 l 0 +EndSplineSet +EndChar + +StartChar: K +Encoding: 75 75 84 +Width: 600 +Flags: HMW +TeX: 75 0 +LayerCount: 2 +Fore +SplineSet +59 723 m 0 + 156 723 l 0 + 157.286 715.176 152.153 709.852 149.466 706.359 c 0 + 145.419 701.094 145 698.015 145 693 c 0 + 145 389 l 0 + 447 728 l 0 + 466.858 722.945 487.384 722 507 722 c 0 + 537 722 l 0 + 264 410 l 0 + 556 -1 l 0 + 498.81 -0.826198 453 -5 453 -5 c 0 + 202 361 l 0 + 145 299 l 0 + 145 0 l 0 + 59 0 l 0 + 59 723 l 0 +EndSplineSet +EndChar + +StartChar: P +Encoding: 80 80 85 +Width: 600 +Flags: HMW +TeX: 80 0 +LayerCount: 2 +Fore +SplineSet +78 722 m 0 + 298 722 l 0 + 344.56 722 389.35 720.81 434.624 697.494 c 0 + 502.828 662.37 538.016 591.718 538.016 518.699 c 0 + 538.016 445.503 502.883 376.352 436.114 342.409 c 0 + 392.262 320.116 348.977 319 304 319 c 0 + 304 319 l 0 + 162 319 l 0 + 162 0 l 0 + 78 0 l 0 + 78 722 l 0 +162 646 m 0 + 161 390 l 0 + 307 390 l 0 + 335.466 390 362.993 390.678 390.831 404.763 c 0 + 432.659 425.926 455.003 468.944 455.003 514.986 c 0 + 455.003 561.985 431.629 607.921 386.619 630.5 c 0 + 357.19 645.263 328.165 646 298 646 c 0 + 162 646 l 0 +EndSplineSet +EndChar + +StartChar: question +Encoding: 63 63 86 +Width: 600 +Flags: HMW +TeX: 113 0 +LayerCount: 2 +Fore +SplineSet +381.002 51.4929 m 0 + 381.002 15.0088 350.552 -15.046 312.441 -15.046 c 0 + 274.415 -15.046 243.952 14.9803 243.952 51.509 c 0 + 243.952 87.9628 274.383 118.002 312.462 118.002 c 0 + 350.556 118.002 381.002 87.961 381.002 51.4929 c 0 +84 650 m 0 + 134.425 727.691 220.637 771.06 307.402 771.06 c 0 + 438.699 771.06 513.24 674.633 513.24 566.639 c 0 + 513.24 457.756 436.646 413.666 398.404 379.676 c 0 + 350.692 337.269 348 302.835 348 262 c 0 + 348 214 l 0 + 272 214 l 0 + 272 262 l 0 + 272 314.014 275.26 354.806 326.449 411.013 c 0 + 361.471 449.468 421.576 496.796 421.576 572.709 c 0 + 421.576 641.182 368.948 695.153 299.634 695.153 c 0 + 241.046 695.153 179.542 656.112 143 595 c 0 + 84 650 l 0 +EndSplineSet +EndChar + +StartChar: at +Encoding: 64 64 87 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +SplineSet +514 35 m 0 + 465.464 3.64213 409.094 -13.0048 351.681 -13.0048 c 0 + 207.208 -13.0048 45.979 94.7502 45.979 363.717 c 0 + 45.979 626.559 197.939 733 324.448 733 c 0 + 408.454 733 485.773 686.98 523.017 604.767 c 0 + 548.262 549.038 549 493.218 549 438 c 0 + 549 203 l 0 + 479 203 l 0 + 479 247 l 0 + 450.306 212.734 407.914 192.94 363.251 192.94 c 0 + 280.295 192.94 212.67 260.162 212.67 343.965 c 0 + 212.67 406.432 250.973 468.115 322.793 496.582 c 0 + 368.543 514.716 414.747 515 459 515 c 0 + 476 515 l 0 + 475.939 600.733 407.704 671.014 321.098 671.014 c 0 + 220.711 671.014 112.988 575.649 112.988 367.243 c 0 + 112.988 141.221 246.229 52.9323 358.489 52.9323 c 0 + 402.842 52.9323 446.203 66.182 483 91 c 0 + 514 35 l 0 +479 457 m 0 + 460 457 l 0 + 418.559 457 369.9 456.608 330.805 429.771 c 0 + 299.601 408.352 284.927 377.014 284.927 347.37 c 0 + 284.927 297.233 325.741 256.964 376.598 256.964 c 0 + 410.056 256.964 444.081 274.841 462.01 309.68 c 0 + 480.087 344.808 479 389.066 479 435 c 0 + 479 457 l 0 +EndSplineSet +EndChar + +StartChar: bar +Encoding: 124 124 88 +Width: 600 +Flags: HMW +TeX: 98 0 +LayerCount: 2 +Fore +SplineSet +261 756 m 0 + 339 756 l 0 + 339 -175 l 0 + 261 -175 l 0 + 261 756 l 0 +EndSplineSet +EndChar + +StartChar: asciitilde +Encoding: 126 126 89 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +SplineSet +116 396 m 4 + 58 434 l 4 + 92.198 492.034 151.499 538.051 217.153 538.051 c 4 + 312.781 538.051 343.146 450.999 409.264 450.999 c 4 + 447.27 450.999 474.649 480.653 508 526 c 4 + 561 482 l 4 + 530.811 436.285 473.381 375.377 400.536 375.377 c 4 + 306.617 375.377 282.907 467.595 212.175 467.595 c 4 + 179.423 467.595 145.323 443.982 116 396 c 4 +EndSplineSet +EndChar + +StartChar: asciicircum +Encoding: 94 94 90 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +SplineSet +118 425 m 0 + 295 722 l 0 + 320 722 l 0 + 477 426 l 0 + 415 397 l 0 + 303 600 l 0 + 176 397 l 0 + 118 425 l 0 +EndSplineSet +EndChar + +StartChar: cent +Encoding: 162 162 91 +Width: 600 +Flags: HMW +TeX: 99 0 +LayerCount: 2 +Fore +SplineSet +340 723 m 1 + 418 715 l 1 + 418.775 707.498 415.212 701.298 413.826 698.827 c 0 + 410.853 693.526 409.047 690.934 408 683 c 2 + 395.457 587.822 l 1 + 458.442 575.242 504.754 541.294 533 498 c 1 + 482 432 l 1 + 476.607 435.758 476.706 442.016 476.706 443.549 c 0 + 476.706 450.099 478.707 455.066 472.749 462.134 c 0 + 457.796 479.871 428.657 504.643 386.192 517.517 c 1 + 332.752 112 l 1 + 333.469 111.999 l 2 + 389.462 111.999 444.705 135.589 485 177 c 1 + 527 121 l 1 + 477.291 66.4244 406.711 37.9886 331.604 37.9886 c 0 + 328.725 37.9886 325.862 38.0286 323.014 38.1081 c 1 + 306 -91 l 1 + 239 -83 l 1 + 255.422 48.0539 l 1 + 141.433 79.5748 66 182.291 66 315.836 c 0 + 66 471.215 168.407 585.207 323.673 592.709 c 1 + 340 723 l 1 +265.044 124.836 m 1 + 315.274 525.684 l 1 + 219.938 519.993 147.95 447.755 147.95 326.544 c 0 + 147.95 225.647 194.972 152.96 265.044 124.836 c 1 +EndSplineSet +EndChar + +StartChar: euro +Encoding: 164 8364 92 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +548 665 m 5 + 519 586 l 5 + 510.733 592.758 515.379 602.068 509.042 609.779 c 4 + 507.922 611.142 464.815 661.167 386.755 661.167 c 4 + 317.566 661.167 233.594 620.979 199.483 502.334 c 4 + 197.686 496.082 195.746 488.698 193.828 480 c 5 + 480 480 l 5 + 455 413 l 5 + 184.084 413 l 5 + 182.441 393.403 181.417 370.757 181.417 344.613 c 4 + 181.417 336.225 181.561 328.021 181.852 320 c 5 + 420 320 l 5 + 394 253 l 5 + 188.48 253 l 5 + 196.603 205.904 211.936 166.8 235.532 134.868 c 4 + 276.315 79.6765 335.261 56.791 388.936 56.791 c 4 + 435.098 56.791 479.134 73.5085 513 104 c 5 + 546 46 l 5 + 501.68 7.4161 444.786 -13.1265 384.233 -13.1265 c 4 + 290.458 -13.1265 145.304 38.4687 114.986 253 c 5 + 48 253 l 5 + 63 320 l 5 + 109.56 320 l 5 + 109.4 326.06 109.319 332.225 109.319 338.496 c 4 + 109.319 363.479 110.295 388.448 112.538 413 c 5 + 48 413 l 5 + 63 480 l 5 + 122.297 480 l 5 + 130.798 521.099 144.028 559.766 163.557 593.831 c 4 + 222.805 697.179 318.974 727.394 391.356 727.394 c 4 + 452.52 727.394 507.764 705.737 548 665 c 5 +EndSplineSet +EndChar + +StartChar: sterling +Encoding: 163 163 93 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +Fore +SplineSet +494 663 m 1 + 443 599 l 1 + 433.543 605.934 434.27 615.246 427.512 622.673 c 0 + 422.593 628.078 390.006 656.128 341.348 656.128 c 0 + 279.173 656.128 217.781 609.4 217.781 512.955 c 0 + 217.781 488.175 221.729 463.315 227.168 438 c 1 + 342 438 l 1 + 342 372 l 1 + 242.811 372 l 1 + 251.234 336.143 258.537 298.852 258.537 259.182 c 0 + 258.537 201.957 243.517 148.5 216 104 c 1 + 226.25 105.791 236.644 106.675 247.063 106.675 c 0 + 324.103 106.675 372.006 58.9164 438.359 58.9164 c 0 + 470.325 58.9164 500.468 70.8547 524 91 c 1 + 555 31 l 1 + 528.906 10.2532 484.714 -17.1633 434.141 -17.1633 c 0 + 360.259 -17.1633 311.803 34.666 227.673 34.666 c 0 + 203.994 34.666 159.283 30.2658 85 -9 c 1 + 55 57 l 1 + 108.912 81.9053 122.949 87.4528 141.287 115.98 c 0 + 167.053 156.062 181.214 204.698 181.214 256.851 c 0 + 181.214 296.572 172.952 334.482 163.82 372 c 1 + 88 372 l 1 + 88 438 l 1 + 148.325 438 l 1 + 143.399 462.328 139.93 486.842 139.93 511.928 c 0 + 139.93 641.884 235.856 722.006 343.371 722.006 c 0 + 398.585 722.006 452.418 701.138 494 663 c 1 +EndSplineSet +EndChar + +StartChar: Y +Encoding: 89 89 94 +Width: 600 +Flags: HMW +TeX: 89 0 +LayerCount: 2 +Fore +SplineSet +43 723 m 0 + 135 723 l 0 + 312 372 l 0 + 472 722 l 0 + 558 722 l 0 + 353 285 l 0 + 353 0 l 0 + 265 0 l 0 + 265 285 l 0 + 43 723 l 0 +EndSplineSet +EndChar + +StartChar: yen +Encoding: 165 165 95 +Width: 600 +Flags: HMW +TeX: 121 0 +LayerCount: 2 +Fore +SplineSet +52 723 m 1 + 142 723 l 1 + 310 421 l 1 + 464 722 l 1 + 550 722 l 1 + 348 342 l 1 + 348 318 l 1 + 504 318 l 1 + 504 252 l 1 + 348 252 l 1 + 348 179 l 1 + 504 179 l 1 + 504 114 l 1 + 348 114 l 1 + 348 0 l 1 + 269 0 l 1 + 269 114 l 1 + 107 114 l 1 + 107 179 l 1 + 269 179 l 1 + 269 252 l 1 + 107 252 l 1 + 107 318 l 1 + 269 318 l 1 + 269 342 l 1 + 52 723 l 1 +EndSplineSet +EndChar + +StartChar: Z +Encoding: 90 90 96 +Width: 600 +Flags: HMW +TeX: 90 0 +LayerCount: 2 +Fore +SplineSet +82 722 m 0 + 528 722 l 0 + 527 665 l 0 + 170 71 l 0 + 511 71 l 0 + 527.142 71 531.579 80.1398 546 78 c 0 + 546 -1 l 0 + 68 -1 l 0 + 68 56 l 0 + 432 649 l 0 + 82 649 l 0 + 82 722 l 0 +EndSplineSet +EndChar + +StartChar: Q +Encoding: 81 81 97 +Width: 600 +Flags: HMW +TeX: 81 0 +LayerCount: 2 +Fore +SplineSet +300.491 656.024 m 0 + 221.775 656.024 122.96 585.888 122.96 373.877 c 0 + 122.96 144.877 220.551 63.9921 305.427 63.9921 c 0 + 366.012 63.9921 478.121 108.342 478.121 348.259 c 0 + 478.121 408.965 473.721 479.175 448.587 540.782 c 0 + 413.795 626.06 351.323 656.024 300.491 656.024 c 0 +556.015 357.88 m 0 + 556.015 294.497 551.45 205.023 513.096 127.795 c 0 + 473.396 47.8558 408.806 4.43529 343.02 -7.54866 c 1 + 344.367 -47.6073 355.333 -95.0859 427.899 -95.0859 c 0 + 453.816 -95.0859 485.178 -90.5919 522 -89 c 1 + 520 -168 l 1 + 436.632 -167.285 386.166 -172.61 341.235 -150.307 c 0 + 288.619 -124.19 270.811 -74.3879 271.79 -8.40479 c 1 + 166.776 8.0711 43.9994 105.441 43.9994 361.966 c 0 + 43.9994 646.356 196.451 730 303.805 730 c 0 + 383.023 730 465.547 686.019 512.626 592.269 c 0 + 551.227 515.402 556.015 426.335 556.015 357.88 c 0 +EndSplineSet +EndChar + +StartChar: thorn +Encoding: 254 254 98 +Width: 600 +Flags: HMW +TeX: 116 0 +LayerCount: 2 +Fore +SplineSet +80 770 m 0 + 172 770 l 0 + 172.534 754.226 164 750.539 164 732 c 0 + 164 448 l 0 + 199.965 505.862 263.255 541 331.196 541 c 0 + 435.346 541 546.008 457.517 546.008 270.69 c 0 + 546.008 76.5707 432.1 -14.1497 323.885 -14.1497 c 0 + 259.582 -14.1497 200.339 17.6548 165 70 c 0 + 165 -193 l 0 + 80 -193 l 0 + 80 770 l 0 +300.599 469.911 m 0 + 247.269 469.911 198.023 440.745 177.865 393.197 c 0 + 166.21 365.704 163.875 333.505 163.875 288.853 c 0 + 163.875 212.177 163.543 168.56 179.045 132.849 c 0 + 199.943 84.7085 249.872 59.8372 300.077 59.8372 c 0 + 349.666 59.8372 459.207 86.5412 459.207 253.487 c 0 + 459.207 445.62 347.069 469.911 300.599 469.911 c 0 +EndSplineSet +EndChar + +StartChar: questiondown +Encoding: 191 191 99 +Width: 600 +Flags: HMW +TeX: 113 0 +LayerCount: 2 +Fore +Refer: 86 63 N -1 0 0 -1 601.159 755.969 2 +EndChar + +StartChar: plusminus +Encoding: 177 177 100 +Width: 600 +Flags: HMW +TeX: 112 0 +LayerCount: 2 +Fore +SplineSet +63 93 m 4 + 540 93 l 4 + 540 20 l 4 + 63 20 l 4 + 63 93 l 4 +EndSplineSet +Refer: 28 43 N 1 0 0 1 0 60 2 +EndChar + +StartChar: R +Encoding: 82 82 101 +Width: 600 +Flags: HMW +TeX: 82 0 +LayerCount: 2 +Fore +SplineSet +75 722 m 0 + 288 722 l 0 + 334.667 722 380.248 720.95 425.988 697.719 c 0 + 492.448 663.965 528.143 596.481 528.143 523.978 c 0 + 528.143 428.394 468.499 345.903 381 322 c 0 + 548 0 l 0 + 457 0 l 0 + 297 319 l 0 + 157 319 l 0 + 157 0 l 0 + 75 0 l 0 + 75 722 l 0 +157 646 m 0 + 157 390 l 0 + 297 390 l 0 + 325.466 390 352.993 390.678 380.831 404.763 c 0 + 422.659 425.926 445.003 468.944 445.003 514.986 c 0 + 445.003 561.985 421.629 607.921 376.619 630.5 c 0 + 347.19 645.263 318.165 646 288 646 c 0 + 157 646 l 0 +EndSplineSet +EndChar + +StartChar: X +Encoding: 88 88 102 +Width: 600 +Flags: HMW +TeX: 88 0 +LayerCount: 2 +Fore +SplineSet +449 723 m 1 + 530 723 l 1 + 347.292 370.084 l 1 + 552 0 l 1 + 461 0 l 1 + 300.474 286.156 l 1 + 146 0 l 1 + 57 0 l 1 + 254.441 368.201 l 1 + 61 723 l 1 + 148 723 l 1 + 300.153 448.564 l 1 + 449 723 l 1 +EndSplineSet +EndChar + +StartChar: six +Encoding: 54 54 103 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +Fore +SplineSet +342.659 730.138 m 0 + 401.412 730.138 458.584 705.809 501 664 c 0 + 445 602 l 0 + 434.368 609.82 434.59 620.671 427.517 628.077 c 0 + 423.092 632.711 391.165 658.246 343.16 658.246 c 0 + 291.254 658.246 172.411 625.987 168 379 c 0 + 199.898 432.999 258.013 466.137 321.005 466.137 c 0 + 423.075 466.137 519.08 379.808 519.08 229.538 c 0 + 519.08 80.8581 422.752 -12.0026 312.997 -12.0026 c 0 + 248.704 -12.0026 184.458 20.3794 142.414 83.8806 c 0 + 96.0423 153.919 87.8103 244.182 87.8103 328.725 c 0 + 87.8103 398.015 94.4787 482.075 118.688 550.855 c 0 + 163.122 677.091 256.592 730.138 342.659 730.138 c 0 +313.429 395.091 m 0 + 259.837 395.091 204.549 357.227 172 298 c 0 + 162.434 163.097 228.337 59.9447 316.419 59.9447 c 0 + 377.654 59.9447 440.168 112.511 440.168 225.41 c 0 + 440.168 349.842 371.467 395.091 313.429 395.091 c 0 +EndSplineSet +EndChar + +StartChar: nine +Encoding: 57 57 104 +Width: 600 +Flags: HMW +TeX: 110 0 +LayerCount: 2 +Fore +SplineSet +261.675 -12.1561 m 0 + 202.075 -12.1561 144.572 11.7985 102 54 c 0 + 158 116 l 0 + 170.321 108.179 167.108 95.6999 176.888 88.125 c 0 + 177.128 87.939 212.027 61.8787 263.838 61.8787 c 0 + 315.736 61.8787 375.697 88.07 406.577 161.072 c 0 + 414.19 179.068 432.572 227.741 436 340 c 0 + 402.346 291.195 346.701 261.958 287.116 261.958 c 0 + 182.228 261.958 88.9944 351.151 88.9944 489.856 c 0 + 88.9944 629.773 183.329 729 295.648 729 c 0 + 371.017 729 454.143 682.757 491.757 572.33 c 0 + 508.564 522.989 516.664 460.639 516.664 370.261 c 0 + 516.664 252.09 498.421 189.45 485.749 156.035 c 0 + 442.004 40.6809 349.796 -12.1561 261.675 -12.1561 c 0 +294.989 332.729 m 0 + 346.985 332.729 400.082 367.207 432 421 c 0 + 444.812 566.747 376.145 657.043 293.961 657.043 c 0 + 228.457 657.043 167.969 598.264 167.969 493.195 c 0 + 167.969 385.709 230.618 332.729 294.989 332.729 c 0 +EndSplineSet +EndChar + +StartChar: seven +Encoding: 55 55 105 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +Fore +SplineSet +101 722 m 0 + 510 722 l 0 + 510 677 l 0 + 461.138 565.327 415.446 452.266 373 338 c 0 + 331.553 226.425 293.2 113.7 258 0 c 0 + 167 0 l 0 + 209.792 129.784 255.811 258.503 305 386 c 0 + 338.534 472.918 373.54 559.268 410 645 c 0 + 101 645 l 0 + 101 722 l 0 +EndSplineSet +EndChar + +StartChar: W +Encoding: 87 87 106 +Width: 600 +Flags: HMW +TeX: 87 0 +LayerCount: 2 +Fore +SplineSet +30 722 m 0 + 105 722 l 0 + 183 234 l 0 + 299 669 l 0 + 324 669 l 0 + 441 232 l 0 + 507 722 l 0 + 575 722 l 0 + 461 -5 l 0 + 429 -5 l 0 + 305 472 l 0 + 179 -5 l 0 + 146 -5 l 0 + 30 722 l 0 +EndSplineSet +EndChar + +StartChar: acute +Encoding: 260 180 107 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +348 810 m 4 + 421 761 l 4 + 304 605 l 4 + 246 640 l 4 + 348 810 l 4 +EndSplineSet +EndChar + +StartChar: aacute +Encoding: 225 225 108 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 0 97 N 1 0 0 1 0 0 2 +EndChar + +StartChar: agrave +Encoding: 224 224 109 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +Refer: 130 715 S 1 0 0 1 0 0 2 +Refer: 0 97 N 1 0 0 1 0 0 2 +EndChar + +StartChar: acircumflex +Encoding: 226 226 110 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +Refer: 137 710 S 1 0 0 1 8 0 2 +Refer: 0 97 N 1 0 0 1 0 0 2 +EndChar + +StartChar: atilde +Encoding: 227 227 111 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +Refer: 138 732 S 1 0 0 1 11 0 2 +Refer: 0 97 N 1 0 0 1 0 0 2 +EndChar + +StartChar: adieresis +Encoding: 228 228 112 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 15 0 2 +Refer: 0 97 N 1 0 0 1 0 0 2 +EndChar + +StartChar: aring +Encoding: 229 229 113 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +Refer: 161 730 S 1 0 0 1 0 0 2 +Refer: 0 97 N 1 0 0 1 0 0 2 +EndChar + +StartChar: egrave +Encoding: 232 232 114 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +Refer: 130 715 S 1 0 0 1 0 0 2 +Refer: 9 101 N 1 0 0 1 0 0 2 +EndChar + +StartChar: eacute +Encoding: 233 233 115 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 9 101 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ecircumflex +Encoding: 234 234 116 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +Refer: 137 710 S 1 0 0 1 0 0 2 +Refer: 9 101 N 1 0 0 1 0 0 2 +EndChar + +StartChar: edieresis +Encoding: 235 235 117 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 2 0 2 +Refer: 9 101 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ograve +Encoding: 242 242 118 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +Refer: 130 715 S 1 0 0 1 0 0 2 +Refer: 5 111 N 1 0 0 1 0 0 2 +EndChar + +StartChar: oacute +Encoding: 243 243 119 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 5 111 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ocircumflex +Encoding: 244 244 120 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +Refer: 137 710 S 1 0 0 1 0 0 2 +Refer: 5 111 N 1 0 0 1 0 0 2 +EndChar + +StartChar: otilde +Encoding: 245 245 121 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +Refer: 138 732 S 1 0 0 1 0 0 2 +Refer: 5 111 N 1 0 0 1 0 0 2 +EndChar + +StartChar: odieresis +Encoding: 246 246 122 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 0 0 2 +Refer: 5 111 N 1 0 0 1 0 0 2 +EndChar + +StartChar: oslash +Encoding: 248 248 123 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +SplineSet +301.758 470.103 m 0 + 220.795 470.103 144.985 397.575 144.985 267.806 c 0 + 144.985 210.232 159.811 162.64 183.62 127.42 c 1 + 362.111 455.844 l 1 + 342.74 465.435 322.083 470.103 301.758 470.103 c 0 +543.113 262.304 m 0 + 543.113 86.8043 430.326 -14 304.969 -14 c 0 + 267.109 -14 230.757 -4.85803 198.107 11.9174 c 1 + 151 -74 l 1 + 91 -43 l 1 + 142.317 51.4236 l 1 + 90.4093 100.283 56.8677 173.482 56.8677 260.578 c 0 + 56.8677 424.14 172.53 541.005 307.44 541.005 c 0 + 338.595 541.005 369.418 534.573 397.992 521.866 c 1 + 441 601 l 1 + 503 568 l 1 + 456.732 483.613 l 1 + 508.189 437.145 543.113 362.872 543.113 262.304 c 0 +416.343 409.949 m 1 + 234.443 78.1878 l 1 + 256.267 64.9671 280.584 57.9927 305.614 57.9927 c 0 + 382.884 57.9927 459.167 125.6 459.167 258.844 c 0 + 459.167 325.471 442.141 375.404 416.343 409.949 c 1 +EndSplineSet +EndChar + +StartChar: ugrave +Encoding: 249 249 124 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +Refer: 130 715 S 1 0 0 1 0 0 2 +Refer: 15 117 N 1 0 0 1 0 0 2 +EndChar + +StartChar: uacute +Encoding: 250 250 125 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 15 117 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ucircumflex +Encoding: 251 251 126 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +Refer: 137 710 S 1 0 0 1 0 0 2 +Refer: 15 117 N 1 0 0 1 0 0 2 +EndChar + +StartChar: udieresis +Encoding: 252 252 127 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 0 0 2 +Refer: 15 117 N 1 0 0 1 0 0 2 +EndChar + +StartChar: yacute +Encoding: 253 253 128 +Width: 600 +Flags: HMW +TeX: 121 0 +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 23 121 S 1 0 0 1 0 0 2 +EndChar + +StartChar: ydieresis +Encoding: 255 255 129 +Width: 600 +Flags: HMW +TeX: 121 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 0 0 2 +Refer: 23 121 N 1 0 0 1 0 0 2 +EndChar + +StartChar: uni02CB +Encoding: 259 715 130 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 107 180 S -1 0 0 1 640 0 2 +EndChar + +StartChar: igrave +Encoding: 236 236 131 +Width: 600 +Flags: HMW +TeX: 105 0 +LayerCount: 2 +Fore +Refer: 130 715 S 1 0 0 1 -50 0 2 +Refer: 136 305 N 1 0 0 1 0 0 2 +EndChar + +StartChar: iacute +Encoding: 237 237 132 +Width: 600 +Flags: HMW +TeX: 105 0 +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 136 305 N 1 0 0 1 0 0 2 +EndChar + +StartChar: icircumflex +Encoding: 238 238 133 +Width: 600 +Flags: HMW +TeX: 105 0 +LayerCount: 2 +Fore +Refer: 137 710 S 1 0 0 1 -14 0 2 +Refer: 136 305 N 1 0 0 1 0 0 2 +EndChar + +StartChar: idieresis +Encoding: 239 239 134 +Width: 600 +Flags: HMW +TeX: 105 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 -2 0 2 +Refer: 136 305 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ntilde +Encoding: 241 241 135 +Width: 600 +Flags: HMW +TeX: 110 0 +LayerCount: 2 +Fore +Refer: 138 732 S 1 0 0 1 -6 0 2 +Refer: 6 110 N 1 0 0 1 0 0 2 +EndChar + +StartChar: dotlessi +Encoding: 272 305 136 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +133 530 m 0 + 345 530 l 0 + 345 67 l 0 + 469 67 l 0 + 469 0 l 0 + 126 0 l 0 + 126 67 l 0 + 261 67 l 0 + 261 462 l 0 + 133 462 l 0 + 133 530 l 0 +EndSplineSet +EndChar + +StartChar: circumflex +Encoding: 261 710 137 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +165 631 m 0 + 294 794 l 0 + 319 794 l 0 + 447 630 l 0 + 393 590 l 0 + 303 709 l 0 + 209 591 l 0 + 165 631 l 0 +EndSplineSet +EndChar + +StartChar: tilde +Encoding: 262 732 138 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +167 646 m 0 + 115 683 l 0 + 157.86 750.837 200.854 783.268 246.029 783.268 c 0 + 292.862 783.268 323.97 749.067 338.861 733.55 c 0 + 357.642 713.979 375.041 696.93 396.658 696.93 c 0 + 425.237 696.93 438.799 723.991 464 758 c 0 + 507 712 l 0 + 466.944 662.14 435.39 629.754 392.65 629.754 c 0 + 325.264 629.754 293.884 717.432 242.844 717.432 c 0 + 212.153 717.432 194.763 690.786 167 646 c 0 +EndSplineSet +EndChar + +StartChar: dieresis +Encoding: 266 168 139 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +257.019 711.498 m 0 + 257.019 679.211 230.789 652.981 198.502 652.981 c 0 + 166.212 652.981 139.981 679.209 139.981 711.499 c 0 + 139.981 743.789 166.21 770.019 198.5 770.019 c 0 + 230.79 770.019 257.019 743.789 257.019 711.498 c 0 +463.002 711.512 m 0 + 463.002 679.168 436.956 652.991 405.005 652.991 c 0 + 373.061 652.991 346.998 679.155 346.998 711.514 c 0 + 346.998 743.862 373.052 770.035 405.008 770.035 c 0 + 436.936 770.035 463.002 743.877 463.002 711.512 c 0 +EndSplineSet +EndChar + +StartChar: scaron +Encoding: 168 353 140 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +Fore +Refer: 143 711 S 1 0 0 1 0 0 2 +Refer: 3 115 N 1 0 0 1 0 0 2 +EndChar + +StartChar: zcaron +Encoding: 184 382 141 +Width: 600 +Flags: HMW +TeX: 122 0 +LayerCount: 2 +Fore +Refer: 143 711 S 1 0 0 1 0 0 2 +Refer: 69 122 N 1 0 0 1 0 0 2 +EndChar + +StartChar: periodcentered +Encoding: 183 183 142 +Width: 600 +Flags: HMW +TeX: 112 0 +LayerCount: 2 +Fore +Refer: 24 46 S 1 0 0 1 0 330 2 +EndChar + +StartChar: caron +Encoding: 271 711 143 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 137 710 S -1 0 0 -1 612 1394 2 +EndChar + +StartChar: germandbls +Encoding: 223 223 144 +Width: 600 +Flags: HMW +TeX: 103 0 +LayerCount: 2 +Fore +SplineSet +74 0 m 4 + 74 490 l 4 + 74 542.807 74.667 596.235 98.2086 649.711 c 4 + 133.73 730.4 208.298 775.004 287.299 775.004 c 4 + 402.905 775.004 497.21 681.294 497.21 571.108 c 4 + 497.21 504.487 461.9 445.294 405 416 c 4 + 491.891 389.079 548.006 305.6 548.006 209.32 c 4 + 548.006 83.4294 454.191 -12.0295 335.412 -12.0295 c 4 + 292.776 -12.0295 250.921 0.470711 215 24 c 4 + 256 89 l 4 + 278.149 71.5086 305.639 61.9655 334.044 61.9655 c 4 + 407.901 61.9655 471.132 125.491 471.132 209.399 c 4 + 471.132 270.281 438.461 323.526 394.789 350.882 c 4 + 362.072 371.375 330.752 374 293 374 c 4 + 258 374 l 4 + 258 440 l 4 + 291 440 l 4 + 308.302 440 324.828 440.514 344.201 449.183 c 4 + 387.876 468.726 418.115 518.564 418.115 573.125 c 4 + 418.115 649.497 360.647 708.194 291.766 708.194 c 4 + 253.833 708.194 213.869 689.799 186.719 650.367 c 4 + 153.729 602.454 153 543.204 153 492 c 4 + 153 0 l 4 + 74 0 l 4 +EndSplineSet +EndChar + +StartChar: paragraph +Encoding: 182 182 145 +Width: 600 +Flags: HMW +TeX: 112 0 +LayerCount: 2 +Fore +SplineSet +515 771 m 0 + 515 -79 l 0 + 448 -79 l 0 + 448 705 l 0 + 360 705 l 0 + 360 -79 l 0 + 291 -79 l 0 + 291 373 l 0 + 173.556 380.691 83.9422 470.146 83.9422 574.545 c 0 + 83.9422 645.65 125.968 713.383 202.879 746.684 c 0 + 258.505 770.77 316.231 771 370 771 c 0 + 515 771 l 0 +EndSplineSet +EndChar + +StartChar: section +Encoding: 167 167 146 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +Fore +SplineSet +488 676 m 1 + 423 618 l 1 + 414.502 624.421 416.792 633.708 413.888 641.763 c 0 + 404.459 667.917 369.872 709.915 308.352 709.915 c 0 + 247.31 709.915 202.994 669.159 202.994 620.922 c 0 + 202.994 597.432 213.725 561.524 264.348 534.753 c 0 + 297.607 517.164 341.067 507.397 387.737 485.112 c 0 + 468.614 446.493 494.176 395.665 494.176 353.922 c 0 + 494.176 305.481 458.969 262.529 408.539 241.879 c 1 + 459.313 207.384 483.175 156.542 483.175 107.276 c 0 + 483.175 16.9904 402.922 -63.0207 285.774 -63.0207 c 0 + 208.624 -63.0207 133.499 -27.5045 85 36 c 1 + 146 107 l 1 + 154.994 103.32 153.114 93.2219 155.624 86.7075 c 0 + 159.14 77.5825 198.684 13.7598 286.023 13.7598 c 0 + 356.942 13.7598 400.23 57.0391 400.23 105.026 c 0 + 400.23 132.111 386.388 163.982 346.982 187.299 c 0 + 298.949 215.721 233.162 219.874 175.365 254.027 c 0 + 123.913 284.431 101.679 326.186 101.679 366.086 c 0 + 101.679 418.429 140.913 463.115 196.205 482.822 c 1 + 140.944 517.145 118.9 567.71 118.9 613.632 c 0 + 118.9 701.981 199.381 778.269 307.936 778.269 c 0 + 384.595 778.269 452.277 738.832 488 676 c 1 +238.744 461.796 m 1 + 207.924 451.724 185.96 423.141 185.96 389.457 c 0 + 185.96 363.602 199.372 327.898 248.47 303.876 c 0 + 283.42 286.776 323.54 281.479 365.239 264.586 c 1 + 390.576 277.358 407.453 303.587 407.453 333.72 c 0 + 407.453 360.138 394.181 398.165 340.303 424.753 c 0 + 310.54 439.44 274.629 447.456 238.744 461.796 c 1 +EndSplineSet +EndChar + +StartChar: copyright +Encoding: 169 169 147 +Width: 600 +Flags: HMW +TeX: 99 0 +LayerCount: 2 +Fore +SplineSet +313.62 491.091 m 0 + 386.544 491.091 443.024 445.507 458 384 c 0 + 398 361 l 0 + 391.517 368.856 395.372 377.023 393.506 384.631 c 0 + 391.425 393.116 373.381 433.152 316.115 433.152 c 0 + 261.422 433.152 207.997 399.047 207.997 326.991 c 0 + 207.997 256.911 256.399 201.947 317.234 201.947 c 0 + 353.531 201.947 386.837 222.046 404 254 c 0 + 455 220 l 0 + 422.956 171.427 369.074 140.974 312.13 140.974 c 0 + 217.884 140.974 142.846 222.734 142.846 319.43 c 0 + 142.846 418.338 220.235 491.091 313.62 491.091 c 0 +306.307 21.8879 m 0 + 152.945 21.8879 25.7487 152.286 25.7487 317.375 c 0 + 25.7487 483.34 153.371 614.02 306.766 614.02 c 0 + 459.736 614.02 587.017 483.767 587.017 318.262 c 0 + 587.017 152.432 459.471 21.8879 306.307 21.8879 c 0 +78.726 317.799 m 0 + 78.726 179.711 182.936 71.9098 307.826 71.9098 c 0 + 432.331 71.9098 537.005 179.647 537.005 318.685 c 0 + 537.005 457.352 432.659 565 308.142 565 c 0 + 183.437 565 78.726 457.059 78.726 317.799 c 0 +EndSplineSet +EndChar + +StartChar: registered +Encoding: 174 174 148 +Width: 600 +Flags: HMW +TeX: 114 0 +LayerCount: 2 +Fore +SplineSet +306.307 21.8879 m 4 + 152.945 21.8879 25.7487 152.286 25.7487 317.375 c 4 + 25.7487 483.34 153.371 614.02 306.766 614.02 c 4 + 459.736 614.02 587.017 483.767 587.017 318.262 c 4 + 587.017 152.432 459.471 21.8879 306.307 21.8879 c 4 +78.726 317.799 m 4 + 78.726 179.711 182.936 71.9098 307.826 71.9098 c 4 + 432.331 71.9098 537.005 179.647 537.005 318.685 c 4 + 537.005 457.352 432.659 565 308.142 565 c 4 + 183.437 565 78.726 457.059 78.726 317.799 c 4 +190 154 m 4 + 190 492 l 4 + 299 492 l 4 + 324.843 492 351.991 491.821 378.649 480.542 c 4 + 417.745 464 439 429.492 439 393.729 c 4 + 439 352.65 411.132 316.256 371 305 c 4 + 446 160 l 4 + 391 152 l 4 + 319 297 l 4 + 243 297 l 4 + 243 154 l 4 + 190 154 l 4 +243 445 m 4 + 243 343 l 4 + 303 343 l 4 + 322.021 343 344.797 342.906 363.189 354.544 c 4 + 378.83 364.441 386.001 379.476 386.001 393.691 c 4 + 386.001 408.753 377.925 424.775 360.288 434.695 c 4 + 341.595 445.21 319.037 445 300 445 c 4 + 243 445 l 4 +EndSplineSet +EndChar + +StartChar: uni00B9 +Encoding: 185 185 149 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +SplineSet +356 733 m 0 + 356 293 l 0 + 282 293 l 0 + 282 641 l 0 + 170 612 l 0 + 151 648 l 0 + 306 733 l 0 + 356 733 l 0 +EndSplineSet +EndChar + +StartChar: guilsinglleft +Encoding: 273 8249 150 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +178 293 m 0 + 354 464 l 0 + 399 416 l 0 + 259 279 l 0 + 407 117 l 0 + 361 71 l 0 + 178 266 l 0 + 178 293 l 0 +EndSplineSet +EndChar + +StartChar: guillemotleft +Encoding: 171 171 151 +Width: 600 +Flags: HMW +TeX: 103 0 +LayerCount: 2 +Fore +Refer: 150 8249 S 1 0 0 1 120 0 2 +Refer: 150 8249 S 1 0 0 1 -90 0 2 +EndChar + +StartChar: guilsinglright +Encoding: 274 8250 152 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 150 8249 N -1 0 0 1 585 0 2 +EndChar + +StartChar: guillemotright +Encoding: 187 187 153 +Width: 600 +Flags: HMW +TeX: 103 0 +LayerCount: 2 +Fore +Refer: 151 171 N -1 0 0 1 615 0 2 +EndChar + +StartChar: logicalnot +Encoding: 172 172 154 +Width: 600 +Flags: HMW +TeX: 108 0 +LayerCount: 2 +Fore +SplineSet +116 402 m 0 + 490 402 l 0 + 490 182 l 0 + 416 182 l 0 + 416 329 l 0 + 116 329 l 0 + 116 402 l 0 +EndSplineSet +EndChar + +StartChar: softhyphen +Encoding: 173 173 155 +Width: 600 +Flags: HMW +TeX: 115 0 +LayerCount: 2 +Fore +Refer: 60 45 N 1 0 0 1 0 0 2 +EndChar + +StartChar: degree +Encoding: 176 176 156 +Width: 600 +Flags: HMW +TeX: 100 0 +LayerCount: 2 +Fore +SplineSet +463.001 584.452 m 0 + 463.001 498.746 392.958 428.902 306.439 428.902 c 0 + 219.963 428.902 149.901 498.735 149.901 584.477 c 0 + 149.901 670.167 219.932 740.008 306.436 740.008 c 0 + 392.955 740.008 463.001 670.157 463.001 584.452 c 0 +307.636 679.001 m 0 + 260.52 679.001 220.977 638.292 220.977 585.822 c 0 + 220.977 533.609 260.369 492.878 307.592 492.878 c 0 + 354.564 492.878 394.083 533.556 394.083 586.131 c 0 + 394.083 638.327 354.712 679.001 307.636 679.001 c 0 +EndSplineSet +EndChar + +StartChar: uni00B2 +Encoding: 178 178 157 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +SplineSet +139 642 m 0 + 173.775 702.486 238.827 738.288 309.097 738.288 c 0 + 401.336 738.288 464.001 678.771 464.001 608.561 c 0 + 464.001 553.7 426.301 516.004 409.841 500.834 c 0 + 363.816 458.417 299.741 428.352 235 356 c 0 + 446 356 l 0 + 451.284 356 453.692 356.741 458.392 360.794 c 0 + 460.8 362.871 466.479 368.496 474 366 c 0 + 474 293 l 0 + 150 293 l 0 + 150 344 l 0 + 214.555 433.275 299.669 489.778 334.371 517.996 c 0 + 367.994 545.338 394.114 573.311 394.114 608.166 c 0 + 394.114 644.932 362.276 678.917 306.876 678.917 c 0 + 262.373 678.917 224.551 655.762 204.174 629.982 c 0 + 197.924 622.076 198.745 616.904 193 606 c 0 + 139 642 l 0 +EndSplineSet +EndChar + +StartChar: eth +Encoding: 240 240 158 +Width: 600 +Flags: HMW +TeX: 101 0 +LayerCount: 2 +Fore +SplineSet +305.228 470.011 m 0 + 226.957 470.011 144.996 405.543 144.996 269.224 c 0 + 144.996 134.476 222.952 57.9969 306.097 57.9969 c 0 + 371.358 57.9969 459.002 107.826 459.002 268.758 c 0 + 459.002 429.627 365.393 470.011 305.228 470.011 c 0 +411.85 660.892 m 1 + 482.806 580.388 543.317 462.269 543.317 293.321 c 0 + 543.317 230.904 536.102 156.905 498.489 94.5252 c 0 + 455.932 23.9469 383.677 -14.0061 306.684 -14.0061 c 0 + 172.735 -14.0061 56.7783 98.7597 56.7783 258.02 c 0 + 56.7783 417.046 169.434 541.31 298.018 541.31 c 0 + 351.944 541.31 401.981 518.882 437 481 c 1 + 413.678 540.162 379.782 593.873 337.517 639.819 c 1 + 190 598 l 1 + 169 653 l 1 + 289.257 685.865 l 1 + 253.708 715.612 213.989 740.637 171 760 c 1 + 265 779 l 1 + 294.809 762.216 330.445 738.683 366.105 706.867 c 1 + 491 741 l 1 + 511 689 l 1 + 411.85 660.892 l 1 +EndSplineSet +EndChar + +StartChar: Eth +Encoding: 208 208 159 +Width: 600 +Flags: HMW +TeX: 69 0 +LayerCount: 2 +Fore +SplineSet +101 722 m 0 + 263 722 l 0 + 325.631 722 375.745 716.402 426.079 679.13 c 0 + 512.98 614.782 550.114 487.96 550.114 365.114 c 0 + 550.114 211.219 490.967 72.9828 379.857 21.249 c 0 + 338.865 2.16283 300.228 -1 249 -1 c 0 + 101 -1 l 0 + 101 722 l 0 +176 654 m 0 + 176 66 l 0 + 245 66 l 0 + 286.258 66 324.723 68.2387 365.552 95.7969 c 0 + 435.377 142.927 472.256 240.81 472.256 355.09 c 0 + 472.256 435.567 454.827 524.974 411.342 584.517 c 0 + 362.022 652.05 302.634 654 258 654 c 0 + 176 654 l 0 +45 416 m 0 + 297 416 l 0 + 297 349 l 0 + 45 349 l 0 + 45 416 l 0 +EndSplineSet +EndChar + +StartChar: Thorn +Encoding: 222 222 160 +Width: 600 +Flags: HMW +TeX: 84 0 +LayerCount: 2 +Fore +SplineSet +78 722 m 0 + 169 722 l 0 + 169.521 720.466 169.785 718.85 169.785 717.216 c 0 + 169.785 710.792 165.82 706.356 163.318 702.38 c 0 + 160.184 697.398 160 694.17 160 690 c 0 + 160 586 l 0 + 298 586 l 0 + 344.584 586 389.359 584.805 434.624 561.494 c 0 + 502.828 526.371 538.016 455.718 538.016 382.699 c 0 + 538.016 309.503 502.883 240.352 436.114 206.409 c 0 + 392.262 184.116 348.977 183 304 183 c 0 + 160 183 l 0 + 160 0 l 0 + 78 0 l 0 + 78 722 l 0 +160 510 m 0 + 160 254 l 0 + 307 254 l 0 + 335.466 254 362.993 254.678 390.831 268.763 c 0 + 432.659 289.926 455.003 332.944 455.003 378.986 c 0 + 455.003 425.985 431.629 471.921 386.619 494.5 c 0 + 357.19 509.263 328.165 510 298 510 c 0 + 160 510 l 0 +EndSplineSet +EndChar + +StartChar: ring +Encoding: 268 730 161 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +413.005 700.997 m 0 + 413.005 645.145 366.039 598.958 306.924 598.958 c 0 + 247.95 598.958 200.921 645.101 200.921 701.065 c 0 + 200.921 756.856 247.86 803.005 306.911 803.005 c 0 + 366.013 803.005 413.005 756.837 413.005 700.997 c 0 +259.914 701.774 m 0 + 259.914 672.11 281.627 648.896 307.995 648.896 c 0 + 334.032 648.896 356.035 671.837 356.035 702.068 c 0 + 356.035 731.828 334.332 755.012 308.022 755.012 c 0 + 282 755.012 259.914 732.072 259.914 701.774 c 0 +EndSplineSet +EndChar + +StartChar: Aring +Encoding: 197 197 162 +Width: 600 +Flags: HMW +TeX: 65 0 +LayerCount: 2 +Fore +Refer: 161 730 S 1 0 0 1 -19 118 2 +Refer: 71 65 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Agrave +Encoding: 192 192 163 +Width: 600 +Flags: HMW +TeX: 65 0 +LayerCount: 2 +Fore +Refer: 195 -1 S 1 0 0 1 -30 138 2 +Refer: 71 65 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Aacute +Encoding: 193 193 164 +Width: 600 +Flags: HMW +TeX: 65 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 -20 138 2 +Refer: 71 65 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Acircumflex +Encoding: 194 194 165 +Width: 600 +Flags: HMW +TeX: 65 0 +LayerCount: 2 +Fore +Refer: 190 -1 N 1 0 0 1 -14 143 2 +Refer: 71 65 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Atilde +Encoding: 195 195 166 +Width: 600 +Flags: HMW +TeX: 65 0 +LayerCount: 2 +Fore +Refer: 138 732 S 1 0 0 1 -5 146 2 +Refer: 71 65 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Adieresis +Encoding: 196 196 167 +Width: 600 +Flags: HMW +TeX: 65 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 -13 144 2 +Refer: 71 65 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Egrave +Encoding: 200 200 168 +Width: 600 +Flags: HMW +TeX: 69 0 +LayerCount: 2 +Fore +Refer: 195 -1 S 1 0 0 1 -30 138 2 +Refer: 80 69 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Eacute +Encoding: 201 201 169 +Width: 600 +Flags: HMW +TeX: 69 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 0 138 2 +Refer: 80 69 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ecircumflex +Encoding: 202 202 170 +Width: 600 +Flags: HMW +TeX: 69 0 +LayerCount: 2 +Fore +Refer: 190 -1 S 1 0 0 1 -4 143 2 +Refer: 80 69 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Edieresis +Encoding: 203 203 171 +Width: 600 +Flags: HMW +TeX: 69 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 -5 144 2 +Refer: 80 69 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Igrave +Encoding: 204 204 172 +Width: 600 +Flags: HMW +TeX: 73 0 +LayerCount: 2 +Fore +Refer: 195 -1 S 1 0 0 1 -30 138 2 +Refer: 4 73 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Iacute +Encoding: 205 205 173 +Width: 600 +Flags: HMW +TeX: 73 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 0 138 2 +Refer: 4 73 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Icircumflex +Encoding: 206 206 174 +Width: 600 +Flags: HMW +TeX: 73 0 +LayerCount: 2 +Fore +Refer: 190 -1 S 1 0 0 1 -15 143 2 +Refer: 4 73 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Idieresis +Encoding: 207 207 175 +Width: 600 +Flags: HMW +TeX: 73 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 -9 144 2 +Refer: 4 73 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ograve +Encoding: 210 210 176 +Width: 600 +Flags: HMW +TeX: 79 0 +LayerCount: 2 +Fore +Refer: 195 -1 S 1 0 0 1 -30 138 2 +Refer: 42 79 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Oacute +Encoding: 211 211 177 +Width: 600 +Flags: HMW +TeX: 79 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 0 138 2 +Refer: 42 79 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ocircumflex +Encoding: 212 212 178 +Width: 600 +Flags: HMW +TeX: 79 0 +LayerCount: 2 +Fore +Refer: 190 -1 S 1 0 0 1 -1 143 2 +Refer: 42 79 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Otilde +Encoding: 213 213 179 +Width: 600 +Flags: HMW +TeX: 79 0 +LayerCount: 2 +Fore +Refer: 138 732 S 1 0 0 1 0 146 2 +Refer: 42 79 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Odieresis +Encoding: 214 214 180 +Width: 600 +Flags: HMW +TeX: 79 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 -5 144 2 +Refer: 42 79 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ugrave +Encoding: 217 217 181 +Width: 600 +Flags: HMW +TeX: 85 0 +LayerCount: 2 +Fore +Refer: 195 -1 S 1 0 0 1 -30 138 2 +Refer: 63 85 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Uacute +Encoding: 218 218 182 +Width: 600 +Flags: HMW +TeX: 85 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 0 138 2 +Refer: 63 85 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ucircumflex +Encoding: 219 219 183 +Width: 600 +Flags: HMW +TeX: 85 0 +LayerCount: 2 +Fore +Refer: 190 -1 S 1 0 0 1 -1 143 2 +Refer: 63 85 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Udieresis +Encoding: 220 220 184 +Width: 600 +Flags: HMW +TeX: 85 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 5 144 2 +Refer: 63 85 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Yacute +Encoding: 221 221 185 +Width: 600 +Flags: HMW +TeX: 89 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 0 138 2 +Refer: 94 89 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Scaron +Encoding: 166 352 186 +Width: 600 +Flags: HMW +TeX: 83 0 +LayerCount: 2 +Fore +Refer: 191 -1 S 1 0 0 1 14 143 2 +Refer: 50 83 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Zcaron +Encoding: 180 381 187 +Width: 600 +Flags: HMW +TeX: 90 0 +LayerCount: 2 +Fore +Refer: 191 -1 S 1 0 0 1 8 143 2 +Refer: 96 90 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ntilde +Encoding: 209 209 188 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 138 732 S 1 0 0 1 0 146 2 +Refer: 46 78 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ydieresis +Encoding: 190 376 189 +Width: 600 +Flags: HMW +TeX: 89 0 +LayerCount: 2 +Fore +Refer: 139 168 S 1 0 0 1 -5 144 2 +Refer: 94 89 N 1 0 0 1 0 0 2 +EndChar + +StartChar: circumflex.cap +Encoding: 275 -1 190 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +142 659 m 0 + 294 774 l 0 + 319 774 l 0 + 462 661 l 0 + 424 617 l 0 + 304 699 l 0 + 175 620 l 0 + 142 659 l 0 +EndSplineSet +EndChar + +StartChar: caron.cap +Encoding: 276 -1 191 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 190 -1 N -1 0 0 -1 604 1391 2 +EndChar + +StartChar: ae +Encoding: 230 230 192 +Width: 600 +Flags: HMW +TeX: 97 0 +LayerCount: 2 +Fore +SplineSet +46 477 m 0 + 78.8401 518.176 128.534 541.042 179.797 541.042 c 0 + 236.11 541.042 284.02 513.302 309 469 c 0 + 334.856 513.703 382.031 541.063 431.036 541.063 c 0 + 472.731 541.063 518.654 520.729 547.495 473.472 c 0 + 578.346 422.921 578 363.164 578 311 c 0 + 578 267 l 0 + 337 257 l 0 + 337 203 l 0 + 337 175.493 338.021 151.766 349.064 126.614 c 0 + 368.654 81.9912 411.522 54.9866 456.731 54.9866 c 0 + 490.681 54.9866 522.098 70.3702 542 97 c 0 + 583 49 l 0 + 550.251 9.72841 501.736 -13.0005 450.565 -13.0005 c 0 + 391.56 -13.0005 336.63 17.1888 305 67 c 0 + 280.108 17.8701 229.631 -13.1551 174.237 -13.1551 c 0 + 90.7707 -13.1551 21.8352 56.2141 21.8352 143.282 c 0 + 21.8352 202.576 54.9902 266.973 127.653 299.766 c 0 + 170.84 319.256 212.144 320.928 240 322 c 0 + 266 323 l 0 + 266 353 l 0 + 266 374.299 265.203 393.531 258.429 412.515 c 0 + 244.402 451.823 210.556 476.08 174.377 476.08 c 0 + 141.829 476.08 108.382 456.741 87 426 c 0 + 46 477 l 0 +266 254 m 0 + 241 253 l 0 + 211.382 251.816 180.822 251.083 151.425 236.018 c 0 + 113.557 216.612 95.9804 181.173 95.9804 148.063 c 0 + 95.9804 97.6227 135.259 57.9703 182.206 57.9703 c 0 + 213.618 57.9703 245.532 76.2592 258.599 111.796 c 0 + 268.711 139.296 266 169.723 266 210 c 0 + 266 254 l 0 +337 323 m 0 + 511 330 l 0 + 511 353 l 0 + 511 376.887 510.557 401.019 500.259 424.945 c 0 + 486.37 457.213 459.423 476.188 430.019 476.188 c 0 + 401.442 476.188 375.8 458.055 358.925 432.777 c 0 + 338.424 402.068 337 371.27 337 343 c 0 + 337 323 l 0 +EndSplineSet +EndChar + +StartChar: oe +Encoding: 189 339 193 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +SplineSet +197.072 540.057 m 0 + 240.284 540.057 279.952 520.667 305 487 c 0 + 334.471 520.96 377.351 540.072 422.223 540.072 c 0 + 475.912 540.072 535.759 511.906 562.005 440.15 c 0 + 580.682 389.088 578 326.96 578 269 c 0 + 578 256 l 0 + 314 256 l 0 + 314.609 182.929 318.122 148.32 330.688 119.841 c 0 + 351.232 73.2809 394.067 53.9506 437.272 53.9506 c 0 + 470.728 53.9506 512.336 65.2296 542 99 c 0 + 583 49 l 0 + 544.141 8.97946 490.715 -13.6292 434.895 -13.6292 c 0 + 386.721 -13.6292 340.059 3.2209 303 34 c 0 + 271.715 5.40179 230.291 -13.0256 188.332 -13.0256 c 0 + 142.262 -13.0256 83.7901 10.4289 49.2458 81.4235 c 0 + 21.2947 138.868 16.9924 213.135 16.9924 274.024 c 0 + 16.9924 327.287 21.0077 390.061 49.5869 444.004 c 0 + 83.9791 508.918 142.432 540.057 197.072 540.057 c 0 +315 322 m 0 + 509 322 l 0 + 509 332 l 0 + 509 366.277 509.724 402.65 491.454 433.147 c 0 + 473.764 462.676 442.71 476.791 412.738 476.791 c 0 + 382.558 476.791 345.109 462.072 327.261 414.077 c 0 + 324.697 407.181 313.856 377.196 315 322 c 0 +86.9292 285.092 m 0 + 86.9292 245.957 89.3121 188.587 103.747 142.737 c 0 + 123.421 80.2444 163.532 57.8299 198.359 57.8299 c 0 + 227.31 57.8299 256.518 74.2456 256.518 103.197 c 0 + 256.518 118.213 241.952 172.81 241.952 273.514 c 0 + 241.952 359.739 252.376 403.185 252.376 419.746 c 0 + 252.376 450.246 226.518 470.076 196.284 470.076 c 0 + 163.481 470.076 128.259 447.486 107.574 402.839 c 0 + 89.1704 363.117 86.9292 317.746 86.9292 285.092 c 0 +EndSplineSet +EndChar + +StartChar: acute.cap +Encoding: 278 -1 194 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +387 779 m 0 + 433 698 l 0 + 237 627 l 0 + 210 675 l 0 + 387 779 l 0 +EndSplineSet +EndChar + +StartChar: grave.cap +Encoding: 277 -1 195 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 194 -1 N -1 0 0 1 637 0 2 +EndChar + +StartChar: ordfeminine +Encoding: 170 170 196 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +SplineSet +152 656 m 0 + 193.633 703.845 253.099 721.283 307.799 721.283 c 0 + 370.636 721.283 423.692 696.264 447.562 644.964 c 0 + 459.785 618.695 461 592.461 461 562 c 0 + 461 309 l 0 + 388 309 l 0 + 388 348 l 0 + 353.62 315.567 309.294 297.999 264.37 297.999 c 0 + 184.05 297.999 127.995 354.534 127.995 418.965 c 0 + 127.995 457.362 148.672 500.379 196.972 526.099 c 0 + 248.841 553.719 312.645 551 370 551 c 0 + 387 551 l 0 + 387 565 l 0 + 387 584.588 386.635 605.218 374.201 624.596 c 0 + 361.1 645.014 336.794 659.022 300.518 659.022 c 0 + 260.387 659.022 218.034 643.693 192 608 c 0 + 152 656 l 0 +390 491 m 0 + 371 491 l 0 + 340.994 491 302.242 493.162 271.69 487.742 c 0 + 220.555 478.672 202.865 447.25 202.865 422.155 c 0 + 202.865 389.707 231.214 360.688 275.85 360.688 c 0 + 311.446 360.688 343.688 377.899 364.269 397.046 c 0 + 389.322 420.354 390 444.06 390 471 c 0 + 390 491 l 0 +98 239 m 0 + 503 239 l 0 + 503 176 l 0 + 98 176 l 0 + 98 239 l 0 +EndSplineSet +EndChar + +StartChar: ordmasculine +Encoding: 186 186 197 +Width: 600 +Flags: HMW +TeX: 111 0 +LayerCount: 2 +Fore +SplineSet +301.826 721.011 m 0 + 385.223 721.011 470.107 653.808 470.107 514.756 c 0 + 470.107 364.793 379.364 296.94 294.598 296.94 c 0 + 202.824 296.94 120.827 374.446 120.827 500.869 c 0 + 120.827 633.779 205.502 721.011 301.826 721.011 c 0 +190.986 506.214 m 0 + 190.986 409.196 244.9 363.925 296.394 363.925 c 0 + 345.93 363.925 401 406.473 401 506.207 c 0 + 401 605.509 349.544 656 296.205 656 c 0 + 243.333 656 190.986 606.057 190.986 506.214 c 0 +98 239 m 0 + 503 239 l 0 + 503 176 l 0 + 98 176 l 0 + 98 239 l 0 +EndSplineSet +EndChar + +StartChar: uni02C9 +Encoding: 263 713 198 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +153 720 m 0 + 447 720 l 0 + 447 655 l 0 + 153 655 l 0 + 153 720 l 0 +EndSplineSet +EndChar + +StartChar: macron +Encoding: 175 175 199 +Width: 600 +Flags: HMW +TeX: 109 0 +LayerCount: 2 +Fore +Refer: 198 713 N 1 0 0 1 0 0 2 +EndChar + +StartChar: omacron +Encoding: 279 333 200 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 198 713 S 1 0 0 1 0 0 2 +Refer: 5 111 N 1 0 0 1 0 0 2 +EndChar + +StartChar: cedilla +Encoding: 269 184 201 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +313 0 m 0 + 363 0 l 0 + 357 -55 l 0 + 376 -56 l 0 + 390.785 -56.7788 405.994 -57.7164 420.883 -64.9414 c 0 + 442.973 -75.6606 455.07 -96.4917 455.07 -118.956 c 0 + 455.07 -160.352 414.433 -205.092 329.389 -205.092 c 0 + 284.871 -205.092 235.296 -192.447 192 -162 c 0 + 221 -114 l 0 + 257.397 -143.353 301.031 -155.011 336.064 -155.011 c 0 + 381.118 -155.011 389.002 -136.826 389.002 -126.739 c 0 + 389.002 -119.915 385.46 -112.176 376.38 -106.611 c 0 + 363.902 -98.9638 347.2 -99 334 -99 c 0 + 300 -99 l 0 + 313 0 l 0 +EndSplineSet +EndChar + +StartChar: ccedilla +Encoding: 231 231 202 +Width: 600 +Flags: HMW +TeX: 99 0 +LayerCount: 2 +Fore +Refer: 201 184 S 1 0 0 1 0 0 2 +Refer: 1 99 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ccedilla +Encoding: 199 199 203 +Width: 600 +Flags: HMW +TeX: 67 0 +LayerCount: 2 +Fore +Refer: 201 184 S 1 0 0 1 0 0 2 +Refer: 72 67 N 1 0 0 1 0 0 2 +EndChar + +StartChar: uni00B3 +Encoding: 179 179 204 +Width: 600 +Flags: HMW +TeX: 117 0 +LayerCount: 2 +Fore +SplineSet +308.545 739.11 m 0 + 394.884 739.11 460.209 681.247 460.209 614.55 c 0 + 460.209 572.151 433.428 536.235 395 524 c 0 + 444.061 515.328 480.001 473.423 480.001 424.669 c 0 + 480.001 348.943 397.312 290.99 304.904 290.99 c 0 + 241.699 290.99 181.599 318.471 140 366 c 0 + 194 426 l 0 + 204.212 415.153 199.361 404.247 210.154 393.714 c 0 + 216.257 387.757 251.225 355.987 306.079 355.987 c 0 + 362.89 355.987 408.454 389.769 408.454 431.009 c 0 + 408.454 452.324 395.326 495.101 306.637 495.101 c 0 + 294.627 495.101 283.183 494.368 272 493 c 0 + 272 551 l 0 + 279.636 550.27 287.301 549.894 294.972 549.894 c 0 + 370.889 549.894 391.54 582.897 391.54 609.502 c 0 + 391.54 644.172 357.159 678.038 305.041 678.038 c 0 + 265.85 678.038 224.827 658.777 197 624 c 0 + 155 667 l 0 + 193.931 713.015 250.216 739.11 308.545 739.11 c 0 +EndSplineSet +EndChar + +StartChar: divide +Encoding: 247 247 205 +Width: 600 +Flags: HMW +TeX: 100 0 +LayerCount: 2 +Fore +SplineSet +92 403 m 0 + 509 403 l 0 + 509 326 l 0 + 92 326 l 0 + 92 403 l 0 +358 540.992 m 0 + 358 512.297 334.695 488.972 305.98 488.972 c 0 + 277.279 488.972 253.962 512.289 253.962 540.99 c 0 + 253.962 569.692 277.277 593.01 305.98 593.01 c 0 + 334.693 593.01 358 569.686 358 540.992 c 0 +358.01 183.993 m 0 + 358.01 155.275 334.682 131.943 305.964 131.943 c 0 + 277.243 131.943 253.913 155.271 253.913 183.992 c 0 + 253.913 212.712 277.242 236.04 305.963 236.04 c 0 + 334.68 236.04 358.01 212.71 358.01 183.993 c 0 +EndSplineSet +EndChar + +StartChar: Oslash +Encoding: 216 216 206 +Width: 600 +Flags: HMW +TeX: 79 0 +LayerCount: 2 +Fore +SplineSet +300.361 654.01 m 0 + 224.496 654.01 123.971 587.911 123.971 372.659 c 0 + 123.971 281.791 139.578 215.128 163.473 167.742 c 1 + 399.758 612.324 l 1 + 368.854 641.994 332.534 654.01 300.361 654.01 c 0 +556.008 359.504 m 0 + 556.008 296.095 551.428 206.273 513.069 128.645 c 0 + 465.538 32.4568 382.426 -11.0151 304.485 -11.0151 c 0 + 261.834 -11.0151 213.304 2.30387 169.786 34.9718 c 1 + 112 -73 l 1 + 52 -42 l 1 + 119.616 85.2228 l 1 + 75.1957 143.737 43.9996 232.717 43.9996 362.113 c 0 + 43.9996 645.884 196.081 730 303.761 730 c 0 + 349.84 730 397.121 715.105 437.897 684.085 c 1 + 491 784 l 1 + 553 751 l 1 + 488.971 631.363 l 1 + 497.238 619.916 504.885 607.435 511.792 593.902 c 0 + 551.172 516.748 556.008 427.05 556.008 359.504 c 0 +443.911 547.169 m 1 + 208.342 107.012 l 1 + 238.634 79.4207 273.138 67.987 304.834 67.987 c 0 + 353.415 67.987 409.354 95.4457 442.765 165.717 c 0 + 472.354 227.951 475.085 301.614 475.085 348.897 c 0 + 475.085 410.01 471.386 479.154 446.984 539.849 c 2 + 443.911 547.169 l 1 +EndSplineSet +EndChar + +StartChar: multiply +Encoding: 215 215 207 +Width: 600 +Flags: HMW +TeX: 109 0 +LayerCount: 2 +Fore +SplineSet +453 583 m 1 + 508 532 l 1 + 357.683 376.932 l 1 + 505 221 l 1 + 451 168 l 1 + 304.762 322.338 l 1 + 160 173 l 1 + 108 224 l 1 + 253.994 375.919 l 1 + 108 530 l 1 + 163 583 l 1 + 306.764 430.829 l 1 + 453 583 l 1 +EndSplineSet +EndChar + +StartChar: AE +Encoding: 198 198 208 +Width: 600 +Flags: HMW +TeX: 65 0 +LayerCount: 2 +Fore +SplineSet +242 723 m 0 + 571 723 l 0 + 571 651 l 0 + 370 651 l 0 + 372 414 l 0 + 541 414 l 0 + 541 340 l 0 + 373 340 l 0 + 375 72 l 0 + 568 72 l 0 + 568 0 l 0 + 302 0 l 0 + 302 196 l 0 + 151 196 l 0 + 89 0 l 0 + 15 0 l 0 + 242 723 l 0 +302 651 m 0 + 289 651 l 0 + 168 263 l 0 + 302 263 l 0 + 302 651 l 0 +EndSplineSet +EndChar + +StartChar: OE +Encoding: 188 338 209 +Width: 600 +Flags: HMW +TeX: 79 0 +LayerCount: 2 +Fore +SplineSet +303 690 m 0 + 303 723 l 0 + 571 723 l 0 + 571 651 l 0 + 375 651 l 0 + 375 414 l 0 + 541 414 l 0 + 541 340 l 0 + 375 340 l 0 + 375 72 l 0 + 568 72 l 0 + 568 0 l 0 + 302 0 l 0 + 302 36 l 0 + 278.697 7.88689 244.099 -8.08716 207.296 -8.08716 c 0 + 150.139 -8.08716 80.2583 30.5805 47.0562 139.126 c 0 + 42.7406 153.235 20.7902 225.823 20.7902 361.821 c 0 + 20.7902 459.095 28.5992 542.924 59.6634 615.563 c 0 + 98.0648 705.359 160.916 732.002 207.762 732.002 c 0 + 243.981 732.002 278.474 716.617 303 690 c 0 +94.9751 375.779 m 0 + 94.9751 343.461 94.9497 221.604 127.295 142.578 c 0 + 153.346 78.9291 191.363 62.9836 217.46 62.9836 c 0 + 257.506 62.9836 290.624 98.6049 302 150 c 0 + 302 562 l 0 + 289.634 601.236 259.887 665.004 207.671 665.004 c 0 + 173.506 665.004 138.571 636.141 117.537 573.058 c 0 + 110.441 551.779 94.9751 498.335 94.9751 375.779 c 0 +EndSplineSet +EndChar + +StartChar: currency +Encoding: 280 164 210 +Width: 600 +Flags: HMWO +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +300.7 516.248 m 0 + 236.708 516.248 184.352 463.893 184.352 399.9 c 0 + 184.352 335.907 236.708 283.553 300.7 283.553 c 0 + 364.693 283.553 417.049 335.907 417.049 399.9 c 0 + 417.049 463.893 364.693 516.248 300.7 516.248 c 0 +88.9004 569.9 m 1 + 130.1 611.1 l 1 + 195.483 545.717 l 1 + 225.127 567.202 261.503 579.9 300.7 579.9 c 0 + 339.284 579.9 375.133 567.597 404.52 546.719 c 1 + 468.9 611.1 l 1 + 510.1 569.9 l 1 + 446.011 505.811 l 1 + 467.803 476.042 480.7 439.404 480.7 399.9 c 0 + 480.7 360.703 468.002 324.327 446.517 294.683 c 1 + 510.1 231.1 l 1 + 468.9 189.9 l 1 + 405.22 253.58 l 1 + 375.704 232.4 339.591 219.9 300.7 219.9 c 0 + 261.196 219.9 224.558 232.797 194.789 254.589 c 1 + 130.1 189.9 l 1 + 88.9004 231.1 l 1 + 153.881 296.08 l 1 + 133.003 325.467 120.7 361.316 120.7 399.9 c 0 + 120.7 438.791 133.2 474.904 154.38 504.42 c 1 + 88.9004 569.9 l 1 +EndSplineSet +EndChar + +StartChar: brokenbar +Encoding: 281 166 211 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +261 756 m 0 + 339 756 l 0 + 339 342 l 0 + 261 342 l 0 + 261 756 l 0 +339 -175 m 0 + 261 -175 l 0 + 261 227 l 0 + 339 227 l 0 + 339 -175 l 0 +EndSplineSet +EndChar + +StartChar: onehalf +Encoding: 283 189 212 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 274 8260 S 1 0 0 1 0 0 2 +Refer: 157 178 N 0.8 0 0 0.8 201.3 -318.872 2 +Refer: 149 185 N 0.8 0 0 0.8 -107.4 198.6 2 +EndChar + +StartChar: nonbreakingspace +Encoding: 160 160 213 +Width: 600 +Flags: HMW +TeX: 110 0 +LayerCount: 2 +EndChar + +StartChar: ogonek +Encoding: 270 731 214 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +422 0 m 0 + 499 0 l 0 + 460.042 -34.9926 431.396 -66.5962 421.556 -77.7406 c 0 + 413.412 -86.9647 402.048 -100.705 402.048 -117.842 c 0 + 402.048 -135.64 414.849 -150.797 435.947 -150.797 c 0 + 443.138 -150.797 451.677 -149.114 463.857 -144.679 c 0 + 481.957 -138.087 493.634 -130.111 501 -124 c 0 + 501 -177 l 0 + 478.28 -196.689 449.7 -204.002 420.9 -204.002 c 0 + 360.858 -204.002 330.051 -171.745 330.051 -133.094 c 0 + 330.051 -95.7614 361.962 -49.529 422 0 c 0 +EndSplineSet +EndChar + +StartChar: Aogonek +Encoding: 285 260 215 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 214 731 S 1 0 0 1 72 0 2 +Refer: 71 65 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Lcaron +Encoding: 287 317 216 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 56 8217 S 0.8 0 0 0.8 206.515 136.393 2 +Refer: 52 76 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Sacute +Encoding: 288 346 217 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 -20 138 2 +Refer: 50 83 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Scedilla +Encoding: 289 350 218 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 201 184 S 1 0 0 1 -37 0 2 +Refer: 50 83 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Tcaron +Encoding: 290 356 219 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 191 -1 S 1 0 0 1 8 143 2 +Refer: 59 84 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Zacute +Encoding: 291 377 220 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 -20 138 2 +Refer: 96 90 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Zdotaccent +Encoding: 292 379 221 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 222 729 S 1 0 0 1 0 147 2 +Refer: 96 90 N 1 0 0 1 0 0 2 +EndChar + +StartChar: dotaccent +Encoding: 265 729 222 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +SplineSet +305.003 760 m 0 + 338.171 760 365.019 733.28 365.019 700.493 c 0 + 365.019 667.727 338.182 640.992 304.99 640.992 c 0 + 271.818 640.992 244.981 667.716 244.981 700.486 c 0 + 244.981 733.264 271.822 760 305.003 760 c 0 +EndSplineSet +EndChar + +StartChar: Racute +Encoding: 293 340 223 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 -20 138 2 +Refer: 101 82 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Abreve +Encoding: 294 258 224 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 241 728 S 1 0 0 1 -11 160 2 +Refer: 71 65 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Lacute +Encoding: 295 313 225 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 -20 138 2 +Refer: 52 76 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Cacute +Encoding: 296 262 226 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 -20 138 2 +Refer: 72 67 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ccaron +Encoding: 297 268 227 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 191 -1 S 1 0 0 1 27 143 2 +Refer: 72 67 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Eogonek +Encoding: 298 280 228 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 214 731 S 1 0 0 1 17 0 2 +Refer: 80 69 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ecaron +Encoding: 299 282 229 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 191 -1 S 1 0 0 1 8 143 2 +Refer: 80 69 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Dcaron +Encoding: 300 270 230 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 191 -1 S 1 0 0 1 -22 143 2 +Refer: 79 68 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Dcroat +Encoding: 301 272 231 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 159 208 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Nacute +Encoding: 302 323 232 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 194 -1 S 1 0 0 1 -20 138 2 +Refer: 46 78 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ncaron +Encoding: 303 327 233 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 191 -1 S 1 0 0 1 8 143 2 +Refer: 46 78 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Ohungarumlaut +Encoding: 304 336 234 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 270 -1 S 1 0 0 1 0 0 2 +Refer: 42 79 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Rcaron +Encoding: 305 344 235 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 191 -1 S 1 0 0 1 8 143 2 +Refer: 101 82 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Uring +Encoding: 306 366 236 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 161 730 S 1 0 0 1 -4 118 2 +Refer: 63 85 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Uhungarumlaut +Encoding: 307 368 237 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 270 -1 S 1 0 0 1 0 0 2 +Refer: 63 85 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Tcedilla +Encoding: 308 354 238 +Width: 600 +Flags: HMW +TeX: 78 0 +LayerCount: 2 +Fore +Refer: 201 184 S 1 0 0 1 -44 0 2 +Refer: 59 84 N 1 0 0 1 0 0 2 +EndChar + +StartChar: aogonek +Encoding: 309 261 239 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 214 731 S 1 0 0 1 14 0 2 +Refer: 0 97 N 1 0 0 1 0 0 2 +EndChar + +StartChar: hungarumlaut +Encoding: 267 733 240 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 -90 0 2 +Refer: 107 180 N 1 0 0 1 90 0 2 +EndChar + +StartChar: breve +Encoding: 264 728 241 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +169 749 m 0 + 195.428 707.212 242.085 666.993 299.32 666.993 c 0 + 347.638 666.993 397.467 696.856 437 748 c 0 + 470 700 l 0 + 430.784 646.838 369.515 606.983 299.498 606.983 c 0 + 236.205 606.983 172.965 640.673 127 696 c 0 + 169 749 l 0 +EndSplineSet +EndChar + +StartChar: eng +Encoding: 332 331 242 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +SplineSet +89 0 m 0 + 89 529 l 0 + 174 529 l 0 + 174 436 l 0 + 212.871 495.002 278.12 542.003 349.957 542.003 c 0 + 410.281 542.003 464.544 508.129 490.899 448.568 c 0 + 509.729 406.014 510 362.334 510 321 c 0 + 510 65 l 0 + 510 16.919 509.539 -32.1813 489.487 -81.4966 c 0 + 457.36 -160.511 387.101 -203.685 314.113 -203.685 c 0 + 273.194 -203.685 233.402 -190.084 201 -165 c 0 + 241 -87 l 0 + 248.911 -88.73 247.814 -97.6079 250.927 -102.004 c 0 + 253.743 -105.982 279.85 -126.182 316.013 -126.182 c 0 + 347.932 -126.182 381.001 -110.476 402.714 -76.7224 c 0 + 427.982 -37.4432 428 10.8898 428 52 c 0 + 428 319 l 0 + 428 356.393 427.762 401.823 399.11 436.061 c 0 + 380.097 458.781 353.908 469.58 327.341 469.58 c 0 + 271.362 469.58 220.49 422.787 200.308 395.893 c 0 + 178.287 366.55 174 340.651 174 305 c 0 + 174 0 l 0 + 89 0 l 0 +EndSplineSet +EndChar + +StartChar: abreve +Encoding: 310 259 243 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 241 728 S 1 0 0 1 10 0 2 +Refer: 0 97 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ccaron +Encoding: 311 269 244 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 1 99 N 1 0 0 1 0 0 2 +Refer: 143 711 S 1 0 0 1 0 0 2 +EndChar + +StartChar: dcaron +Encoding: 312 271 245 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +368 452 m 0 + 368 771 l 0 + 447 771 l 0 + 447 49 l 0 + 447 32.9912 447.786 16.2109 452 0 c 0 + 369 0 l 0 + 364.758 12.8477 364 26.4229 364 39 c 0 + 364 85 l 0 + 331.672 29.4834 274.151 -12.0137 209.492 -12.0137 c 0 + 97.8574 -12.0137 9.99902 105.708 9.99902 268.875 c 0 + 9.99902 443.625 112.897 543.229 220.226 543.229 c 0 + 283.503 543.229 340.554 507.905 368 452 c 0 +224.355 475.159 m 0 + 149.202 475.159 90.9316 392.789 90.9316 278.779 c 0 + 90.9316 171.018 142.046 61.8809 227.748 61.8809 c 0 + 273.537 61.8809 313.653 94.3154 335.296 129.689 c 0 + 358.192 167.108 361.312 207.25 361.312 255.021 c 0 + 361.312 325.707 359.835 363.117 343.567 397.269 c 0 + 320.504 445.688 266.849 475.159 224.355 475.159 c 0 +EndSplineSet +Refer: 56 8217 N 0.8 0 0 0.8 306.515 186.393 2 +EndChar + +StartChar: eogonek +Encoding: 313 281 246 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +309.849 542.279 m 0 + 396.962 542.279 495.692 495.772 519.469 353.277 c 0 + 524.642 322.276 526.146 288.58 523 253 c 1 + 147.298 253 l 1 + 153.598 94.4857 256.131 55.4411 326.953 55.4411 c 0 + 379.589 55.4411 429.496 76.3575 464 115 c 1 + 510 70 l 1 + 469 19 l 2 + 429.072 -30.6685 396.601 -67.9568 396.601 -101.807 c 0 + 396.601 -127.998 415.588 -147.006 441.833 -147.006 c 0 + 447.913 -147.006 467.621 -146.296 501 -125 c 1 + 500 -182 l 1 + 478.223 -193.942 451.111 -202.754 423.732 -202.754 c 0 + 365.924 -202.754 327.823 -164.029 327.823 -116.525 c 0 + 327.823 -82.2885 349.347 -41.4463 392 -1 c 1 + 366.185 -8.27677 339.549 -12.0058 312.827 -12.0058 c 0 + 173.799 -12.0058 66.4395 87.3647 66.4395 261.323 c 0 + 66.4395 451.743 183.571 542.279 309.849 542.279 c 0 +150.008 317 m 1 + 441 317 l 1 + 450.942 402.839 389.68 478.169 303.883 478.169 c 0 + 247.072 478.169 166.495 441.85 150.008 317 c 1 +EndSplineSet +EndChar + +StartChar: lcaron +Encoding: 314 318 247 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 56 8217 S 0.8 0 0 0.8 266.515 186.393 2 +Refer: 7 108 N 1 0 0 1 -20 0 2 +EndChar + +StartChar: lacute +Encoding: 315 314 248 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 7 108 N 1 0 0 1 0 0 2 +Refer: 194 -1 S 1 0 0 1 -20 188 2 +EndChar + +StartChar: nacute +Encoding: 316 324 249 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 6 110 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ncaron +Encoding: 317 328 250 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 143 711 S 1 0 0 1 0 0 2 +Refer: 6 110 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ohungarumlaut +Encoding: 318 337 251 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 240 733 S 1 0 0 1 0 0 2 +Refer: 5 111 N 1 0 0 1 0 0 2 +EndChar + +StartChar: rcaron +Encoding: 319 345 252 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 143 711 S 1 0 0 1 0 0 2 +Refer: 16 114 N 1 0 0 1 0 0 2 +EndChar + +StartChar: sacute +Encoding: 320 347 253 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 3 115 N 1 0 0 1 0 0 2 +EndChar + +StartChar: scedilla +Encoding: 322 351 254 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 201 184 S 1 0 0 1 -30 0 2 +Refer: 3 115 N 1 0 0 1 0 0 2 +EndChar + +StartChar: tcedilla +Encoding: 323 355 255 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 201 184 S 1 0 0 1 20 0 2 +Refer: 8 116 N 1 0 0 1 0 0 2 +EndChar + +StartChar: uring +Encoding: 324 367 256 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 161 730 S 1 0 0 1 0 0 2 +Refer: 15 117 N 1 0 0 1 0 0 2 +EndChar + +StartChar: uhungarumlaut +Encoding: 325 369 257 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 240 733 S 1 0 0 1 0 0 2 +Refer: 15 117 N 1 0 0 1 0 0 2 +EndChar + +StartChar: zdot +Encoding: 326 380 258 +Width: 600 +Flags: HMWO +LayerCount: 2 +Fore +Refer: 69 122 S 1 0 0 1 0 0 2 +Refer: 222 729 N 1 0 0 1 0 0 2 +EndChar + +StartChar: dotlessj +Encoding: 331 567 259 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +SplineSet +156 530 m 0 + 437 530 l 0 + 437 37 l 0 + 437 -8.68478 435.772 -52.1052 413.163 -96.3812 c 0 + 377.277 -166.657 303.238 -202.181 227.699 -202.181 c 0 + 162.017 -202.181 103.902 -175.027 66 -128 c 0 + 120 -56 l 0 + 127.204 -61.9473 125.358 -69.4816 130.11 -77.2483 c 0 + 134.378 -84.2222 169.009 -130.016 233.016 -130.016 c 0 + 277.791 -130.016 319.506 -106.298 339.459 -63.2398 c 0 + 352.497 -35.1019 353 -7.27543 353 21 c 0 + 353 461 l 0 + 156 461 l 0 + 156 530 l 0 +EndSplineSet +EndChar + +StartChar: kgreenlandic +Encoding: 330 312 260 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +SplineSet +87 529 m 0 + 182 529 l 0 + 182.131 528.206 182.196 527.403 182.196 526.598 c 0 + 182.196 519.678 177.642 515.346 174.831 511.514 c 0 + 171.215 506.587 171 503.254 171 499 c 0 + 171 286 l 0 + 436 532 l 0 + 456.53 526.949 477.704 526 498 526 c 0 + 528 526 l 0 + 305 316 l 0 + 565 -1 l 0 + 562.299 -0.982364 559.597 -0.973546 556.896 -0.973546 c 0 + 501.401 -0.973546 457 -5 457 -5 c 0 + 241 265 l 0 + 171 200 l 0 + 171 -1 l 0 + 87 -1 l 0 + 87 529 l 0 +EndSplineSet +EndChar + +StartChar: quotesinglbase +Encoding: 333 8218 261 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 25 44 N 1 0 0 1 0 0 2 +EndChar + +StartChar: quotedblright +Encoding: 335 8221 262 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 56 8217 S 1 0 0 1 -120 0 2 +Refer: 56 8217 N 1 0 0 1 120 0 2 +EndChar + +StartChar: quotedblbase +Encoding: 336 8222 263 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 56 8217 S 1 0 0 1 120 -620 2 +Refer: 56 8217 N 1 0 0 1 -120 -620 2 +EndChar + +StartChar: quotedblleft +Encoding: 334 8220 264 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 57 8216 S 1 0 0 1 120 0 2 +Refer: 57 8216 N 1 0 0 1 -120 0 2 +EndChar + +StartChar: ellipsis +Encoding: 337 8230 265 +Width: 600 +Flags: MW +LayerCount: 2 +Fore +Refer: 24 46 S 1 0 0 1 200 0 2 +Refer: 24 46 N 1 0 0 1 -200 0 2 +Refer: 24 46 N 1 0 0 1 0 0 2 +EndChar + +StartChar: uparrow +Encoding: 338 8593 266 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +78 468 m 1 + 295 742 l 1 + 320 742 l 1 + 521 466 l 1 + 463 427 l 1 + 340 593.819 l 1 + 340 -39 l 1 + 263 -39 l 1 + 263 594.4 l 1 + 128 427 l 1 + 78 468 l 1 +EndSplineSet +EndChar + +StartChar: downarrow +Encoding: 339 8595 267 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 266 8593 N -1 0 0 -1 599 703 2 +EndChar + +StartChar: visiblespace +Encoding: 340 9251 268 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +66 81 m 0 + 120 81 l 0 + 120 -24 l 0 + 478 -24 l 0 + 478 81 l 0 + 534 81 l 0 + 534 -76 l 0 + 66 -76 l 0 + 66 81 l 0 +EndSplineSet +EndChar + +StartChar: r.serif +Encoding: 341 -1 269 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +85 529 m 4 + 244 529 l 4 + 241 427 l 4 + 273.808 493.49 340.052 541.496 416.28 541.496 c 4 + 465.614 541.496 515.474 521.475 553 484 c 4 + 514 404 l 4 + 505.563 412.004 501.879 420.625 495.327 429.3 c 4 + 481.446 447.681 452.813 469.759 411.236 469.759 c 4 + 371.703 469.759 324.688 449.297 282.848 390.04 c 4 + 241.434 331.385 241 295.589 241 267 c 4 + 241 62 l 4 + 352 62 l 4 + 352 -1 l 4 + 83 -1 l 4 + 83 62 l 4 + 158 62 l 4 + 158 462 l 4 + 85 462 l 4 + 85 529 l 4 +EndSplineSet +EndChar + +StartChar: hungarumlaut.cap +Encoding: 343 -1 270 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +486 939 m 0 + 540 864 l 0 + 371 747 l 0 + 334 795 l 0 + 486 939 l 0 +280 939 m 0 + 334 864 l 0 + 165 747 l 0 + 128 795 l 0 + 280 939 l 0 +EndSplineSet +EndChar + +StartChar: uni2074 +Encoding: 344 8308 271 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +360 743 m 0 + 405 743 l 0 + 405 459 l 0 + 478 459 l 0 + 478 404 l 0 + 405 404 l 0 + 405 292 l 0 + 339 292 l 0 + 339 405 l 0 + 128 405 l 0 + 128 446 l 0 + 360 743 l 0 +340 630 m 0 + 204 459 l 0 + 340 459 l 0 + 340 630 l 0 +EndSplineSet +EndChar + +StartChar: onequarter +Encoding: 282 188 272 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 274 8260 S 1 0 0 1 0 0 2 +Refer: 271 8308 N 0.8 0 0 0.8 178.6 -314.5 2 +Refer: 149 185 N 0.8 0 0 0.8 -107.4 198.6 2 +EndChar + +StartChar: threequarters +Encoding: 284 190 273 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 274 8260 S 1 0 0 1 6 0 2 +Refer: 204 179 N 0.8 0 0 0.8 -90.9999 201.01 2 +Refer: 271 8308 N 0.8 0 0 0.8 178.6 -314.5 2 +EndChar + +StartChar: fraction +Encoding: 345 8260 274 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +98 -19 m 29 + 461 770 l 29 + 516 739 l 29 + 152 -49 l 29 + 98 -19 l 29 +EndSplineSet +EndChar + +StartChar: lslash +Encoding: 327 322 275 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +108 770 m 1 + 342 770 l 1 + 342 428.9 l 1 + 417 455 l 2 + 429 459 437 464 448 472 c 1 + 448 387 l 1 + 342 351.164 l 1 + 342 67 l 1 + 498 67 l 1 + 498 0 l 1 + 101 0 l 1 + 101 67 l 1 + 258 67 l 1 + 258 322.765 l 1 + 167 292 l 1 + 167 368 l 1 + 258 399.668 l 1 + 258 703 l 1 + 108 703 l 1 + 108 770 l 1 +EndSplineSet +EndChar + +StartChar: Lslash +Encoding: 286 321 276 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +95 722 m 1 + 189 722 l 1 + 189.172 720.866 189.256 719.721 189.256 718.572 c 0 + 189.256 703.818 179 701.431 179 683 c 2 + 179 380.515 l 1 + 371 443 l 2 + 381.223 446.327 390.329 449.186 401 454 c 1 + 401 380 l 1 + 179 308.815 l 1 + 179 69 l 1 + 527 69 l 1 + 527 -1 l 1 + 95 -1 l 1 + 95 281.88 l 1 + 33 262 l 1 + 33 333 l 1 + 95 353.178 l 1 + 95 722 l 1 +EndSplineSet +EndChar + +StartChar: Eng +Encoding: 346 330 277 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +69 0 m 0 + 69 722 l 0 + 154 722 l 0 + 154 628 l 0 + 195.063 692.14 265.789 735.013 341.737 735.013 c 0 + 413.041 735.013 477.286 696.601 508.242 629.025 c 0 + 529.38 582.882 530 536.67 530 491 c 0 + 530 491 l 0 + 530 203 l 0 + 530 162.878 529.279 123.251 510.426 83.1621 c 0 + 481.76 22.2073 421.615 -12.2234 354.689 -12.2234 c 0 + 319.213 -12.2234 284.072 -2.51385 253 16 c 0 + 294 88 l 0 + 300.652 84.108 301.561 78.1418 306.406 74.6071 c 0 + 308.777 72.8775 330.155 60.3705 357.435 60.3705 c 0 + 390.135 60.3705 419.596 78.287 435.091 111.214 c 0 + 447.894 138.419 448 169.63 448 197 c 0 + 448 489 l 0 + 448 522.737 448.069 561.745 430.159 597.471 c 0 + 409.568 638.545 370.917 662.054 327.377 662.054 c 0 + 264.705 662.054 206.267 613.375 180.496 576.603 c 0 + 158.142 544.705 154 516.425 154 478 c 0 + 154 0 l 0 + 69 0 l 0 +EndSplineSet +EndChar + +StartChar: dcroat +Encoding: 347 273 278 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +280.638 475.041 m 0 + 219.729 475.041 134.873 433.439 134.873 282.731 c 0 + 134.873 108.363 223.935 61.8091 283.87 61.8091 c 0 + 339.081 61.8091 393.871 98.7178 414.26 162.214 c 0 + 422.843 188.943 425.29 218.613 425.29 258.526 c 0 + 425.29 317.62 422.953 347.168 416.391 371.787 c 0 + 395.442 450.383 327.053 475.041 280.638 475.041 c 0 +510.157 630 m 1 + 511 49 l 2 + 511.023 32.976 511.825 16.2095 516 0 c 1 + 433 0 l 1 + 428.758 12.8474 428 26.4226 428 39 c 2 + 428 85 l 1 + 394.754 25.5822 332.198 -11.7426 264.502 -11.7426 c 0 + 162.172 -11.7426 53.9989 73.6686 53.9989 269.088 c 0 + 53.9989 471.408 175.85 543.089 276.756 543.089 c 0 + 349.905 543.089 406.551 506.411 432 452 c 1 + 432 630 l 1 + 344 630 l 1 + 344 692 l 1 + 432 692 l 1 + 432 771 l 1 + 521 771 l 1 + 521.429 763.115 517.033 757.358 514.644 753.665 c 0 + 510.515 747.282 509.991 744.04 510 738 c 2 + 510.067 692 l 1 + 561 692 l 1 + 561 630 l 1 + 510.157 630 l 1 +EndSplineSet +EndChar + +StartChar: Gbreve +Encoding: 348 286 279 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 241 728 S 1 0 0 1 10 167 2 +Refer: 67 71 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Idotaccent +Encoding: 349 304 280 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 222 729 S 1 0 0 1 -20 157 2 +Refer: 4 73 N 1 0 0 1 0 0 2 +EndChar + +StartChar: cacute +Encoding: 321 263 281 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 1 99 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ecaron +Encoding: 328 283 282 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 143 711 S 1 0 0 1 0 0 2 +Refer: 9 101 N 1 0 0 1 0 0 2 +EndChar + +StartChar: gbreve +Encoding: 342 287 283 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 241 728 S 1 0 0 1 10 0 2 +Refer: 13 103 N 1 0 0 1 0 0 2 +EndChar + +StartChar: racute +Encoding: 350 341 284 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 16 114 N 1 0 0 1 0 0 2 +EndChar + +StartChar: zacute +Encoding: 352 378 285 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 107 180 S 1 0 0 1 0 0 2 +Refer: 69 122 N 1 0 0 1 0 0 2 +EndChar + +StartChar: tcaron +Encoding: 351 357 286 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +Refer: 56 8217 S 0.8 0 0 0.8 276.515 226.393 2 +Refer: 8 116 N 1 0 0 1 -30 0 2 +EndChar + +StartChar: bullet +Encoding: 353 8226 287 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +405.001 343.496 m 0 + 405.001 290.47 361.103 246.968 306.461 246.968 c 0 + 251.887 246.968 207.967 290.437 207.967 343.507 c 0 + 207.967 396.512 251.854 440.001 306.474 440.001 c 0 + 361.085 440.001 405.001 396.528 405.001 343.496 c 0 +EndSplineSet +EndChar + +StartChar: florin +Encoding: 354 402 288 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +566 719 m 1 + 528 642 l 1 + 524.387 642.014 519.832 644.287 518.495 650.917 c 0 + 517.585 655.43 518.381 658.903 515.477 665.038 c 0 + 504.735 687.73 476.304 714.31 438.015 714.31 c 0 + 408.828 714.31 375.637 697.84 356.674 655.963 c 0 + 340.302 619.806 338.928 575.492 336 539 c 2 + 328.378 444 l 1 + 471 444 l 1 + 471 378 l 1 + 323.082 378 l 1 + 295 28 l 2 + 290.863 -23.5551 284.654 -73.9088 257.475 -120.242 c 0 + 224.265 -176.855 172.982 -203.002 125.302 -203.002 c 0 + 89.2414 -203.002 55.0861 -188.068 31 -162 c 1 + 78 -88 l 1 + 84.9954 -91.4507 87.1891 -97.9286 90.1488 -102.751 c 0 + 96.5551 -113.189 111.389 -124.965 131.92 -124.965 c 0 + 150.936 -124.965 174.229 -114.524 191.263 -83.2958 c 0 + 210.753 -47.5643 214.363 -4.0862 217 31 c 2 + 243.075 378 l 1 + 103 378 l 1 + 103 444 l 1 + 248.035 444 l 1 + 256 550 l 2 + 259.285 593.711 263.037 638.828 284.817 682.438 c 0 + 316.683 746.244 375.812 780 436.757 780 c 0 + 486.409 780 533.918 757.602 566 719 c 1 +EndSplineSet +EndChar + +StartChar: dagger +Encoding: 355 8224 289 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +261 756 m 1 + 339 756 l 1 + 339 529 l 1 + 531 529 l 1 + 531 460 l 1 + 339 460 l 1 + 339 -175 l 1 + 261 -175 l 1 + 261 460 l 1 + 67 460 l 1 + 67 529 l 1 + 261 529 l 1 + 261 756 l 1 +EndSplineSet +EndChar + +StartChar: daggerdbl +Encoding: 356 8225 290 +Width: 600 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +261 756 m 1 + 339 756 l 1 + 339 529 l 1 + 531 529 l 1 + 531 460 l 1 + 339 460 l 1 + 339 140 l 1 + 531 140 l 1 + 531 71 l 1 + 339 71 l 1 + 339 -175 l 1 + 261 -175 l 1 + 261 71 l 1 + 67 71 l 1 + 67 140 l 1 + 261 140 l 1 + 261 460 l 1 + 67 460 l 1 + 67 529 l 1 + 261 529 l 1 + 261 756 l 1 +EndSplineSet +EndChar + +StartChar: trademark +Encoding: 357 8482 291 +Width: 600 +VWidth: 1157 +Flags: HMW +LayerCount: 2 +Fore +SplineSet +286.552 735.33 m 5 + 286.552 689.01 l 5 + 182.332 689.01 l 5 + 182.332 370.56 l 5 + 130.222 370.56 l 5 + 130.222 689.01 l 5 + 30.6338 689.01 l 5 + 30.6338 735.33 l 5 + 286.552 735.33 l 5 +360.664 735.33 m 5 + 444.04 567.42 l 5 + 466.042 609.108 466.042 609.108 487.465 651.375 c 132 + 508.888 693.642 508.888 693.642 530.89 735.33 c 5 + 569.104 735.33 l 5 + 569.104 370.56 l 5 + 520.468 370.56 l 5 + 520.468 619.53 l 5 + 503.098 588.264 503.098 588.264 485.149 556.419 c 132 + 467.2 524.574 467.2 524.574 450.988 494.466 c 5 + 432.46 495.624 l 5 + 368.77 619.53 l 5 + 368.77 370.56 l 5 + 320.134 370.56 l 5 + 320.134 735.33 l 5 + 360.664 735.33 l 5 +EndSplineSet +EndChar + +StartChar: zero.noslash +Encoding: 358 -1 292 +Width: 600 +Flags: HW +LayerCount: 2 +Fore +SplineSet +517.025 357.799 m 4 + 517.025 137.688 423.592 -13.0208 297.523 -13.0208 c 4 + 183.255 -13.0208 82.8194 113.451 82.8194 341.437 c 4 + 82.8194 574.873 173.246 727.004 299.955 727.004 c 4 + 420.815 727.004 517.025 585.161 517.025 357.799 c 4 +299.205 656.004 m 4 + 273.981 656.004 230.75 644.394 201.424 580.18 c 4 + 177.708 528.251 159.966 454.416 159.966 351.701 c 4 + 159.966 277.625 175.139 200.382 194.564 153.681 c 4 + 226.53 76.8272 272.306 60.9815 302.777 60.9815 c 4 + 329.251 60.9815 369.189 73.0652 399.83 130.196 c 4 + 432.501 191.111 442.125 283.781 442.125 342.506 c 4 + 442.125 419.575 425.889 514.517 403.194 568.433 c 4 + 372.393 641.605 328.293 656.004 299.205 656.004 c 4 +EndSplineSet +EndChar + +StartChar: .notdef +Encoding: 0 -1 293 +Width: 600 +Flags: HW +LayerCount: 2 +EndChar +EndChars +EndSplineFont diff --git a/extlib/inconsolata/OFL_1.1.txt b/extlib/inconsolata/OFL_1.1.txt new file mode 100644 index 00000000..f1a20ac1 --- /dev/null +++ b/extlib/inconsolata/OFL_1.1.txt @@ -0,0 +1,97 @@ +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (). + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/extlib/inconsolata/textest.pdf b/extlib/inconsolata/textest.pdf new file mode 100644 index 00000000..923aa349 Binary files /dev/null and b/extlib/inconsolata/textest.pdf differ diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index 6f94c714..7b9bf0d7 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -69,16 +69,20 @@ def get_media_type_and_manager(filename): ''' Get the media type and manager based on a filename ''' - for media_type, manager in get_media_managers(): - if filename.find('.') > 0: - # Get the file extension - ext = os.path.splitext(filename)[1].lower() - else: - raise InvalidFileType( - _('Could not find any file extension in "{filename}"').format( - filename=filename)) + if filename.find('.') > 0: + # Get the file extension + ext = os.path.splitext(filename)[1].lower() + else: + raise Exception( + _(u'Could not extract any file extension from "{filename}"').format( + filename=filename)) + for media_type, manager in get_media_managers(): # Omit the dot from the extension and match it against # the media manager if ext[1:] in manager['accepted_extensions']: return media_type, manager + else: + raise FileTypeNotSupported( + # TODO: Provide information on which file types are supported + _(u'Sorry, I don\'t support that file type :(')) diff --git a/mediagoblin/media_types/ascii/__init__.py b/mediagoblin/media_types/ascii/__init__.py new file mode 100644 index 00000000..21b31d0e --- /dev/null +++ b/mediagoblin/media_types/ascii/__init__.py @@ -0,0 +1,27 @@ +# 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 . + +from mediagoblin.media_types.ascii.processing import process_ascii + + +MEDIA_MANAGER = { + "human_readable": "ASCII", + "processor": process_ascii, # alternately a string, + # 'mediagoblin.media_types.image.processing'? + "display_template": "mediagoblin/media_displays/ascii.html", + "default_thumb": "images/media_thumbs/ascii.jpg", + "accepted_extensions": [ + "txt"]} diff --git a/mediagoblin/media_types/ascii/asciitoimage.py b/mediagoblin/media_types/ascii/asciitoimage.py new file mode 100644 index 00000000..39c75a19 --- /dev/null +++ b/mediagoblin/media_types/ascii/asciitoimage.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 . + +import Image +import ImageFont +import ImageDraw +import logging +import pkg_resources +import os + +_log = logging.getLogger(__name__) + +class AsciiToImage(object): + ''' + Converter of ASCII art into image files, preserving whitespace + + kwargs: + - font: Path to font file + default: fonts/Inconsolata.otf + - font_size: Font size, ``int`` + default: 11 + ''' + + # Font file path + _font = None + + _font_size = 11 + + # ImageFont instance + _if = None + + # ImageFont + _if_dims = None + + # Image instance + _im = None + + def __init__(self, **kw): + if kw.get('font'): + self._font = kw.get('font') + else: + self._font = pkg_resources.resource_filename( + 'mediagoblin.media_types.ascii', + os.path.join('fonts', 'Inconsolata.otf')) + + if kw.get('font_size'): + self._font_size = kw.get('font_size') + + _log.info('Setting font to {0}, size {1}'.format( + self._font, + self._font_size)) + + self._if = ImageFont.truetype( + self._font, + self._font_size) + + # ,-,-^-'-^'^-^'^-'^-. + # ( I am a wall socket )Oo, ___ + # `-.,.-.,.-.-.,.-.--' ' ` + # Get the size, in pixels of the '.' character + self._if_dims = self._if.getsize('.') + # `---' + + def convert(self, text, destination): + # TODO: Detect if text is a file-like, if so, act accordingly + im = self._create_image(text) + + # PIL's Image.save will handle both file-likes and paths + if im.save(destination): + _log.info('Saved image in {0}'.format( + destination)) + + def _create_image(self, text): + ''' + Write characters to a PIL image canvas. + + TODO: + - Character set detection and decoding, + http://pypi.python.org/pypi/chardet + ''' + # TODO: Account for alternative line endings + lines = text.split('\n') + + line_lengths = [len(i) for i in lines] + + # Calculate destination size based on text input and character size + im_dims = ( + max(line_lengths) * self._if_dims[0], + len(line_lengths) * self._if_dims[1]) + + _log.info('Destination image dimensions will be {0}'.format( + im_dims)) + + im = Image.new( + 'RGBA', + im_dims, + (255, 255, 255, 0)) + + draw = ImageDraw.Draw(im) + + char_pos = [0, 0] + + for line in lines: + line_length = len(line) + + _log.debug('Writing line at {0}'.format(char_pos)) + + for _pos in range(0, line_length): + char = line[_pos] + + px_pos = self._px_pos(char_pos) + + _log.debug('Writing character "{0}" at {1} (px pos {2}'.format( + char, + char_pos, + px_pos)) + + draw.text( + px_pos, + char, + font=self._if, + fill=(0, 0, 0, 255)) + + char_pos[0] += 1 + + # Reset X position, increment Y position + char_pos[0] = 0 + char_pos[1] += 1 + + return im + + def _px_pos(self, char_pos): + ''' + Helper function to calculate the pixel position based on + character position and character dimensions + ''' + px_pos = [0, 0] + for index, val in zip(range(0, len(char_pos)), char_pos): + px_pos[index] = char_pos[index] * self._if_dims[index] + + return px_pos + + +if __name__ == "__main__": + import urllib + txt = urllib.urlopen('file:///home/joar/Dropbox/ascii/install-all-the-dependencies.txt') + + _log.setLevel(logging.DEBUG) + logging.basicConfig() + + converter = AsciiToImage() + + converter.convert(txt.read(), '/tmp/test.png') + + ''' + im, x, y, duration = renderImage(h, 10) + print "Rendered image in %.5f seconds" % duration + im.save('tldr.png', "PNG") + ''' diff --git a/mediagoblin/media_types/ascii/fonts/Inconsolata.otf b/mediagoblin/media_types/ascii/fonts/Inconsolata.otf new file mode 120000 index 00000000..4e742b5e --- /dev/null +++ b/mediagoblin/media_types/ascii/fonts/Inconsolata.otf @@ -0,0 +1 @@ +../../../../extlib/inconsolata/Inconsolata.otf \ No newline at end of file diff --git a/mediagoblin/media_types/ascii/processing.py b/mediagoblin/media_types/ascii/processing.py new file mode 100644 index 00000000..a74690c1 --- /dev/null +++ b/mediagoblin/media_types/ascii/processing.py @@ -0,0 +1,93 @@ +# 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 . +import asciitoimage +import chardet +import os +import Image + +from mediagoblin import mg_globals as mgg +from mediagoblin.processing import create_pub_filepath, THUMB_SIZE + + +def process_ascii(entry): + ''' + Code to process a txt file + ''' + workbench = mgg.workbench_manager.create_workbench() + # Conversions subdirectory to avoid collisions + conversions_subdir = os.path.join( + workbench.dir, 'conversions') + os.mkdir(conversions_subdir) + + queued_filepath = entry['queued_media_file'] + queued_filename = workbench.localized_file( + mgg.queue_store, queued_filepath, + 'source') + + queued_file = file(queued_filename, 'rb') + + with queued_file: + queued_file_charset = chardet.detect(queued_file.read()) + + queued_file.seek(0) # Rewind the queued file + + thumb_filepath = create_pub_filepath( + entry, 'thumbnail.png') + + tmp_thumb_filename = os.path.join( + conversions_subdir, thumb_filepath[-1]) + + converter = asciitoimage.AsciiToImage() + + thumb = converter._create_image( + queued_file.read()) + + with file(tmp_thumb_filename, 'w') as thumb_file: + thumb.thumbnail(THUMB_SIZE, Image.ANTIALIAS) + thumb.save(thumb_file) + + mgg.public_store.copy_local_to_storage( + tmp_thumb_filename, thumb_filepath) + + queued_file.seek(0) + + original_filepath = create_pub_filepath(entry, queued_filepath[-1]) + + with mgg.public_store.get_file(original_filepath, 'wb') \ + as original_file: + original_file.write(queued_file.read()) + + + queued_file.seek(0) # Rewind *again* + + unicode_filepath = create_pub_filepath(entry, 'unicode.txt') + + with mgg.public_store.get_file(unicode_filepath, 'wb') \ + as unicode_file: + unicode_file.write( + unicode(queued_file.read().decode( + queued_file_charset['encoding'])).encode( + 'ascii', + 'xmlcharrefreplace')) + + mgg.queue_store.delete_file(queued_filepath) + entry['queued_media_file'] = [] + media_files_dict = entry.setdefault('media_files', {}) + media_files_dict['thumb'] = thumb_filepath + media_files_dict['unicode'] = unicode_filepath + media_files_dict['original'] = original_filepath + + entry.save() diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index ecdd0474..382ba88a 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -402,3 +402,15 @@ table.media_panel th { margin-top: 10px; margin-left: 10px; } + +/* ASCII art */ + +@font-face { + font-family: Inconsolata; + src: local('Inconsolata'), url('../fonts/Inconsolata.otf') format('opentype') +} + +.ascii-wrapper pre { + font-family: Inconsolata, monospace; + line-height: 1em; +} \ No newline at end of file diff --git a/mediagoblin/static/fonts/Inconsolata.otf b/mediagoblin/static/fonts/Inconsolata.otf new file mode 120000 index 00000000..777be657 --- /dev/null +++ b/mediagoblin/static/fonts/Inconsolata.otf @@ -0,0 +1 @@ +../../../extlib/inconsolata/Inconsolata.otf \ No newline at end of file diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 4e4c7c43..443d0e52 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -128,9 +128,13 @@ def submit_start(request): return redirect(request, "mediagoblin.user_pages.user_home", user=request.user.username) - except InvalidFileType, exc: + except Exception as e: + ''' + This section is intended to catch exceptions raised in + mediagobling.media_types + ''' submit_form.file.errors.append( - _(u'Invalid file type.')) + e) return render_to_response( request, diff --git a/mediagoblin/templates/mediagoblin/media_displays/ascii.html b/mediagoblin/templates/mediagoblin/media_displays/ascii.html new file mode 100644 index 00000000..9e77066a --- /dev/null +++ b/mediagoblin/templates/mediagoblin/media_displays/ascii.html @@ -0,0 +1,40 @@ +{# +# 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 . +#} + +{% extends 'mediagoblin/user_pages/media.html' %} + +{% block mediagoblin_media %} +
    +
    +      {%- autoescape False -%}
    +      {{- request.app.public_store.get_file(
    +             media['media_files']['unicode']).read()|string -}}
    +      {%- endautoescape -%}
    +    
    +
    + {% if 'original' in media.media_files %} +

    + + {%- trans -%} + Original + {%- endtrans -%} + +

    + {% endif %} +{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/media_displays/image.html b/mediagoblin/templates/mediagoblin/media_displays/image.html index ad60fa94..94420e89 100644 --- a/mediagoblin/templates/mediagoblin/media_displays/image.html +++ b/mediagoblin/templates/mediagoblin/media_displays/image.html @@ -1 +1,19 @@ +{# +# 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 . +#} + {% extends 'mediagoblin/user_pages/media.html' %} diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html index ada50e28..fc08f963 100644 --- a/mediagoblin/templates/mediagoblin/media_displays/video.html +++ b/mediagoblin/templates/mediagoblin/media_displays/video.html @@ -1,3 +1,21 @@ +{# +# 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 . +#} + {% extends 'mediagoblin/user_pages/media.html' %} {% block mediagoblin_media %} diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py index 7c372745..4a0543a8 100644 --- a/mediagoblin/tests/test_submission.py +++ b/mediagoblin/tests/test_submission.py @@ -1,3 +1,4 @@ + # GNU MediaGoblin -- federated, autonomous media hosting # Copyright (C) 2011 MediaGoblin contributors. See AUTHORS. # @@ -16,6 +17,7 @@ import urlparse import pkg_resources +import re from nose.tools import assert_equal, assert_true, assert_false @@ -216,7 +218,8 @@ class TestSubmission: context = template.TEMPLATE_TEST_CONTEXT['mediagoblin/submit/start.html'] form = context['submit_form'] - assert form.file.errors == [u'Invalid file type.'] + assert re.match(r'^Could not extract any file extension from ".*?"$', str(form.file.errors[0])) + assert len(form.file.errors) == 1 # NOTE: The following 2 tests will ultimately fail, but they # *will* pass the initial form submission step. Instead, -- cgit v1.2.3 From 4601c30c2e80734cf3a18472c2e29a7f920b9604 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Sat, 31 Dec 2011 22:57:08 +0100 Subject: Fixed submission error handling and broken tests - Fixed broken test_auth test - Fixed error handling on submission, it now raises the exception if it is not explicitly relevant to file submission. --- mediagoblin/media_types/__init__.py | 2 +- mediagoblin/submit/views.py | 12 +++++++++--- mediagoblin/tests/test_auth.py | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/mediagoblin/media_types/__init__.py b/mediagoblin/media_types/__init__.py index 7b9bf0d7..e7eb1dde 100644 --- a/mediagoblin/media_types/__init__.py +++ b/mediagoblin/media_types/__init__.py @@ -73,7 +73,7 @@ def get_media_type_and_manager(filename): # Get the file extension ext = os.path.splitext(filename)[1].lower() else: - raise Exception( + raise InvalidFileType( _(u'Could not extract any file extension from "{filename}"').format( filename=filename)) diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 443d0e52..60693bd6 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -31,7 +31,8 @@ from mediagoblin.decorators import require_active_login from mediagoblin.submit import forms as submit_forms, security from mediagoblin.processing import mark_entry_failed, ProcessMedia from mediagoblin.messages import add_message, SUCCESS -from mediagoblin.media_types import get_media_type_and_manager, InvalidFileType +from mediagoblin.media_types import get_media_type_and_manager, \ + InvalidFileType, FileTypeNotSupported @require_active_login @@ -133,8 +134,13 @@ def submit_start(request): This section is intended to catch exceptions raised in mediagobling.media_types ''' - submit_form.file.errors.append( - e) + + if isinstance(e, InvalidFileType) or \ + isinstance(e, FileTypeNotSupported): + submit_form.file.errors.append( + e) + else: + raise return render_to_response( request, diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index 9b0dea66..e54ffa5a 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -233,9 +233,9 @@ def test_register_views(test_app): ## Did we redirect to the proper page? Use the right template? assert_equal( urlparse.urlsplit(response.location)[2], - '/auth/forgot_password/email_sent/') + '/auth/login/') assert template.TEMPLATE_TEST_CONTEXT.has_key( - 'mediagoblin/auth/fp_email_sent.html') + 'mediagoblin/auth/login.html') ## Make sure link to change password is sent by email assert len(mail.EMAIL_TEST_INBOX) == 1 -- cgit v1.2.3 From 7fc782bb6d63cef234ff1a4dad29175afb6d8be5 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 1 Jan 2012 18:11:39 +0100 Subject: Disable horizontal resize for text areas. --- mediagoblin/static/css/base.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 382ba88a..98b77967 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -193,6 +193,7 @@ text-align: center; } textarea#comment_content { + resize: vertical; width: 634px; height: 90px; border: none; @@ -256,6 +257,10 @@ textarea#comment_content { width: 20px; } +textarea#description { + resize: vertical; +} + /* comments */ .comment_author { @@ -413,4 +418,4 @@ table.media_panel th { .ascii-wrapper pre { font-family: Inconsolata, monospace; line-height: 1em; -} \ No newline at end of file +} -- cgit v1.2.3 From ce86b1d5afd21283719146a367b05352d290032f Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 1 Jan 2012 18:12:18 +0100 Subject: Remove border-bottom from media_specs --- mediagoblin/static/css/base.css | 1 - 1 file changed, 1 deletion(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 98b77967..e58a7368 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -303,7 +303,6 @@ h2.media_title { p.media_specs { font-size: 0.9em; border-top: 1px solid #222; - border-bottom: 1px solid #222; padding: 10px 0px; color: #888; } -- cgit v1.2.3 From f5d837fe4a0ad5f08b48e0cd69fddb37e81d1514 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 1 Jan 2012 18:14:39 +0100 Subject: Forgot this one. Also disable horizontal resize for the bio field --- mediagoblin/static/css/base.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index e58a7368..76e37c1b 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -257,7 +257,7 @@ textarea#comment_content { width: 20px; } -textarea#description { +textarea#description, textarea#bio { resize: vertical; } -- cgit v1.2.3 From 415077a743400f9d9fa476b37c5b3aff4683f942 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 1 Jan 2012 17:24:02 +0100 Subject: Factor out check_db_migrations_current When initializing the database connection the current mongo based setup checked for new migrations and warned about them. This was mongo specific so factor'd it out into a more generic check_db_migrations_current function in the mongo backend. Also created a dummy one in the sql backend. --- mediagoblin/db/mongo/open.py | 23 +++++++++++++++++++++++ mediagoblin/db/open.py | 3 ++- mediagoblin/db/sql/open.py | 4 ++++ mediagoblin/init/__init__.py | 24 +++--------------------- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/mediagoblin/db/mongo/open.py b/mediagoblin/db/mongo/open.py index 63889292..8016ced9 100644 --- a/mediagoblin/db/mongo/open.py +++ b/mediagoblin/db/mongo/open.py @@ -18,6 +18,7 @@ import pymongo import mongokit from paste.deploy.converters import asint from mediagoblin.db.mongo import models +from mediagoblin.db.util import MigrationManager def connect_database_from_config(app_config, use_pymongo=False): @@ -53,3 +54,25 @@ def setup_connection_and_db_from_config(app_config, use_pymongo=False): models.register_models(connection) return (connection, db) + + +def check_db_migrations_current(db): + # This MUST be imported so as to set up the appropriate migrations! + from mediagoblin.db.mongo import migrations + + # Init the migration number if necessary + migration_manager = MigrationManager(db) + migration_manager.install_migration_version_if_missing() + + # Tiny hack to warn user if our migration is out of date + if not migration_manager.database_at_latest_migration(): + db_migration_num = migration_manager.database_current_migration() + latest_migration_num = migration_manager.latest_migration() + if db_migration_num < latest_migration_num: + print ( + "*WARNING:* Your migrations are out of date, " + "maybe run ./bin/gmg migrate?") + elif db_migration_num > latest_migration_num: + print ( + "*WARNING:* Your migrations are out of date... " + "in fact they appear to be from the future?!") diff --git a/mediagoblin/db/open.py b/mediagoblin/db/open.py index a92a6ada..32827fcb 100644 --- a/mediagoblin/db/open.py +++ b/mediagoblin/db/open.py @@ -14,4 +14,5 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from mediagoblin.db.mongo.open import setup_connection_and_db_from_config +from mediagoblin.db.mongo.open import \ + setup_connection_and_db_from_config, check_db_migrations_current diff --git a/mediagoblin/db/sql/open.py b/mediagoblin/db/sql/open.py index 57feaf50..c682bd3b 100644 --- a/mediagoblin/db/sql/open.py +++ b/mediagoblin/db/sql/open.py @@ -27,3 +27,7 @@ def setup_connection_and_db_from_config(app_config): Session.configure(bind=engine) return "dummy conn", DatabaseMaster(engine) + + +def check_db_migrations_current(db): + pass diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index 5f7f83d4..23c1c26d 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -23,8 +23,8 @@ from mediagoblin.init.config import ( read_mediagoblin_config, generate_validation_report) from mediagoblin import mg_globals from mediagoblin.mg_globals import setup_globals -from mediagoblin.db.open import setup_connection_and_db_from_config -from mediagoblin.db.util import MigrationManager +from mediagoblin.db.open import setup_connection_and_db_from_config, \ + check_db_migrations_current from mediagoblin.workbench import WorkbenchManager from mediagoblin.storage import storage_system_from_config @@ -56,28 +56,10 @@ def setup_global_and_app_config(config_path): def setup_database(): app_config = mg_globals.app_config - # This MUST be imported so as to set up the appropriate migrations! - from mediagoblin.db.mongo import migrations - # Set up the database connection, db = setup_connection_and_db_from_config(app_config) - # Init the migration number if necessary - migration_manager = MigrationManager(db) - migration_manager.install_migration_version_if_missing() - - # Tiny hack to warn user if our migration is out of date - if not migration_manager.database_at_latest_migration(): - db_migration_num = migration_manager.database_current_migration() - latest_migration_num = migration_manager.latest_migration() - if db_migration_num < latest_migration_num: - print ( - "*WARNING:* Your migrations are out of date, " - "maybe run ./bin/gmg migrate?") - elif db_migration_num > latest_migration_num: - print ( - "*WARNING:* Your migrations are out of date... " - "in fact they appear to be from the future?!") + check_db_migrations_current(db) setup_globals( db_connection=connection, -- cgit v1.2.3 From d8db95e4b72ae30c368aeba41993004b95bc7412 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 1 Jan 2012 19:00:56 +0100 Subject: Remove fp_email_sent.html and refs to it --- mediagoblin/auth/routing.py | 4 ---- .../templates/mediagoblin/auth/fp_email_sent.html | 28 ---------------------- 2 files changed, 32 deletions(-) delete mode 100644 mediagoblin/templates/mediagoblin/auth/fp_email_sent.html diff --git a/mediagoblin/auth/routing.py b/mediagoblin/auth/routing.py index 365ccfaa..699ecbe1 100644 --- a/mediagoblin/auth/routing.py +++ b/mediagoblin/auth/routing.py @@ -39,8 +39,4 @@ auth_routes = [ Route('mediagoblin.auth.fp_changed_success', '/forgot_password/changed_success/', template='mediagoblin/auth/fp_changed_success.html', - controller='mediagoblin.views:simple_template_render'), - Route('mediagoblin.auth.fp_email_sent', - '/forgot_password/email_sent/', - template='mediagoblin/auth/fp_email_sent.html', controller='mediagoblin.views:simple_template_render')] diff --git a/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html b/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html deleted file mode 100644 index 69aac6b3..00000000 --- a/mediagoblin/templates/mediagoblin/auth/fp_email_sent.html +++ /dev/null @@ -1,28 +0,0 @@ -{# -# 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 . -#} -{% extends "mediagoblin/base.html" %} - -{% block mediagoblin_content %} -

    - {% trans -%} - Check your inbox. We sent an email with a URL for changing your password. - {%- endtrans %} -

    - -{% endblock %} - -- cgit v1.2.3 From 35149b11247846506b31ef3cd6647b659b18f352 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 1 Jan 2012 19:13:23 +0100 Subject: Remove fp_changed_success.html, use log in page + notification message instead --- mediagoblin/auth/routing.py | 6 +---- mediagoblin/auth/views.py | 6 ++++- .../mediagoblin/auth/fp_changed_success.html | 27 ---------------------- 3 files changed, 6 insertions(+), 33 deletions(-) delete mode 100644 mediagoblin/templates/mediagoblin/auth/fp_changed_success.html diff --git a/mediagoblin/auth/routing.py b/mediagoblin/auth/routing.py index 699ecbe1..ea9388c5 100644 --- a/mediagoblin/auth/routing.py +++ b/mediagoblin/auth/routing.py @@ -35,8 +35,4 @@ auth_routes = [ controller='mediagoblin.auth.views:forgot_password'), Route('mediagoblin.auth.verify_forgot_password', '/forgot_password/verify/', - controller='mediagoblin.auth.views:verify_forgot_password'), - Route('mediagoblin.auth.fp_changed_success', - '/forgot_password/changed_success/', - template='mediagoblin/auth/fp_changed_success.html', - controller='mediagoblin.views:simple_template_render')] + controller='mediagoblin.auth.views:verify_forgot_password')] diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index f707ecbe..88dc40ad 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -324,7 +324,11 @@ def verify_forgot_password(request): user.fp_token_expire = None user.save() - return redirect(request, 'mediagoblin.auth.fp_changed_success') + messages.add_message( + request, + messages.INFO, + _("You can now log in using your new password.")) + return redirect(request, 'mediagoblin.auth.login') else: return render_to_response( request, diff --git a/mediagoblin/templates/mediagoblin/auth/fp_changed_success.html b/mediagoblin/templates/mediagoblin/auth/fp_changed_success.html deleted file mode 100644 index 7cea312d..00000000 --- a/mediagoblin/templates/mediagoblin/auth/fp_changed_success.html +++ /dev/null @@ -1,27 +0,0 @@ -{# -# 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 . -#} -{% extends "mediagoblin/base.html" %} - -{% block mediagoblin_content %} -

    - {% trans -%} - Your password has been changed. Try to log in now. - {%- endtrans %} -

    -{% endblock %} - -- cgit v1.2.3 From 445d811043c5cb8b801b91604da6e3967d7ba3b7 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 1 Jan 2012 19:20:38 +0100 Subject: Fix unit tests for new forget password flow After changing the password, the login page is now shown. It contains a message. (we can't test for that easily currently. There is a bug open on this problem.) At least for the login page being shown now. --- mediagoblin/tests/test_auth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/tests/test_auth.py b/mediagoblin/tests/test_auth.py index e54ffa5a..411b4539 100644 --- a/mediagoblin/tests/test_auth.py +++ b/mediagoblin/tests/test_auth.py @@ -291,7 +291,7 @@ def test_register_views(test_app): 'token': parsed_get_params['token']}) response.follow() assert template.TEMPLATE_TEST_CONTEXT.has_key( - 'mediagoblin/auth/fp_changed_success.html') + 'mediagoblin/auth/login.html') ## Verify step 2.2 of password-change works -- login w/ new password success template.clear_test_template_context() -- cgit v1.2.3 From ada0642e5a619a3dce4050db535eb065e0cdc798 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 1 Jan 2012 22:58:32 +0100 Subject: Seperate jQuery bit that was still in media.html --- mediagoblin/static/js/comment_show.js | 9 +++++++++ mediagoblin/templates/mediagoblin/user_pages/media.html | 13 ++----------- 2 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 mediagoblin/static/js/comment_show.js diff --git a/mediagoblin/static/js/comment_show.js b/mediagoblin/static/js/comment_show.js new file mode 100644 index 00000000..2212b9ad --- /dev/null +++ b/mediagoblin/static/js/comment_show.js @@ -0,0 +1,9 @@ +$(document).ready(function(){ + $('#form_comment').hide(); + $('#button_addcomment').click(function(){ + $(this).fadeOut('fast'); + $('#form_comment').slideDown(function(){ + $('#comment_content').focus(); + }); + }); +}); diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 4c255112..ca650f63 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -23,17 +23,8 @@ {% block title %}{{ media.title }} — {{ super() }}{% endblock %} {% block mediagoblin_head %} - + {% endblock mediagoblin_head %} {% block mediagoblin_content %} -- cgit v1.2.3 From 010fe2d71bf8b1c47c12234466d759561df18355 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 24 Dec 2011 15:55:33 +0100 Subject: sql convert: Use more library functions 1. Use the new setup_connection_and_db_from_config in the sql backend. 2. Use sql and mongo specific functions wherever appropiate instead of the generic "db.X" one. This makes the converter more indepedent of the current backend choice. --- mediagoblin/db/sql/convert.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py index c6bed1e9..6698b767 100644 --- a/mediagoblin/db/sql/convert.py +++ b/mediagoblin/db/sql/convert.py @@ -1,13 +1,12 @@ -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker - from mediagoblin.init import setup_global_and_app_config, setup_database -from mediagoblin.db.util import ObjectId +from mediagoblin.db.mongo.util import ObjectId from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment, Tag, MediaTag) - -# Session = sessionmaker() +from mediagoblin.db.sql.open import setup_connection_and_db_from_config as \ + sql_connect +from mediagoblin.db.mongo.open import setup_connection_and_db_from_config as \ + mongo_connect from mediagoblin.db.sql.base import Session @@ -125,14 +124,13 @@ def convert_media_comments(mk_db): def main(): - engine = create_engine('sqlite:///mediagoblin.db', echo=True) - Session.configure(bind=engine) + global_config, app_config = setup_global_and_app_config("mediagoblin.ini") - setup_global_and_app_config("mediagoblin.ini") + sql_conn, sql_db = sql_connect({'sql_engine': 'sqlite:///mediagoblin.db'}) - mk_conn, mk_db = setup_database() + mk_conn, mk_db = mongo_connect(app_config) - Base.metadata.create_all(engine) + Base.metadata.create_all(sql_db.engine) convert_users(mk_db) Session.remove() -- cgit v1.2.3 From 228c4470f40d66e8b9383321d44d89e2a1c0ecad Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 4 Jan 2012 11:57:08 +0100 Subject: Dot-Notation for MediaEntry.media_files --- mediagoblin/gmg_commands/import_export.py | 4 ++-- mediagoblin/media_types/video/processing.py | 6 +++--- mediagoblin/templates/mediagoblin/edit/attachments.html | 2 +- mediagoblin/templates/mediagoblin/edit/edit.html | 2 +- mediagoblin/templates/mediagoblin/media_displays/ascii.html | 4 ++-- mediagoblin/templates/mediagoblin/media_displays/video.html | 4 ++-- mediagoblin/templates/mediagoblin/user_pages/media.html | 4 ++-- .../templates/mediagoblin/user_pages/media_confirm_delete.html | 2 +- mediagoblin/templates/mediagoblin/utils/object_gallery.html | 2 +- mediagoblin/tools/files.py | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/mediagoblin/gmg_commands/import_export.py b/mediagoblin/gmg_commands/import_export.py index eda41f4c..7f699429 100644 --- a/mediagoblin/gmg_commands/import_export.py +++ b/mediagoblin/gmg_commands/import_export.py @@ -65,7 +65,7 @@ def _import_media(db, args): args._cache_path['queue']) for entry in db.MediaEntry.find(): - for name, path in entry['media_files'].items(): + for name, path in entry.media_files.items(): _log.info('Importing: {0} - {1}'.format( entry.title, name)) @@ -207,7 +207,7 @@ def _export_media(db, args): args._cache_path['queue']) for entry in db.MediaEntry.find(): - for name, path in entry['media_files'].items(): + for name, path in entry.media_files.items(): _log.info(u'Exporting {0} - {1}'.format( entry.title, name)) diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index 7d261226..c260cfd6 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -74,7 +74,7 @@ def process_video(entry): tmp_dst.read()) _log.debug('Saved medium') - entry['media_files']['webm_640'] = medium_filepath + entry.media_files['webm_640'] = medium_filepath # Save the width and height of the transcoded video entry.media_data['video'] = { @@ -94,7 +94,7 @@ def process_video(entry): tmp_thumb.read()) _log.debug('Saved thumbnail') - entry['media_files']['thumb'] = thumbnail_filepath + entry.media_files['thumb'] = thumbnail_filepath if video_config['keep_original']: # Push original file to public storage @@ -111,7 +111,7 @@ def process_video(entry): original_file.write(queued_file.read()) _log.debug('Saved original') - entry['media_files']['original'] = original_filepath + entry.media_files['original'] = original_filepath mgg.queue_store.delete_file(queued_filepath) diff --git a/mediagoblin/templates/mediagoblin/edit/attachments.html b/mediagoblin/templates/mediagoblin/edit/attachments.html index 124d0313..06062cd3 100644 --- a/mediagoblin/templates/mediagoblin/edit/attachments.html +++ b/mediagoblin/templates/mediagoblin/edit/attachments.html @@ -27,7 +27,7 @@

    Editing attachments for {{ media.title }}

    + media.media_files['thumb']) }}" />
    {% if media.attachment_files|count %} diff --git a/mediagoblin/templates/mediagoblin/edit/edit.html b/mediagoblin/templates/mediagoblin/edit/edit.html index 2dfaddc8..024a2b4d 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit.html +++ b/mediagoblin/templates/mediagoblin/edit/edit.html @@ -29,7 +29,7 @@

    {% trans media_title=media.title %}Editing {{ media_title }}{% endtrans %}

    + media.media_files['thumb']) }}" />
    {{ wtforms_util.render_divs(form) }}
    diff --git a/mediagoblin/templates/mediagoblin/media_displays/ascii.html b/mediagoblin/templates/mediagoblin/media_displays/ascii.html index 9e77066a..6b40bf08 100644 --- a/mediagoblin/templates/mediagoblin/media_displays/ascii.html +++ b/mediagoblin/templates/mediagoblin/media_displays/ascii.html @@ -23,14 +23,14 @@
           {%- autoescape False -%}
           {{- request.app.public_store.get_file(
    -             media['media_files']['unicode']).read()|string -}}
    +             media.media_files['unicode']).read()|string -}}
           {%- endautoescape -%}
         
    {% if 'original' in media.media_files %}

    + media.media_files['original']) }}"> {%- trans -%} Original {%- endtrans -%} diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html index fc08f963..6b5e7a0e 100644 --- a/mediagoblin/templates/mediagoblin/media_displays/video.html +++ b/mediagoblin/templates/mediagoblin/media_displays/video.html @@ -27,7 +27,7 @@ preload="auto" data-setup="">

    {%- trans -%}Sorry, this video will not work because @@ -42,7 +42,7 @@ {% if 'original' in media.media_files %}

    + media.media_files['original']) }}"> {%- trans -%} Original {%- endtrans -%} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index ca650f63..d52f544f 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -36,9 +36,9 @@ {# if there's a medium file size, that means the medium size # isn't the original... so link to the original! #} - {% if media['media_files'].has_key('medium') %} + {% if media.media_files.has_key('medium') %} + media.media_files['original']) }}"> Image for {{ media.title }} diff --git a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html index 6c483769..408bca05 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html @@ -34,7 +34,7 @@


    diff --git a/mediagoblin/templates/mediagoblin/utils/object_gallery.html b/mediagoblin/templates/mediagoblin/utils/object_gallery.html index b8155f03..5f628dc7 100644 --- a/mediagoblin/templates/mediagoblin/utils/object_gallery.html +++ b/mediagoblin/templates/mediagoblin/utils/object_gallery.html @@ -31,7 +31,7 @@ {%- elif loop.last %} thumb_entry_last{% endif %}">
    + entry.media_files['thumb']) }}" /> {% if entry.title %}
    diff --git a/mediagoblin/tools/files.py b/mediagoblin/tools/files.py index e0bf0569..10f1d994 100644 --- a/mediagoblin/tools/files.py +++ b/mediagoblin/tools/files.py @@ -23,7 +23,7 @@ def delete_media_files(media): Arguments: - media: A MediaEntry document """ - for listpath in media['media_files'].itervalues(): + for listpath in media.media_files.itervalues(): mg_globals.public_store.delete_file( listpath) -- cgit v1.2.3 From 049284b1da87c1fcb21a8b5585890364eb8e0735 Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 13 Dec 2011 10:49:51 +0100 Subject: Dot-Notation for MediaEntry.state --- mediagoblin/processing.py | 2 +- mediagoblin/tests/test_submission.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mediagoblin/processing.py b/mediagoblin/processing.py index 7dd5cc7d..cbac8030 100644 --- a/mediagoblin/processing.py +++ b/mediagoblin/processing.py @@ -64,7 +64,7 @@ class ProcessMedia(Task): except ImportError, exc: mark_entry_failed(entry[u'_id'], exc) - entry['state'] = u'processed' + entry.state = u'processed' entry.save() def on_failure(self, exc, task_id, args, kwargs, einfo): diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py index 4a0543a8..2b17c515 100644 --- a/mediagoblin/tests/test_submission.py +++ b/mediagoblin/tests/test_submission.py @@ -240,7 +240,7 @@ class TestSubmission: entry = mg_globals.database.MediaEntry.find_one( {'title': 'Malicious Upload 2'}) - assert_equal(entry['state'], 'failed') + assert_equal(entry.state, 'failed') assert_equal( entry['fail_error'], u'mediagoblin.processing:BadMediaFail') @@ -260,7 +260,7 @@ class TestSubmission: entry = mg_globals.database.MediaEntry.find_one( {'title': 'Malicious Upload 3'}) - assert_equal(entry['state'], 'failed') + assert_equal(entry.state, 'failed') assert_equal( entry['fail_error'], u'mediagoblin.processing:BadMediaFail') -- cgit v1.2.3 From 8545cfc97d9336b100881bd3ebafd4a5f4882dd3 Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 13 Dec 2011 11:18:39 +0100 Subject: Dot-Notation for MediaEntry.queued_media_file --- mediagoblin/media_types/image/processing.py | 4 ++-- mediagoblin/media_types/video/processing.py | 2 +- mediagoblin/submit/views.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py index e493eb2b..cf90388f 100644 --- a/mediagoblin/media_types/image/processing.py +++ b/mediagoblin/media_types/image/processing.py @@ -37,7 +37,7 @@ def process_image(entry): workbench.dir, 'conversions') os.mkdir(conversions_subdir) - queued_filepath = entry['queued_media_file'] + queued_filepath = entry.queued_media_file queued_filename = workbench.localized_file( mgg.queue_store, queued_filepath, 'source') @@ -98,7 +98,7 @@ def process_image(entry): original_file.write(queued_file.read()) mgg.queue_store.delete_file(queued_filepath) - entry['queued_media_file'] = [] + entry.queued_media_file = [] media_files_dict = entry.setdefault('media_files', {}) media_files_dict['thumb'] = thumb_filepath media_files_dict['original'] = original_filepath diff --git a/mediagoblin/media_types/video/processing.py b/mediagoblin/media_types/video/processing.py index c260cfd6..49a50647 100644 --- a/mediagoblin/media_types/video/processing.py +++ b/mediagoblin/media_types/video/processing.py @@ -45,7 +45,7 @@ def process_video(entry): workbench = mgg.workbench_manager.create_workbench() - queued_filepath = entry['queued_media_file'] + queued_filepath = entry.queued_media_file queued_filename = workbench.localized_file( mgg.queue_store, queued_filepath, 'source') diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index 60693bd6..dd273c7f 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -89,7 +89,7 @@ def submit_start(request): queue_file.write(request.POST['file'].file.read()) # Add queued filename to the entry - entry['queued_media_file'] = queue_filepath + entry.queued_media_file = queue_filepath # We generate this ourselves so we know what the taks id is for # retrieval later. -- cgit v1.2.3 From 9c196287ad26f52acb38d6c37560848da23151a6 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Wed, 4 Jan 2012 17:48:16 +0100 Subject: Add Markdown for submit page, edit page, profile edit page; thus fixing ticket #690 --- mediagoblin/edit/forms.py | 12 ++++++++++-- mediagoblin/submit/forms.py | 5 ++++- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 +- mediagoblin/templates/mediagoblin/utils/wtforms.html | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index f9cc92bf..406de3f8 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -23,7 +23,11 @@ class EditForm(wtforms.Form): title = wtforms.TextField( _('Title'), [wtforms.validators.Length(min=0, max=500)]) - description = wtforms.TextAreaField('Description of this work') + description = wtforms.TextAreaField( + _('Description of this work'), + description=_("""You can use + + Markdown for formatting.""")) tags = wtforms.TextField( _('Tags'), [tag_length_validator], @@ -40,7 +44,11 @@ class EditForm(wtforms.Form): class EditProfileForm(wtforms.Form): bio = wtforms.TextAreaField( _('Bio'), - [wtforms.validators.Length(min=0, max=500)]) + [wtforms.validators.Length(min=0, max=500)], + description=_( + """You can use + + Markdown for formatting.""")) url = wtforms.TextField( _('Website'), [wtforms.validators.Optional(), diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py index e21b00ee..7ef3638f 100644 --- a/mediagoblin/submit/forms.py +++ b/mediagoblin/submit/forms.py @@ -27,7 +27,10 @@ class SubmitStartForm(wtforms.Form): _('Title'), [wtforms.validators.Length(min=0, max=500)]) description = wtforms.TextAreaField( - _('Description of this work')) + _('Description of this work'), + description=_("""You can use + + Markdown for formatting.""")) tags = wtforms.TextField( _('Tags'), [tag_length_validator], diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index d52f544f..9b331789 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -96,7 +96,7 @@ user= media.get_uploader.username, media=media._id) }}" method="POST" id="form_comment">

    - {% trans %}Type your comment here. You can use Markdown for formatting.{% endtrans %} + {% trans %}Type your comment here. You can use Markdown for formatting.{% endtrans %}

    {{ wtforms_util.render_divs(comment_form) }}
    diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html index cc30388f..3517b5c3 100644 --- a/mediagoblin/templates/mediagoblin/utils/wtforms.html +++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html @@ -29,7 +29,7 @@ {% endfor %} {%- endif %} {% if field.description -%} -

    {{ _(field.description) }}

    +

    {{ _(field.description)|safe }}

    {%- endif %}
    {%- endmacro %} -- cgit v1.2.3 From 6a59a8abd49d921c2316fb4bd4cddf55a322b2fb Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 2 Jan 2012 16:02:02 +0100 Subject: Import MigrationManager from mongo in mongo backend. Inside the mongo db backend, use the mongo MigrationManager. This is hopefully the last reference to the generic MigrationManager reference on db.util. --- mediagoblin/db/mongo/open.py | 2 +- mediagoblin/db/util.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/db/mongo/open.py b/mediagoblin/db/mongo/open.py index 8016ced9..48c909d9 100644 --- a/mediagoblin/db/mongo/open.py +++ b/mediagoblin/db/mongo/open.py @@ -18,7 +18,7 @@ import pymongo import mongokit from paste.deploy.converters import asint from mediagoblin.db.mongo import models -from mediagoblin.db.util import MigrationManager +from mediagoblin.db.mongo.util import MigrationManager def connect_database_from_config(app_config, use_pymongo=False): diff --git a/mediagoblin/db/util.py b/mediagoblin/db/util.py index 3fd96a1d..1df9494c 100644 --- a/mediagoblin/db/util.py +++ b/mediagoblin/db/util.py @@ -14,5 +14,5 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from mediagoblin.db.mongo.util import (MigrationManager, ObjectId, InvalidId, +from mediagoblin.db.mongo.util import (ObjectId, InvalidId, DESCENDING) -- cgit v1.2.3 From f1cdd278e7cf195e485567ed0d0d8a90cad81e48 Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 4 Jan 2012 23:48:55 +0100 Subject: f691: Use StrictUndefined for templates and fix some issues References to undefined variables in templates were silently ignored/converted to None/empty strings. This makes coding lazy stuff easy, but it makes catching typos harder. (It would have catched one of the SQL things earlier!) But on the other hand it might make the current templates error out everywhere. In fact, early testing has shown two instances, that errored out. Those are fixed with this commit too. If this turns out to make things more complex and useless than actually solving any problems, it can easily be dropped again. --- mediagoblin/templates/mediagoblin/user_pages/media.html | 5 +++-- mediagoblin/templates/mediagoblin/user_pages/user.html | 3 ++- mediagoblin/tools/template.py | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 9b331789..4b5c9337 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -60,8 +60,9 @@ {% trans date=media.created.strftime("%Y-%m-%d") -%} Added on {{ date }}. {%- endtrans %} - {% if media['uploader'] == request.user._id or - request.user['is_admin'] %} + {% if request.user and + (media.uploader == request.user._id or + request.user.is_admin) %} {% set edit_url = request.urlgen('mediagoblin.edit.edit_media', user= media.get_uploader.username, media= media._id) %} diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index b952e88c..78bbaf8c 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -113,7 +113,8 @@ {% else %}
    {% include "mediagoblin/utils/profile.html" %} - {% if request.user._id == user._id or request.user.is_admin %} + {% if request.user and + (request.user._id == user._id or request.user.is_admin) %} {%- trans %}Edit profile{% endtrans -%} diff --git a/mediagoblin/tools/template.py b/mediagoblin/tools/template.py index d0400347..54a40de6 100644 --- a/mediagoblin/tools/template.py +++ b/mediagoblin/tools/template.py @@ -41,8 +41,11 @@ def get_jinja_env(template_loader, locale): if SETUP_JINJA_ENVS.has_key(locale): return SETUP_JINJA_ENVS[locale] + # jinja2.StrictUndefined will give exceptions on references + # to undefined/unknown variables in templates. template_env = jinja2.Environment( loader=template_loader, autoescape=True, + undefined=jinja2.StrictUndefined, extensions=['jinja2.ext.i18n', 'jinja2.ext.autoescape']) template_env.install_gettext_callables( -- cgit v1.2.3 From c8071fa591ad148fbffdabc4d6dd71f5666c2172 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 5 Jan 2012 00:17:45 +0100 Subject: Create edit_account.html --- mediagoblin/edit/forms.py | 23 ++++++----- mediagoblin/edit/routing.py | 5 ++- mediagoblin/edit/views.py | 40 +++++++++++++++---- .../templates/mediagoblin/edit/edit_account.html | 45 ++++++++++++++++++++++ 4 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 mediagoblin/templates/mediagoblin/edit/edit_account.html diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index 406de3f8..df219011 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -37,7 +37,7 @@ class EditForm(wtforms.Form): _('Slug'), [wtforms.validators.Required(message=_("The slug can't be empty"))], description=_( - "The title part of this media's URL. " + "The title part of this media's address. " "You usually don't need to change this.")) @@ -52,20 +52,19 @@ class EditProfileForm(wtforms.Form): url = wtforms.TextField( _('Website'), [wtforms.validators.Optional(), - wtforms.validators.URL(message='Improperly formed URL')]) + wtforms.validators.URL(message="""This address contains errors""")]) + + +class EditAccountForm(wtforms.Form): old_password = wtforms.PasswordField( _('Old password'), - [wtforms.validators.Optional()]) + [wtforms.validators.Required()], + description=_( + "Enter your old password to prove you own this account.")) new_password = wtforms.PasswordField( - _('New Password'), - [wtforms.validators.Optional(), - wtforms.validators.Length(min=6, max=30), - wtforms.validators.EqualTo( - 'confirm_password', - 'Passwords must match.')]) - confirm_password = wtforms.PasswordField( - 'Confirm password', - [wtforms.validators.Optional()]) + _('New password'), + [wtforms.validators.Required(), + wtforms.validators.Length(min=6, max=30)]) class EditAttachmentsForm(wtforms.Form): diff --git a/mediagoblin/edit/routing.py b/mediagoblin/edit/routing.py index 34e9fd80..5216f7ca 100644 --- a/mediagoblin/edit/routing.py +++ b/mediagoblin/edit/routing.py @@ -20,4 +20,7 @@ from routes.route import Route edit_routes = [ # Media editing view handled in user_pages/routing.py Route('mediagoblin.edit.profile', '/profile/', - controller="mediagoblin.edit.views:edit_profile")] + controller="mediagoblin.edit.views:edit_profile"), + Route('mediagoblin.edit.account', '/account/', + controller="mediagoblin.edit.views:edit_account") + ] diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 4cb98c15..bae85c5d 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -161,6 +161,35 @@ def edit_profile(request): url=user.get('url'), bio=user.get('bio')) + if request.method == 'POST' and form.validate(): + user.url = unicode(request.POST['url']) + user.bio = unicode(request.POST['bio']) + + user.bio_html = cleaned_markdown_conversion(user['bio']) + + user.save() + + messages.add_message(request, + messages.SUCCESS, + _("Profile changes saved")) + return redirect(request, + 'mediagoblin.user_pages.user_home', + user=user['username']) + + return render_to_response( + request, + 'mediagoblin/edit/edit_profile.html', + {'user': user, + 'form': form}) + + +@require_active_login +def edit_account(request): + edit_username = request.GET.get('username') + user = request.user + + form = forms.EditAccountForm(request.POST) + if request.method == 'POST' and form.validate(): password_matches = auth_lib.bcrypt_check_password( request.POST['old_password'], @@ -172,30 +201,25 @@ def edit_profile(request): return render_to_response( request, - 'mediagoblin/edit/edit_profile.html', + 'mediagoblin/edit/edit_account.html', {'user': user, 'form': form}) - user.url = unicode(request.POST['url']) - user.bio = unicode(request.POST['bio']) - if password_matches: user['pw_hash'] = auth_lib.bcrypt_gen_password_hash( request.POST['new_password']) - user.bio_html = cleaned_markdown_conversion(user['bio']) - user.save() messages.add_message(request, messages.SUCCESS, - _("Profile edited!")) + _("Account settings saved")) return redirect(request, 'mediagoblin.user_pages.user_home', user=user['username']) return render_to_response( request, - 'mediagoblin/edit/edit_profile.html', + 'mediagoblin/edit/edit_account.html', {'user': user, 'form': form}) diff --git a/mediagoblin/templates/mediagoblin/edit/edit_account.html b/mediagoblin/templates/mediagoblin/edit/edit_account.html new file mode 100644 index 00000000..0a564161 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/edit/edit_account.html @@ -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 . +#} +{% extends "mediagoblin/base.html" %} + +{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %} + +{% block mediagoblin_head %} + +{% endblock mediagoblin_head %} + +{% block mediagoblin_content %} + + +
    +

    + {%- trans username=user.username -%} + Changing {{ username }}'s account settings + {%- endtrans %} +

    + {{ wtforms_util.render_divs(form) }} +
    + + {{ csrf_token }} +
    +
    + +{% endblock %} -- cgit v1.2.3 From 1c53f98c09a5ccd7acd320be8230d8980fc77dea Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 5 Jan 2012 00:18:29 +0100 Subject: Add change-account-settings link to user.html --- mediagoblin/templates/mediagoblin/user_pages/user.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index 78bbaf8c..c93db8b0 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -120,6 +120,11 @@ {%- trans %}Edit profile{% endtrans -%}
    {% endif %} + {% if request.user._id == user._id %} + + {%- trans %}Change account settings{% endtrans -%} + + {% endif %}
    {% endif %} -- cgit v1.2.3 From 4a24500aa43fcf5bca59c12049af34b7935977a0 Mon Sep 17 00:00:00 2001 From: Elrond Date: Thu, 5 Jan 2012 14:46:27 +0100 Subject: Fix more StrictUndefined issues --- mediagoblin/templates/mediagoblin/user_pages/user.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index c93db8b0..6b5c2b21 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -90,7 +90,7 @@

    {% if not user.url and not user.bio %} - {% if request.user._id == user._id %} + {% if request.user and (request.user._id == user._id) %}

    {% trans %}Here's a spot to tell others about yourself.{% endtrans %} @@ -120,7 +120,7 @@ {%- trans %}Edit profile{% endtrans -%} {% endif %} - {% if request.user._id == user._id %} + {% if request.user and (request.user._id == user._id) %} {%- trans %}Change account settings{% endtrans -%} -- cgit v1.2.3 From 49af00e491a7ec6b920a3780254f2203ae47fbe5 Mon Sep 17 00:00:00 2001 From: Elrond Date: Thu, 5 Jan 2012 14:47:15 +0100 Subject: Make show-password-js work for change password too The show password js depends on the password field to have an id of "password". So give it a proper id. Also fixed the label generation for the case of field.name and field.id being different. --- mediagoblin/edit/forms.py | 3 ++- mediagoblin/templates/mediagoblin/utils/wtforms.html | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index df219011..09955874 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -64,7 +64,8 @@ class EditAccountForm(wtforms.Form): new_password = wtforms.PasswordField( _('New password'), [wtforms.validators.Required(), - wtforms.validators.Length(min=6, max=30)]) + wtforms.validators.Length(min=6, max=30)], + id="password") class EditAttachmentsForm(wtforms.Form): diff --git a/mediagoblin/templates/mediagoblin/utils/wtforms.html b/mediagoblin/templates/mediagoblin/utils/wtforms.html index 3517b5c3..44b27bb8 100644 --- a/mediagoblin/templates/mediagoblin/utils/wtforms.html +++ b/mediagoblin/templates/mediagoblin/utils/wtforms.html @@ -19,7 +19,7 @@ {# Generically render a field #} {% macro render_field_div(field) %} {% if field.label.text -%} -

    +

    {%- endif %}
    {{ field }} -- cgit v1.2.3 From b48abba3036bb08ad05c469bc37481cc16420ed8 Mon Sep 17 00:00:00 2001 From: Elrond Date: Thu, 5 Jan 2012 14:54:03 +0100 Subject: Fix Unit Tests for new password changing --- mediagoblin/tests/test_edit.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/mediagoblin/tests/test_edit.py b/mediagoblin/tests/test_edit.py index 0cf71e9b..55f34b42 100644 --- a/mediagoblin/tests/test_edit.py +++ b/mediagoblin/tests/test_edit.py @@ -34,12 +34,10 @@ def test_change_password(test_app): # test that the password can be changed # template.clear_test_template_context() test_app.post( - '/edit/profile/', { - 'bio': u'', - 'url': u'', + '/edit/account/', { 'old_password': 'toast', 'new_password': '123456', - 'confirm_password': '123456'}) + }) # test_user has to be fetched again in order to have the current values test_user = mg_globals.database.User.one({'username': 'chris'}) @@ -50,12 +48,10 @@ def test_change_password(test_app): # is wrong # template.clear_test_template_context() test_app.post( - '/edit/profile/', { - 'bio': u'', - 'url': u'', + '/edit/account/', { 'old_password': 'toast', 'new_password': '098765', - 'confirm_password': '098765'}) + }) test_user = mg_globals.database.User.one({'username': 'chris'}) -- cgit v1.2.3 From 34b4090cbf1f6ea62b9127f0ac96e748ad22b668 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 5 Jan 2012 15:58:03 +0100 Subject: Always show 'Change account settings' link --- mediagoblin/templates/mediagoblin/user_pages/user.html | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index 6b5c2b21..a50849b0 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -100,7 +100,6 @@ class="button_action"> {%- trans %}Edit profile{% endtrans -%} -
    {% else %}

    @@ -108,7 +107,6 @@ This user hasn't filled in their profile (yet). {%- endtrans %}

    -
    {% endif %} {% else %}
    @@ -120,11 +118,12 @@ {%- trans %}Edit profile{% endtrans -%} {% endif %} - {% if request.user and (request.user._id == user._id) %} - - {%- trans %}Change account settings{% endtrans -%} - - {% endif %} + {% endif %} + + {% if request.user and (request.user._id == user._id) %} + + {%- trans %}Change account settings{% endtrans -%} +
    {% endif %} -- cgit v1.2.3 From 7df9f45c32d7fd2ae5ae6c137ebf96437f764323 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 5 Jan 2012 21:36:24 +0100 Subject: Several changes for mobile layout --- mediagoblin/static/css/base.css | 32 ++++++++--------------------- mediagoblin/templates/mediagoblin/base.html | 1 + mediagoblin/templates/mediagoblin/root.html | 2 +- 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 8ed94e36..e89ce8a2 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -85,18 +85,14 @@ input, textarea { /* website structure */ .mediagoblin_body { - position: relative; - min-height: 100%; - margin-left: auto; - margin-right: auto; - width: 960px; + margin: auto; + width: 96%; + max-width: 960px; } .mediagoblin_header { width: 100%; height: 36px; - margin-left: 10px; - margin-right: 10px; padding-top: 14px; margin-bottom: 20px; border-bottom: 1px solid #333; @@ -118,16 +114,12 @@ a.mediagoblin_logo { .mediagoblin_content { width: 100%; - margin-left: 10px; - margin-right: 10px; padding-bottom: 74px; } .mediagoblin_footer { width: 100%; height: 30px; - margin-left: 10px; - margin-right: 10px; border-top: 1px solid #333; bottom: 0px; padding-top: 8px; @@ -253,16 +245,17 @@ text-align: center; background-color: #222; background-image: url("../images/background_lines.png"); background-repeat: repeat-x; - width: 340px; - padding: 30px 60px; - margin-left: auto; - margin-right: auto; + padding: 3% 5%; display: block; float: none; + width: 90%; + max-width: 340px; + margin-left: auto; + margin-right: auto; } .form_box_xl { - width: 460px; + max-width: 460px; } .edit_box { @@ -452,15 +445,8 @@ table.media_panel th { @media screen and (max-width: 960px) { .mediagoblin_body { - width: 100%; } .mediagoblin_footer { - position: fixed; - left: 0px; - top: 100px; - width: 50px; - height: 20px; - background-color: #f00; } } diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 870a4861..f3912752 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -19,6 +19,7 @@ + {% block title %}{{ app_config['html_title'] }}{% endblock %} diff --git a/mediagoblin/templates/mediagoblin/root.html b/mediagoblin/templates/mediagoblin/root.html index 300570ad..3f834572 100644 --- a/mediagoblin/templates/mediagoblin/root.html +++ b/mediagoblin/templates/mediagoblin/root.html @@ -23,8 +23,8 @@ {% if request.user %}

    {% trans %}Explore{% endtrans %}

    {% else %} -

    {% trans %}Hi there, welcome to this MediaGoblin site!{% endtrans %}

    +

    {% trans %}This site is running MediaGoblin, an extraordinarily great piece of media hosting software.{% endtrans %}

    {% trans %}To add your own media, place comments, save your favourites and more, you can log in with your MediaGoblin account.{% endtrans %}

    {% if allow_registration %} -- cgit v1.2.3 From ee0b9ea282cf5d0ee3f8743477ec61e6b408b9da Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 5 Jan 2012 21:52:28 +0100 Subject: Remove last 960.gs leftover; fix classes for edit forms --- mediagoblin/templates/mediagoblin/edit/edit.html | 4 ++-- mediagoblin/templates/mediagoblin/edit/edit_account.html | 2 +- mediagoblin/templates/mediagoblin/edit/edit_profile.html | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/edit/edit.html b/mediagoblin/templates/mediagoblin/edit/edit.html index 14200466..fc6b1605 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit.html +++ b/mediagoblin/templates/mediagoblin/edit/edit.html @@ -25,7 +25,7 @@ user= media.get_uploader.username, media= media._id) }}" method="POST" enctype="multipart/form-data"> -
    +

    {% trans media_title=media.title %}Editing {{ media_title }}{% endtrans %}

    -
    +

    {%- trans username=user.username -%} Changing {{ username }}'s account settings diff --git a/mediagoblin/templates/mediagoblin/edit/edit_profile.html b/mediagoblin/templates/mediagoblin/edit/edit_profile.html index d6461757..97c03e37 100644 --- a/mediagoblin/templates/mediagoblin/edit/edit_profile.html +++ b/mediagoblin/templates/mediagoblin/edit/edit_profile.html @@ -24,7 +24,7 @@
    -
    +

    {%- trans username=user.username -%} Editing {{ username }}'s profile -- cgit v1.2.3 From a91e4e07e716891b95b5f91b86d123fd9a221525 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 5 Jan 2012 22:46:21 +0100 Subject: Add closing bracket so the whole thing doesn't break down --- mediagoblin/static/css/base.css | 1 + 1 file changed, 1 insertion(+) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index f4359791..d8fc86bf 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -237,6 +237,7 @@ textarea#comment_content { border: none; background-color: #f1f1f1; padding: 3px; +} .clear { clear: both; -- cgit v1.2.3 From 7945cd21ba6aa7063fc54bc6f91457a3be65ecb3 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Thu, 5 Jan 2012 23:36:16 +0100 Subject: * Rename mediagoblin_header, mediagoblin_body, mediagoblin_footer, mediagoblin_header_right, mediagoblin_logo * Add html5shiv for older browsers * Small size fix (940px instead of 960pgx) --- extlib/html5shiv/MIT.txt | 20 ++++++++++++++++++++ extlib/html5shiv/html5shiv.js | 3 +++ mediagoblin/static/css/base.css | 14 +++++++------- mediagoblin/static/js/extlib/html5shiv.js | 1 + mediagoblin/templates/mediagoblin/base.html | 24 +++++++++++++----------- 5 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 extlib/html5shiv/MIT.txt create mode 100644 extlib/html5shiv/html5shiv.js create mode 120000 mediagoblin/static/js/extlib/html5shiv.js diff --git a/extlib/html5shiv/MIT.txt b/extlib/html5shiv/MIT.txt new file mode 100644 index 00000000..5a2aeb47 --- /dev/null +++ b/extlib/html5shiv/MIT.txt @@ -0,0 +1,20 @@ +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/extlib/html5shiv/html5shiv.js b/extlib/html5shiv/html5shiv.js new file mode 100644 index 00000000..8de0ff54 --- /dev/null +++ b/extlib/html5shiv/html5shiv.js @@ -0,0 +1,3 @@ +// HTML5 Shiv v3 | @jon_neal @afarkas @rem | MIT/GPL2 Licensed +// Uncompressed source: https://github.com/aFarkas/html5shiv +(function(a,b){var c=function(a){return a.innerHTML="",a.childNodes.length===1}(b.createElement("a")),d=function(a,b,c){return b.appendChild(a),(c=(c?c(a):a.currentStyle).display)&&b.removeChild(a)&&c==="block"}(b.createElement("nav"),b.documentElement,a.getComputedStyle),e={elements:"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),shivDocument:function(a){a=a||b;if(a.documentShived)return;a.documentShived=!0;var f=a.createElement,g=a.createDocumentFragment,h=a.getElementsByTagName("head")[0],i=function(a){f(a)};c||(e.elements.join(" ").replace(/\w+/g,i),a.createElement=function(a){var b=f(a);return b.canHaveChildren&&e.shivDocument(b.document),b},a.createDocumentFragment=function(){return e.shivDocument(g())});if(!d&&h){var j=f("div");j.innerHTML=["x"].join(""),h.insertBefore(j.lastChild,h.firstChild)}return a}};e.shivDocument(b),a.html5=e})(this,document) \ No newline at end of file diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index d8fc86bf..54de5a5b 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -84,13 +84,13 @@ input, textarea { /* website structure */ -.mediagoblin_body { +.container { margin: auto; width: 96%; - max-width: 960px; + max-width: 940px; } -.mediagoblin_header { +header { width: 100%; height: 36px; padding-top: 14px; @@ -98,17 +98,17 @@ input, textarea { border-bottom: 1px solid #333; } -.mediagoblin_header_right { +.header_right { float: right; } -a.mediagoblin_logo { +a.logo { color: #fff; font-weight: bold; margin-right: 8px; } -.mediagoblin_logo img { +.logo img { vertical-align: middle; } @@ -117,7 +117,7 @@ a.mediagoblin_logo { padding-bottom: 74px; } -.mediagoblin_footer { +footer { width: 100%; height: 30px; border-top: 1px solid #333; diff --git a/mediagoblin/static/js/extlib/html5shiv.js b/mediagoblin/static/js/extlib/html5shiv.js new file mode 120000 index 00000000..ca7358c7 --- /dev/null +++ b/mediagoblin/static/js/extlib/html5shiv.js @@ -0,0 +1 @@ +../../../../extlib/html5shiv/html5shiv.js \ No newline at end of file diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index f3912752..82ee41b7 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -29,22 +29,24 @@ href="{{ request.staticdirect('/css/video-js.css') }}"/> - + + {% block mediagoblin_head %} {% endblock mediagoblin_head %} {% block mediagoblin_body %} -
    +
    {% block mediagoblin_header %} -
    +
    {% block mediagoblin_logo %} - - {% endblock %} + {% endblock mediagoblin_logo %} {% if request.user and request.user.status == 'active' %} @@ -52,7 +54,7 @@ {% endif %} {% block mediagoblin_header_title %}{% endblock %} -
    +
    {% if request.user %} {# the following link should only appear when verification is needed #} {% if request.user.status == "needs_email_verification" %} @@ -72,7 +74,7 @@ {% trans %}Log in{% endtrans %} {% endif %}
    -
    +
    {% endblock %}
    {% include "mediagoblin/utils/messages.html" %} @@ -80,12 +82,12 @@ {% endblock mediagoblin_content %}
    {% block mediagoblin_footer %} - - {% endblock %} + + {% endblock mediagoblin_footer %} {% endblock mediagoblin_body %}
    -- cgit v1.2.3 From 173999a7e44aac11c8a2d4a7bf61f709b3822f79 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 6 Jan 2012 13:34:25 +0100 Subject: Resize image below 660px width --- mediagoblin/static/css/base.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 54de5a5b..eac956f1 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -479,3 +479,12 @@ table.media_panel th { font-family: Inconsolata, monospace; line-height: 1em; } + +@media screen and (max-width: 660px) { + .media_pane { + width: 100%; + } + img.media_image { + width: 100%; + } +} -- cgit v1.2.3 From 7646e695bfbfc403deecdf3068abd3b453d6fef0 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 6 Jan 2012 13:44:00 +0100 Subject: Fix div breaking in user.html; add media query bits --- mediagoblin/static/css/base.css | 15 ++++++++++++++- mediagoblin/templates/mediagoblin/user_pages/user.html | 6 +++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index eac956f1..c2d45a1b 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -480,11 +480,24 @@ table.media_panel th { line-height: 1em; } -@media screen and (max-width: 660px) { +/* Media queries and other responsivisivity */ +@media screen and (max-width: 680px) { .media_pane { width: 100%; + margin: 0px; } img.media_image { width: 100%; } } + +@media screen and (max-width: 960px) { + .profile_sidebar { + width: 100%; + margin: 0px; + } + .profile_showcase { + width: 100%; + margin: 0px; + } +} diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index c8eb9026..0937f97a 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -120,12 +120,12 @@ {% endif %} {% endif %} - {% if request.user and (request.user._id == user._id) %} + {% if request.user and (request.user._id == user._id) %} {%- trans %}Change account settings{% endtrans -%} -
    - {% endif %} + {% endif %} +
    {% if media_entries.count() %}
    -- cgit v1.2.3 From b957cba0cb9b6de33f9d50001a381ea94d9de57a Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 6 Jan 2012 19:56:50 +0100 Subject: First push with new style (includes css file, logo image, fonts) --- docs/source/conf.py | 2 +- docs/source/themes/mg/static/fonts/Lato-Bold.ttf | Bin 0 -> 93224 bytes .../themes/mg/static/fonts/Lato-BoldItalic.ttf | Bin 0 -> 81936 bytes docs/source/themes/mg/static/fonts/Lato-Italic.ttf | Bin 0 -> 83680 bytes .../source/themes/mg/static/fonts/Lato-Regular.ttf | Bin 0 -> 96044 bytes docs/source/themes/mg/static/fonts/OFL_1.1.txt | 97 ++++++++++++++ docs/source/themes/mg/static/logo_docs.png | Bin 0 -> 6522 bytes docs/source/themes/mg/static/mg.css | 145 +++++++++++++++++++++ docs/source/themes/mg/theme.conf | 4 +- 9 files changed, 245 insertions(+), 3 deletions(-) create mode 100644 docs/source/themes/mg/static/fonts/Lato-Bold.ttf create mode 100644 docs/source/themes/mg/static/fonts/Lato-BoldItalic.ttf create mode 100644 docs/source/themes/mg/static/fonts/Lato-Italic.ttf create mode 100644 docs/source/themes/mg/static/fonts/Lato-Regular.ttf create mode 100644 docs/source/themes/mg/static/fonts/OFL_1.1.txt create mode 100644 docs/source/themes/mg/static/logo_docs.png create mode 100644 docs/source/themes/mg/static/mg.css diff --git a/docs/source/conf.py b/docs/source/conf.py index dce254a1..3014e592 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -111,7 +111,7 @@ html_theme_path = ['themes'] # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +html_logo = 'logo_docs.png' # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 diff --git a/docs/source/themes/mg/static/fonts/Lato-Bold.ttf b/docs/source/themes/mg/static/fonts/Lato-Bold.ttf new file mode 100644 index 00000000..bc3529fc Binary files /dev/null and b/docs/source/themes/mg/static/fonts/Lato-Bold.ttf differ diff --git a/docs/source/themes/mg/static/fonts/Lato-BoldItalic.ttf b/docs/source/themes/mg/static/fonts/Lato-BoldItalic.ttf new file mode 100644 index 00000000..2cf5ae0d Binary files /dev/null and b/docs/source/themes/mg/static/fonts/Lato-BoldItalic.ttf differ diff --git a/docs/source/themes/mg/static/fonts/Lato-Italic.ttf b/docs/source/themes/mg/static/fonts/Lato-Italic.ttf new file mode 100644 index 00000000..11ca3eb6 Binary files /dev/null and b/docs/source/themes/mg/static/fonts/Lato-Italic.ttf differ diff --git a/docs/source/themes/mg/static/fonts/Lato-Regular.ttf b/docs/source/themes/mg/static/fonts/Lato-Regular.ttf new file mode 100644 index 00000000..26ce1002 Binary files /dev/null and b/docs/source/themes/mg/static/fonts/Lato-Regular.ttf differ diff --git a/docs/source/themes/mg/static/fonts/OFL_1.1.txt b/docs/source/themes/mg/static/fonts/OFL_1.1.txt new file mode 100644 index 00000000..f1a20ac1 --- /dev/null +++ b/docs/source/themes/mg/static/fonts/OFL_1.1.txt @@ -0,0 +1,97 @@ +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (). + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/source/themes/mg/static/logo_docs.png b/docs/source/themes/mg/static/logo_docs.png new file mode 100644 index 00000000..92879965 Binary files /dev/null and b/docs/source/themes/mg/static/logo_docs.png differ diff --git a/docs/source/themes/mg/static/mg.css b/docs/source/themes/mg/static/mg.css new file mode 100644 index 00000000..3a0a1336 --- /dev/null +++ b/docs/source/themes/mg/static/mg.css @@ -0,0 +1,145 @@ +@import url("basic.css"); + +/* text fonts and styles */ + +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 700; + src: local('Lato Bold'), local('Lato-Bold'), url('fonts/Lato-Bold.ttf') format('truetype'); +} +@font-face { + font-family: 'Lato'; + font-style: italic; + font-weight: 400; + src: local('Lato Italic'), local('Lato-Italic'), url('fonts/Lato-Italic.ttf') format('truetype'); +} +@font-face { + font-family: 'Lato'; + font-style: italic; + font-weight: 700; + src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url('fonts/Lato-BoldItalic.ttf') format('truetype'); +} +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: local('Lato Regular'), local('Lato-Regular'), url('fonts/Lato-Regular.ttf') format('truetype'); +} + +body { + font: 16px 'Lato',Helvetica,Arial,sans-serif; + background-color: #FCFCFC; + color: #3C3C3C; + margin: 0; + padding: 0; +} + +h1, h2, h3, h4, h5, h6 { + border-bottom: 1px solid #CCCCCC; + background: none; + color: black; + font-weight: bold; + padding-bottom: 0.17em; + padding-top: 0.5em; +} + +h1 { + font-size: 1.875em; +} + +h2 { + font-size: 1.375em; +} + +h3, h4, h5, h6 { + font-size: 1.125em; +} + +p { + font-weight: normal; + margin: 0.4em 0 0.5em; +} + +a { + color: #499776; +} + +a:visited { + color: #2A5744; +} + +a:active { + color: #65D1A3; +} + +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + text-decoration: none; +} + +div.topic, pre { + background-color: #F1F1F1; + border: 1px dashed #ccc; + color: black; + line-height: 1.1em; + padding: 1em; +} + +code, tt { + font: 14px monospace,"Courier New"; + background-color: #FFFFDD; + border: thin solid #bbb; + padding-left: 5px; + padding-right: 5px; +} + +pre { + font: 14px monospace,"Courier New"; +} + +div.related a, div.related a:visited, div.related a:active { + color: #86D4B1; +} + +/* layout */ + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 60px 0 0 230px; +} + +div.body { + padding: 0 20px 30px 20px; +} + +div.footer { + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 20px; +} + +div.sphinxsidebar ul { + margin: 10px 10px 10px 0; + padding: 0; +} + +div.related { + line-height: 30px; + font-size: 90%; + width: 100%; + background-color: #161616; + color: #C3C3C3; +} + +p.logo { + margin-bottom: 20px; +} diff --git a/docs/source/themes/mg/theme.conf b/docs/source/themes/mg/theme.conf index f4fbd8cc..dd58038a 100644 --- a/docs/source/themes/mg/theme.conf +++ b/docs/source/themes/mg/theme.conf @@ -1,5 +1,5 @@ [theme] -inherit = default -stylesheet = default.css +inherit = basic +stylesheet = mg.css pygments_style = sphinx -- cgit v1.2.3 From 242509239fddf9ebb904dc9c174da522f3bdc8b7 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 6 Jan 2012 23:58:43 +0100 Subject: New docs logo, small css changes --- docs/source/themes/mg/static/logo_docs.png | Bin 6522 -> 6626 bytes docs/source/themes/mg/static/mg.css | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/themes/mg/static/logo_docs.png b/docs/source/themes/mg/static/logo_docs.png index 92879965..99f04cc7 100644 Binary files a/docs/source/themes/mg/static/logo_docs.png and b/docs/source/themes/mg/static/logo_docs.png differ diff --git a/docs/source/themes/mg/static/mg.css b/docs/source/themes/mg/static/mg.css index 3a0a1336..3fa842cd 100644 --- a/docs/source/themes/mg/static/mg.css +++ b/docs/source/themes/mg/static/mg.css @@ -109,7 +109,7 @@ div.documentwrapper { } div.bodywrapper { - margin: 60px 0 0 230px; + margin: 0 0 0 270px; } div.body { @@ -124,7 +124,7 @@ div.footer { } div.sphinxsidebarwrapper { - padding: 10px 5px 0 20px; + padding: 10px 5px 0 30px; } div.sphinxsidebar ul { @@ -141,5 +141,5 @@ div.related { } p.logo { - margin-bottom: 20px; + margin-top: 30px; } -- cgit v1.2.3 From 0788e48c0ec4b0f32867d32e31ab6b204ee0df8e Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sat, 7 Jan 2012 00:04:38 +0100 Subject: Increase docs sidebar width --- docs/source/themes/mg/static/mg.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/source/themes/mg/static/mg.css b/docs/source/themes/mg/static/mg.css index 3fa842cd..b9355a5d 100644 --- a/docs/source/themes/mg/static/mg.css +++ b/docs/source/themes/mg/static/mg.css @@ -123,6 +123,10 @@ div.footer { font-size: 75%; } +div.sphinxsidebar { + width: 240px; +} + div.sphinxsidebarwrapper { padding: 10px 5px 0 30px; } -- cgit v1.2.3 From 3a4d8b9713bb55e4ad831ad9da3f0f23d8aaed1c Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 7 Jan 2012 13:47:33 -0600 Subject: Committing present MediaGoblin translations before pushing extracted messages --- mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po | 27 ++-- mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po | 170 +++++++++++++--------- mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po | 28 ++-- 3 files changed, 132 insertions(+), 93 deletions(-) diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.po index 8d1e2711..ba5c639d 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: +# , 2011. # , 2011. # , 2011. # , 2011. @@ -14,8 +15,8 @@ msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" -"Last-Translator: cwebber \n" +"PO-Revision-Date: 2011-12-29 17:39+0000\n" +"Last-Translator: ianux \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -109,7 +110,7 @@ msgstr "Tags" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "" +msgstr "Séparez les tags par des virgules." #: mediagoblin/edit/forms.py:33 msgid "Slug" @@ -253,6 +254,8 @@ msgid "" "This site is running MediaGoblin, an " "extraordinarily great piece of media hosting software." msgstr "" +"Ce site fait tourner MediaGoblin, un " +"logiciel d'hébergement de média extraordinairement génial." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" @@ -420,27 +423,27 @@ msgstr "Médias de %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" -msgstr "" +msgstr "Par %(username)s le %(date)s" #: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" -msgstr "" +msgstr "Poster un commentaire" #: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" -msgstr "" +msgstr "à" #: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" -msgstr "" +msgstr "Poster le commentaire !" #: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "Éditer" #: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" +msgstr "Effacer" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -578,7 +581,7 @@ msgstr "Anciens" #: mediagoblin/templates/mediagoblin/utils/pagination.html:50 msgid "Go to page:" -msgstr "" +msgstr "Aller à la page :" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" @@ -598,11 +601,11 @@ msgstr "Je suis sûr de vouloir supprimer cela" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Oups, votre commentaire était vide." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "Votre commentaire a été posté !" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po index c1778676..7b63a859 100644 --- a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.po @@ -3,14 +3,14 @@ # This file is distributed under the same license as the PROJECT project. # # Translators: -# , 2011. +# , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" -"Last-Translator: cwebber \n" +"PO-Revision-Date: 2012-01-04 18:42+0000\n" +"Last-Translator: schendje \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,7 +21,7 @@ msgstr "" #: mediagoblin/processing.py:143 msgid "Invalid file given for media type." -msgstr "" +msgstr "Verkeerd bestandsformaat voor mediatype opgegeven." #: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 msgid "Username" @@ -41,7 +41,7 @@ msgstr "Bevestig wachtwoord" #: mediagoblin/auth/forms.py:39 msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "" +msgstr "Typ het hier nog een keer om spelfouten te voorkomen." #: mediagoblin/auth/forms.py:42 msgid "Email address" @@ -57,7 +57,7 @@ msgstr "Sorry, er bestaat al een gebruiker met die naam." #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "Sorry, een gebruiker met dat e-mailadres bestaat al." #: mediagoblin/auth/views.py:179 msgid "" @@ -74,10 +74,12 @@ msgstr "De verificatie sleutel of gebruikers-ID is onjuist" #: mediagoblin/auth/views.py:203 msgid "You must be logged in so we know who to send the email to!" msgstr "" +"Je moet ingelogd zijn, anders weten we niet waar we de e-mail naartoe moeten" +" sturen!" #: mediagoblin/auth/views.py:211 msgid "You've already verified your email address!" -msgstr "" +msgstr "Je hebt je e-mailadres al geverifieerd!" #: mediagoblin/auth/views.py:224 msgid "Resent your verification email." @@ -88,6 +90,8 @@ msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +"Email kon niet verstuurd worden omdat je gebruikersnaam inactief is of omdat" +" je e-mailadres nog niet geverifieerd is." #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" @@ -99,20 +103,22 @@ msgstr "Etiket" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "" +msgstr "Scheidt labels met komma's." #: mediagoblin/edit/forms.py:33 msgid "Slug" -msgstr "" +msgstr "Slug" #: mediagoblin/edit/forms.py:34 msgid "The slug can't be empty" -msgstr "" +msgstr "De slug kan niet leeg zijn" #: mediagoblin/edit/forms.py:35 msgid "" "The title part of this media's URL. You usually don't need to change this." msgstr "" +"Het titeldeel van het adres van deze media. Meestal hoef je dit niet aan te " +"passen." #: mediagoblin/edit/forms.py:42 msgid "Bio" @@ -124,15 +130,15 @@ msgstr "Website" #: mediagoblin/edit/forms.py:49 msgid "Old password" -msgstr "" +msgstr "Oud wachtwoord" #: mediagoblin/edit/forms.py:52 msgid "New Password" -msgstr "" +msgstr "Nieuw wachtwoord" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." -msgstr "" +msgstr "Er bestaat al een met die slug voor deze gebruiker." #: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." @@ -147,15 +153,15 @@ msgstr "" #: mediagoblin/edit/views.py:171 msgid "Wrong password" -msgstr "" +msgstr "Verkeerd wachtwoord" #: mediagoblin/edit/views.py:192 msgid "Profile edited!" -msgstr "" +msgstr "Profiel aangepast!" #: mediagoblin/media_types/__init__.py:65 msgid "Could not find any file extension in \"{filename}\"" -msgstr "" +msgstr "Kon geen bestandsformaat voor \"{filename}\" vinden" #: mediagoblin/submit/forms.py:25 msgid "File" @@ -163,7 +169,7 @@ msgstr "Bestand" #: mediagoblin/submit/forms.py:30 msgid "Description of this work" -msgstr "" +msgstr "Beschrijving van dit werk" #: mediagoblin/submit/views.py:49 msgid "You must provide a file." @@ -175,29 +181,31 @@ msgstr "Mooizo! Toegevoegd!" #: mediagoblin/submit/views.py:133 msgid "Invalid file type." -msgstr "" +msgstr "Ongeldig bestandstype" #: mediagoblin/templates/mediagoblin/404.html:21 msgid "Oops!" -msgstr "" +msgstr "Oeps!" #: mediagoblin/templates/mediagoblin/404.html:24 msgid "There doesn't seem to be a page at this address. Sorry!" -msgstr "" +msgstr "Het lijkt erop dat er geen pagina bestaat op dit adres. Sorry!" #: 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 "" +"Als je zeker weet dat het adres klopt is de pagina misschien verplaatst of " +"verwijderd." #: mediagoblin/templates/mediagoblin/404.html:32 msgid "Image of 404 goblin stressing out" -msgstr "" +msgstr "Afbeelding van de 404 goblin onder stress" #: mediagoblin/templates/mediagoblin/base.html:49 msgid "MediaGoblin logo" -msgstr "" +msgstr "MediaGoblin logo" #: mediagoblin/templates/mediagoblin/base.html:54 msgid "Submit media" @@ -205,11 +213,11 @@ msgstr "Voeg media toe" #: mediagoblin/templates/mediagoblin/base.html:65 msgid "Verify your email!" -msgstr "" +msgstr "Verifieer je e-mailadres!" #: mediagoblin/templates/mediagoblin/base.html:72 msgid "log out" -msgstr "" +msgstr "uitloggen" #: mediagoblin/templates/mediagoblin/base.html:75 #: mediagoblin/templates/mediagoblin/auth/login.html:27 @@ -222,30 +230,37 @@ msgid "" "Powered by MediaGoblin, a GNU project" msgstr "" +"Aangedreven door <a " +"href=\"http://mediagoblin.org\">MediaGoblin</a> , een <a " +"href=\"http://gnu.org/\">GNU-project</a>" #: mediagoblin/templates/mediagoblin/root.html:24 msgid "Explore" -msgstr "" +msgstr "Verkennen" #: mediagoblin/templates/mediagoblin/root.html:27 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Hoi, welkom op deze MediaGoblin website!" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "" "This site is running MediaGoblin, an " "extraordinarily great piece of media hosting software." msgstr "" +"Deze website draait MediaGoblin, een " +"buitengewoon goed stuk software voor mediahosting." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" +"Om je eigen media toe te voegen, berichten te plaatsen, favorieten op te " +"slaan en meer, kun je inloggen met je MediaGoblin account." #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "Heb je er nog geen? Het is heel eenvoudig!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format @@ -254,14 +269,17 @@ msgid "" " or\n" " Set up MediaGoblin on your own server" msgstr "" +"Creëer een account op deze website\n" +" of\n" +" Gebruik MediaGoblin op je eigen server" #: mediagoblin/templates/mediagoblin/root.html:44 msgid "Most recent media" -msgstr "" +msgstr "Nieuwste media" #: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 msgid "Enter your new password" -msgstr "" +msgstr "Voer je nieuwe wachtwoord in" #: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 #: mediagoblin/templates/mediagoblin/submit/start.html:30 @@ -270,20 +288,22 @@ msgstr "Voeg toe" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Wachtwoord herstellen" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" +msgstr "Stuur instructies" #: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 msgid "Your password has been changed. Try to log in now." -msgstr "" +msgstr "Je wachtwoord is veranderd. Probeer om opnieuw in te loggen." #: 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 "" +"Check je inbox. Er is een e-mail verstuurd waarmee je je wachtwoord kunt " +"veranderen." #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -298,10 +318,17 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" +"Hoi %(username)s,\n" +"\n" +"Om je wachtwoord voor GNU MediaGoblin te veranderen, moet je dit adres in je webbrowser openen:\n" +"\n" +"%(verification_url)s\n" +"\n" +"Als je denkt dat dit niet klopt, kun je deze e-mail gewoon negeren." #: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" -msgstr "" +msgstr "Inloggen is mislukt!" #: mediagoblin/templates/mediagoblin/auth/login.html:35 msgid "Don't have an account yet?" @@ -313,7 +340,7 @@ msgstr "Maak er hier een!" #: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" -msgstr "" +msgstr "Wachtwoord vergeten?" #: mediagoblin/templates/mediagoblin/auth/register.html:27 msgid "Create an account!" @@ -321,7 +348,7 @@ msgstr "Maak een account aan!" #: mediagoblin/templates/mediagoblin/auth/register.html:31 msgid "Create" -msgstr "" +msgstr "Creëer" #: mediagoblin/templates/mediagoblin/auth/verification_email.txt:19 #, python-format @@ -360,11 +387,11 @@ msgstr "Het profiel aanpassen van %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr "Media met het label: %(tag_name)s" #: mediagoblin/templates/mediagoblin/media_displays/video.html:19 msgid "Original" -msgstr "" +msgstr "Origineel" #: mediagoblin/templates/mediagoblin/submit/start.html:26 msgid "Submit yer media" @@ -373,7 +400,7 @@ msgstr "Voeg media toe" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "Media van %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format @@ -383,57 +410,57 @@ msgstr "Media van %(username)s " #: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" -msgstr "" +msgstr "Door %(username)s op %(date)s" #: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" -msgstr "" +msgstr "Plaats een bericht" #: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" -msgstr "" +msgstr "op" #: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" -msgstr "" +msgstr "Plaats bericht!" #: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "Pas aan" #: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" +msgstr "Verwijderen" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" -msgstr "" +msgstr "Zeker weten dat je %(title)s wil verwijderen?" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:50 msgid "Delete Permanently" -msgstr "" +msgstr "Permanent verwijderen" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 msgid "Media processing panel" -msgstr "" +msgstr "Mediaverwerkingspaneel" #: 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 "Hier kun je de status zien van de media die verwerkt worden." #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 msgid "Media in-processing" -msgstr "" +msgstr "Media te verwerken" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46 msgid "No media in-processing" -msgstr "" +msgstr "Geen media om te verwerken" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 msgid "These uploads failed to process:" -msgstr "" +msgstr "Deze toevoegingen konden niet verwerkt worden:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:31 #: mediagoblin/templates/mediagoblin/user_pages/user.html:89 @@ -448,11 +475,11 @@ msgstr "Sorry, die gebruiker kon niet worden gevonden." #: mediagoblin/templates/mediagoblin/user_pages/user.html:50 #: mediagoblin/templates/mediagoblin/user_pages/user.html:70 msgid "Email verification needed" -msgstr "" +msgstr "Emailverificatie is nodig" #: mediagoblin/templates/mediagoblin/user_pages/user.html:53 msgid "Almost done! Your account still needs to be activated." -msgstr "" +msgstr "Bijna klaar! Je account moet nog geactiveerd worden." #: mediagoblin/templates/mediagoblin/user_pages/user.html:58 msgid "" @@ -474,6 +501,8 @@ msgid "" "Someone has registered an account with this username, but it still has to be" " activated." msgstr "" +"Iemand heeft een account met deze gebruikersnaam gemaakt, maar hij moet nog " +"geactiveerd worden." #: mediagoblin/templates/mediagoblin/user_pages/user.html:79 #, python-format @@ -486,7 +515,7 @@ msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." -msgstr "" +msgstr "Hier is een plekje om anderen over jezelf te vertellen." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 #: mediagoblin/templates/mediagoblin/user_pages/user.html:119 @@ -495,7 +524,7 @@ msgstr "Profiel aanpassen." #: mediagoblin/templates/mediagoblin/user_pages/user.html:107 msgid "This user hasn't filled in their profile (yet)." -msgstr "" +msgstr "Deze gebruiker heeft zijn of haar profiel (nog) niet ingevuld." #: mediagoblin/templates/mediagoblin/user_pages/user.html:133 #, python-format @@ -507,42 +536,44 @@ msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "" +"Dit is waar je nieuwe media zal verschijnen, maar het lijkt erop dat je nog " +"niets heb toegevoegd." #: mediagoblin/templates/mediagoblin/user_pages/user.html:152 msgid "Add media" -msgstr "" +msgstr "Voeg media toe" #: mediagoblin/templates/mediagoblin/user_pages/user.html:158 msgid "There doesn't seem to be any media here yet..." -msgstr "" +msgstr "Het lijkt erop dat er nog geen media is." #: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 msgid "feed icon" -msgstr "" +msgstr "feed icoon" #: 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 "Nieuwer" #: mediagoblin/templates/mediagoblin/utils/pagination.html:46 msgid "Older" -msgstr "" +msgstr "Ouder" #: mediagoblin/templates/mediagoblin/utils/pagination.html:50 msgid "Go to page:" -msgstr "" +msgstr "Ga naar pagina:" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" -msgstr "" +msgstr "Gelabeld met" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 msgid "and" -msgstr "" +msgstr "en" #: mediagoblin/user_pages/forms.py:24 msgid "Comment" @@ -550,26 +581,29 @@ msgstr "Commentaar" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" -msgstr "" +msgstr "Ik weet zeker dat ik dit wil verwijderen." #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Oeps, je bericht was leeg." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "Je bericht is geplaatst!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Je hebt deze media verwijderd." #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." msgstr "" +"Deze media was niet verwijderd omdat je niet hebt aangegeven dat je het " +"zeker weet." #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." msgstr "" +"Je staat op het punt de media van iemand anders te verwijderen. Pas op." diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po index 70622590..2864ef8a 100644 --- a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.po @@ -4,14 +4,14 @@ # # Translators: # , 2011. -# Harry Chen , 2011. +# Harry Chen , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: GNU MediaGoblin\n" "Report-Msgid-Bugs-To: http://bugs.foocorp.net/projects/mediagoblin/issues\n" "POT-Creation-Date: 2011-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" -"Last-Translator: cwebber \n" +"PO-Revision-Date: 2012-01-03 16:35+0000\n" +"Last-Translator: Harry Chen \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -98,7 +98,7 @@ msgstr "標籤" #: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 msgid "Seperate tags by commas." -msgstr "" +msgstr "用逗點分開標籤。" #: mediagoblin/edit/forms.py:33 msgid "Slug" @@ -234,6 +234,8 @@ msgid "" "This site is running MediaGoblin, an " "extraordinarily great piece of media hosting software." msgstr "" +"此網站正運行 媒體怪獸(MediaGoblin), " +"他是一個超讚的媒體分享架站軟體." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" @@ -394,27 +396,27 @@ msgstr "%(username)s的媒體檔案" #: mediagoblin/templates/mediagoblin/user_pages/media.html:57 #, python-format msgid "By %(username)s on %(date)s" -msgstr "" +msgstr "由 %(username)s 於 %(date)s" #: mediagoblin/templates/mediagoblin/user_pages/media.html:67 msgid "Post a comment" -msgstr "" +msgstr "刊登評論" #: mediagoblin/templates/mediagoblin/user_pages/media.html:85 msgid "at" -msgstr "" +msgstr "在" #: mediagoblin/templates/mediagoblin/user_pages/media.html:102 msgid "Post comment!" -msgstr "" +msgstr "刊登評論!" #: mediagoblin/templates/mediagoblin/user_pages/media.html:124 msgid "Edit" -msgstr "" +msgstr "編輯" #: mediagoblin/templates/mediagoblin/user_pages/media.html:130 msgid "Delete" -msgstr "" +msgstr "刪除" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -541,7 +543,7 @@ msgstr "舊一點" #: mediagoblin/templates/mediagoblin/utils/pagination.html:50 msgid "Go to page:" -msgstr "" +msgstr "跳到頁數:" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 msgid "Tagged with" @@ -561,11 +563,11 @@ msgstr "我確定我想要刪除" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "啊,你的留言是空的。" #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "你的留言已經刊登!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -- cgit v1.2.3 From bcd50908d2849dff5a466b15db65112779cb85e2 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Sat, 7 Jan 2012 13:48:12 -0600 Subject: Committing extracted and compiled translations --- mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo | Bin 12717 -> 14396 bytes mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po | 319 +++++++++------- mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo | Bin 11505 -> 13397 bytes mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po | 311 ++++++++++------ mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo | Bin 11802 -> 13692 bytes mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po | 360 ++++++++++-------- mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po | 304 ++++++++++------ mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo | Bin 11749 -> 13543 bytes mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po | 348 ++++++++++-------- mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo | Bin 12120 -> 13891 bytes mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po | 349 ++++++++++-------- mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo | Bin 12304 -> 12357 bytes mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo | Bin 11238 -> 13161 bytes mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po | 303 ++++++++++------ mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo | Bin 11622 -> 13574 bytes mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po | 361 +++++++++++------- mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo | Bin 11879 -> 13736 bytes mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po | 309 ++++++++++------ mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo | Bin 11394 -> 11670 bytes mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo | Bin 10933 -> 12901 bytes mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po | 321 +++++++++------- mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo | Bin 11350 -> 13279 bytes mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po | 341 ++++++++++------- mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo | Bin 11882 -> 13685 bytes mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po | 348 ++++++++++-------- mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo | Bin 15457 -> 16681 bytes mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po | 348 ++++++++++-------- mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo | Bin 11993 -> 13900 bytes mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po | 423 +++++++++++++--------- mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo | Bin 11439 -> 13350 bytes mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po | 311 ++++++++++------ mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo | Bin 11335 -> 13259 bytes mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po | 303 ++++++++++------ mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo | Bin 11538 -> 13448 bytes mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po | 321 +++++++++------- mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo | Bin 11527 -> 13409 bytes mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po | 305 ++++++++++------ mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo | Bin 11190 -> 11198 bytes 38 files changed, 3640 insertions(+), 2345 deletions(-) diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo index 02dfa29a..1a7267e5 100644 Binary files a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po index 61abc63f..c53fc387 100644 --- a/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ar/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -25,27 +25,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "" -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "اسم المستخدم" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "عنوان البريد الإلكتروني" @@ -61,7 +49,7 @@ msgstr "عذرًا، لقد اختار مستخدم آخر هذا الاسم." msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -69,23 +57,28 @@ msgstr "" "تم التحقق من بريدك الإلكتروني. يمكنك الآن الولوج، وتحرير ملفك الشخصي، ونشر " "الصور!" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "مفتاح التحقق أو معرف المستخدم خاطئ" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "أعدنا إرسال رسالة التحقق." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -93,47 +86,76 @@ msgstr "" "تعذر إرسال رسالة استعادة كلمة السر لأن اسم المستخدم معطل أو لأننا لم نتحقق " "من بريدك الإلكتروني." +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "العنوان" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "وصف هذا العمل." + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "الوسوم" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "المسار" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "لا يمكن ترك المسار فارغًا" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -"الجزء الذي يمثل عنوان الملف في المسار. لا حاجة إلى تغيير محتوى هذه الخانة " -"عادةً." -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "السيرة" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "الموقع الإلكتروني" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -148,39 +170,43 @@ msgstr "أنت تحرّر وسائط مستخدم آخر. كن حذرًا أثن msgid "You are editing a user's profile. Proceed with caution." msgstr "أنت تحرّر ملف مستخدم آخر. كن حذرًا أثناء العملية." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file 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:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "يجب أن تضع ملفًا." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "يا سلام! نُشرَت!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "" +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "صورة قزم مرتبك" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "ويحي!" @@ -195,33 +221,30 @@ msgid "" msgstr "" "إن كنت متأكدًا من صحة العنوان فربما تكون الصفحة التي تريدها نُقلت أو حُذفت." -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "صورة قزم مرتبك" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "شعار ميدياغوبلن" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "أرسل وسائط" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "أضف وسائط" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "لِج" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -231,7 +254,7 @@ msgstr "" msgid "Explore" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -255,22 +278,21 @@ msgstr "" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "أحدث الوسائط" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "أدخل كلمة سرك الجديدة" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "أرسل" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -280,15 +302,6 @@ msgstr "" msgid "Send instructions" 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 "" @@ -326,11 +339,11 @@ msgstr "أنشئ حسابًا هنا!" msgid "Forgot your password?" msgstr "أنسيت كلمة سرك؟" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "أنشئ حسابًا!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "أنشئ" @@ -362,10 +375,16 @@ msgid "Cancel" msgstr "ألغِ" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "احفظ التغييرات" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -377,13 +396,32 @@ msgstr "تحرير ملف %(username)s الشخصي" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "انشر وسائطك" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -395,29 +433,55 @@ msgstr "" msgid "%(username)s's media" msgstr "وسائط %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -502,30 +566,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "هذه زاوية لتخبر الآخرين فيها عن نفسك." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "حرِّر الملف الشخصي" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "لم يعبئ هذا العضو بيانات ملفه بعد." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "أظهِر كل وسائط %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 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:152 -msgid "Add media" -msgstr "أضف وسائط" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "لا يبدو أنه توجد أي وسائط هنا حتى الآن..." @@ -537,30 +602,36 @@ msgstr "" msgid "Atom feed" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "الأحدث" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "الأقدم" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +msgid "View more media tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +msgid "or" 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 "أنا متأكد من رغبتي بحذف هذا العمل" diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo index 34179a53..45f2331f 100644 Binary files a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po index 9609cb34..a5d6732b 100644 --- a/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ca/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -24,27 +24,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Aquest tipus de fitxer no és vàlid." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Nom d'usuari" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "Adreça electrònica" @@ -60,7 +48,7 @@ msgstr "Lamentablement aquest usuari ja existeix." msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -68,68 +56,104 @@ 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 +#: mediagoblin/auth/views.py:186 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:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "Torna'm a enviar el correu de verificació" -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +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 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Etiquetes" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "Biografia" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Lloc web" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -144,39 +168,43 @@ msgstr "Esteu editant fitxers d'un altre usuari. Aneu amb compte." msgid "You are editing a user's profile. Proceed with caution." msgstr "Esteu editant el perfil d'un usuari. Aneu amb compte" -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Fitxer" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Heu d'escollir un fitxer." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Visca! S'ha enviat!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "" +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Imatge de la pantalla 404, el goblin no sap què fer..." -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Ups!" @@ -192,33 +220,30 @@ 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 "Imatge de la pantalla 404, el goblin no sap què fer..." - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "Logo de mediagoblin" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Envia fitxers" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Tots els fitxers" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Entra" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -228,7 +253,7 @@ msgstr "" msgid "Explore" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -252,22 +277,21 @@ msgstr "" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Envia" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -277,15 +301,6 @@ msgstr "" msgid "Send instructions" 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 "" @@ -316,11 +331,11 @@ msgstr "Creeu-ne un aquí!" msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Creeu un compte!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Crea" @@ -352,10 +367,16 @@ msgid "Cancel" msgstr "Cancel·la" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Desa els canvis" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -367,13 +388,32 @@ msgstr "" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Envieu els vostres fitxers" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -385,29 +425,55 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)s's media" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -494,30 +560,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Edita el perfil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Aquest usuari encara no ha escrit res al seu perfil." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, 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:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 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:152 -msgid "Add media" -msgstr "Tots els fitxers" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -529,30 +596,36 @@ msgstr "Icona RSS" msgid "Atom feed" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +msgid "View more media tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +msgid "or" 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 "" diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo index a01abf9c..4f4bbfda 100644 Binary files a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po index e2765357..1fb472f0 100644 --- a/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/de/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -8,6 +8,7 @@ # Elrond , 2011. # , 2011. # Jan-Christoph Borchardt , 2011. +# Jan-Christoph Borchardt , 2011. # , 2011. # , 2011. # Rafael Maguiña , 2011. @@ -16,9 +17,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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-06 21:16+0000\n" -"Last-Translator: gandaro \n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" +"Last-Translator: cwebber \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" @@ -31,27 +32,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Die Datei stimmt nicht mit dem gewählten Medientyp überein." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Benutzername" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 msgid "Password" msgstr "Passwort" -#: mediagoblin/auth/forms.py:35 -msgid "Passwords must match." -msgstr "Passwörter müssen übereinstimmen." - -#: mediagoblin/auth/forms.py:37 -msgid "Confirm password" -msgstr "Passwort wiederholen" - -#: mediagoblin/auth/forms.py:39 -msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "Hier nochmal eintragen, um Tippfehler zu verhindern." - -#: mediagoblin/auth/forms.py:42 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "E-Mail-Adresse" @@ -67,7 +56,7 @@ msgstr "Leider gibt es bereits einen Benutzer mit diesem Namen." msgid "Sorry, a user with that email address already exists." msgstr "Leider gibt es bereits einen Benutzer mit dieser E-Mail-Adresse." -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -75,23 +64,28 @@ msgstr "" "Deine E-Mail-Adresse wurde bestätigt. Du kannst dich nun anmelden, Dein " "Profil bearbeiten und Bilder hochladen!" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "Der Bestätigungsschlüssel oder die Nutzernummer ist falsch." -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" -msgstr "" +msgstr "Du musst angemeldet sein, damit wir wissen, wer die Email bekommt." -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "Deine E-Mail-Adresse wurde bereits bestätigt." -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "Bestätigungs-E-Mail wurde erneut versandt." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -100,48 +94,77 @@ msgstr "" "weil dein Benutzername inaktiv oder deine E-Mail-Adresse noch nicht " "verifiziert ist." +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titel" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Beschreibung des Werkes" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Markierungen" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "Kurztitel" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "Bitte gib einen Kurztitel ein" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. 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:46 msgid "Bio" msgstr "Biographie" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Webseite" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "Altes Passwort" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" -msgstr "Neues Passwort" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" +msgstr "" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -155,39 +178,43 @@ msgstr "Du bearbeitest die Medien eines Anderen. Bitte sei vorsichtig." msgid "You are editing a user's profile. Proceed with caution." msgstr "Du bearbeitest das Profil eines Anderen. Bitte sei vorsichtig." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "Falsches Passwort" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" -msgstr "Das Profil wurde aktualisiert" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" +msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Datei" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "Beschreibung des Werkes" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Du musst eine Datei angeben." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Yeeeaaah! Geschafft!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "Ungültiger Dateityp." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Bild eines angespannten Goblins" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Hoppla!" @@ -203,33 +230,30 @@ msgstr "" "Wenn du sicher bist, dass die Adresse stimmt, wurde die Seite eventuell " "verschoben oder gelöscht." -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "Bild eines angespannten Goblins" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "MediaGoblin-Logo" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Medien hochladen" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Medien hinzufügen" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "Bitte bestätige deine E-Mail-Adresse!" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "Abmelden" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Anmelden" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -241,46 +265,49 @@ msgstr "" msgid "Explore" msgstr "Entdecke" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Hallo du, willkommen auf dieser MediaGoblin-Seite!" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "" "This site is running MediaGoblin, an " "extraordinarily great piece of media hosting software." msgstr "" +"Diese Seite läuft mit MediaGoblin, " +"einer großartigen Software für Medienhosting." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" +"Melde dich mit deinem MediaGoblin-Konto an, um eigene Medien hinzuzufügen, " +"zu kommentieren, Favoriten zu speichern und mehr." #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "Hast du noch keinen? Das geht ganz einfach!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "Neuste Medien" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "Neues Passwort eingeben" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Bestätigen" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -288,18 +315,7 @@ msgstr "Passwort wiederherstellen" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "" - -#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 -msgid "Your password has been changed. Try to log in now." -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 "" -"Überprüfe deinen Posteingang. Wir haben dir eine E-Mail mit einem Link " -"geschickt, mit dem du dein Passwort ändern kannst." +msgstr "Anleitung senden" #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -338,11 +354,11 @@ msgstr "Registriere dich hier!" msgid "Forgot your password?" msgstr "Passwort vergessen?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Neues Konto registrieren!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Registrieren" @@ -373,10 +389,16 @@ msgid "Cancel" msgstr "Abbrechen" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Änderungen speichern" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -386,15 +408,34 @@ msgstr "%(username)ss Profil bearbeiten" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr ": %(tag_name)s" +msgstr "Medien markiert mit: %(tag_name)s" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" +msgstr "Original" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Medien hochladen" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -406,30 +447,56 @@ msgstr "%(username)ss Medien" msgid "%(username)s's media" msgstr "%(username)ss Medien" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" -msgstr "Von %(username)s am %(date)s" +msgid "Added on %(date)s." +msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" +msgstr "Bearbeiten" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" +msgstr "Löschen" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" -msgstr "Bearbeiten" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" -msgstr "Löschen" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "bei" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format @@ -520,30 +587,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "Hier kannst du Anderen etwas über dich erzählen." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Profil bearbeiten" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Dieser Benutzer hat (noch) keine Daten in seinem Profil." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Alle Medien von %(username)s anschauen" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "Hier erscheinen deine Medien. Sobald du etwas hochgeladen hast." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 -msgid "Add media" -msgstr "Medien hinzufügen" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Scheinbar gibt es hier noch nichts …" @@ -555,29 +623,35 @@ msgstr "Feed-Symbol" msgid "Atom feed" msgstr "Atom-Feed" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "Neuere" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Ältere" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" +msgstr "Zu Seite:" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" -msgstr "Markiert mit" +msgid "View more media tagged with" +msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" -msgstr "und" - -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -msgstr "Kommentar" +msgid "or" +msgstr "" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" @@ -585,19 +659,21 @@ msgstr "Ja, wirklich löschen" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Ohh, der Kommentar war leer." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "Dein Kommentar wurde gesendet!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Du hast das Medium gelöscht." #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." msgstr "" +"Das Medium wurde nicht gelöscht. Du musst ankreuzen, dass du es wirklich " +"löschen möchtest." #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po index 17e6873c..3584cd4f 100644 --- a/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po @@ -1,14 +1,14 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. -# FIRST AUTHOR , 2011. +# FIRST AUTHOR , 2012. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2011-12-04 10:24-0600\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -21,27 +21,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "" -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "" @@ -57,72 +45,110 @@ msgstr "" msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your " "profile, and submit images!" msgstr "" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or " "your account's email address has not been verified." msgstr "" +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 -msgid "The title part of this media's URL. You usually don't need to change this." +#: mediagoblin/edit/forms.py:39 +msgid "" +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -137,39 +163,43 @@ msgstr "" msgid "You are editing a user's profile. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/submit/forms.py:25 -msgid "File" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" +#: mediagoblin/submit/forms.py:25 +msgid "File" msgstr "" -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" msgstr "" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "" @@ -183,33 +213,30 @@ msgid "" "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:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -219,7 +246,7 @@ msgstr "" msgid "Explore" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -244,23 +271,22 @@ msgstr "" msgid "" "Create an " "account at this site\n" -" or\n" -" Set up MediaGoblin on " "your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 @@ -271,14 +297,6 @@ msgstr "" msgid "Send instructions" 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 "" @@ -309,11 +327,11 @@ msgstr "" msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "" @@ -339,10 +357,16 @@ msgid "Cancel" msgstr "" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -354,12 +378,31 @@ msgstr "" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 @@ -372,29 +415,55 @@ msgstr "" msgid "%(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown " +"for formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -475,30 +544,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 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:152 -msgid "Add media" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -510,28 +580,34 @@ msgstr "" msgid "Atom feed" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" msgstr "" -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "View more media tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "or" msgstr "" #: mediagoblin/user_pages/forms.py:30 diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo index 3e0a84bf..d0c5f2bf 100644 Binary files a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po index c3c29b89..6536f4d5 100644 --- a/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/eo/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -10,9 +10,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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-06 20:04+0000\n" -"Last-Translator: aleksejrs \n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" +"Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,27 +25,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "La provizita dosiero ne konformas al la informtipo." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Uzantnomo" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 msgid "Password" msgstr "Pasvorto" -#: mediagoblin/auth/forms.py:35 -msgid "Passwords must match." -msgstr "Pasvortoj devas esti egalaj." - -#: mediagoblin/auth/forms.py:37 -msgid "Confirm password" -msgstr "Retajpu pasvorton" - -#: mediagoblin/auth/forms.py:39 -msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "Retajpu ĝin por certigi, ke ne okazis mistajpoj." - -#: mediagoblin/auth/forms.py:42 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "Retpoŝtadreso" @@ -61,7 +49,7 @@ msgstr "Bedaŭrinde, uzanto kun tiu nomo jam ekzistas." msgid "Sorry, a user with that email address already exists." msgstr "Ni bedaŭras, sed konto kun tiu retpoŝtadreso jam ekzistas." -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -69,23 +57,28 @@ msgstr "" "Via retpoŝtadreso estas konfirmita. Vi povas nun ensaluti, redakti vian " "profilon, kaj alŝuti bildojn!" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "La kontrol-kodo aŭ la uzantonomo ne estas korekta" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "Vi devas esti ensalutita, por ke ni sciu, al kiu sendi la retleteron!" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "Vi jam konfirmis vian retpoŝtadreson!" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "Resendi vian kontrol-mesaĝon." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -93,48 +86,77 @@ msgstr "" "Ni ne povas sendi pasvortsavan retleteron, ĉar aŭ via konto estas neaktiva, " "aŭ ĝia retpoŝtadreso ne estis konfirmita." +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titolo" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Priskribo de ĉi tiu verko" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Etikedoj" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." -msgstr "Dividu la etikedojn per komoj." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." +msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "La distingiga adresparto" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "La distingiga adresparto ne povas esti malplena" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. 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:46 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Retejo" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "La malnova pasvorto" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" -msgstr "La nova pasvorto" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" +msgstr "" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -148,39 +170,43 @@ msgstr "Vi priredaktas dosieron de alia uzanto. Agu singardeme." msgid "You are editing a user's profile. Proceed with caution." msgstr "Vi redaktas profilon de alia uzanto. Agu singardeme." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "Malĝusta pasvorto" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" -msgstr "La profilŝanĝo faritas!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" +msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" -msgstr "Ŝajnas, ke en «{filename}» mankas dosiernoma finaĵo" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Dosiero" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "Priskribo de ĉi tiu verko" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Vi devas provizi dosieron." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Hura! Alŝutitas!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "Netaŭga dosiertipo." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Bildo de 404-koboldo penŝvitanta." -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Oj!" @@ -196,33 +222,30 @@ msgstr "" "Se vi estas certa, ke la adreso estas ĝusta, eble la serĉata de vi paĝo " "estis movita aŭ forigita." -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "Bildo de 404-koboldo penŝvitanta." - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "Emblemo de MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Alŝuti aŭd-vid-dosieron" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Aldoni dosieron" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "Konfirmu viecon de la retpoŝtadreso!" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "elsaluti" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Ensaluti" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -234,7 +257,7 @@ msgstr "" msgid "Explore" msgstr "Ĉirkaŭrigardi" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Saluton, kaj bonvenon al ĉi tiu MediaGoblina retpaĝaro!" @@ -263,25 +286,21 @@ msgstr "Ĉu vi ankoraŭ ne havas tian? Ne malĝoju!" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -"Kreu konton en ĉi tiu retejo\n" -" aŭ\n" -" Ekfunkciigu MediaGoblin’on en via propra servilo" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "Laste aldonitaj dosieroj" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "Enigu vian novan pasvorton" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Alŝuti" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -291,17 +310,6 @@ msgstr "Ekhavo de nova pasvorto" msgid "Send instructions" msgstr "Sendi instrukcion" -#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 -msgid "Your password has been changed. Try to log in now." -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 msgid "" @@ -339,11 +347,11 @@ msgstr "Kreu ĝin ĉi tie!" msgid "Forgot your password?" msgstr "Ĉu vi forgesis vian pasvorton?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Kreu konton!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Krei" @@ -374,10 +382,16 @@ msgid "Cancel" msgstr "Nuligi" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Konservi ŝanĝojn" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -389,13 +403,32 @@ msgstr "Redaktado de l’profilo de %(username)s'" msgid "Media tagged with: %(tag_name)s" msgstr "Dosieroj kun etikedo: %(tag_name)s" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "Originalo" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Alŝutu vian aŭd-vid-dosieron" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -407,31 +440,57 @@ msgstr "Dosieroj de %(username)s" msgid "%(username)s's media" msgstr "Dosieroj de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" -msgstr "Afiŝita de %(username)s je %(date)s" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" -msgstr "Afiŝi komenton" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" -msgstr "je" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" -msgstr "Afiŝi la komenton!" +msgid "Added on %(date)s." +msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 msgid "Edit" msgstr "Ŝanĝi" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 msgid "Delete" msgstr "Forigi" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "je" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -519,31 +578,32 @@ msgid "Here's a spot to tell others about yourself." msgstr "Jen estas spaceto por rakonti pri vi al aliaj." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Redakti profilon" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Ĉi tiu uzanto ne jam aldonis informojn pri si." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Rigardi ĉiujn dosierojn de %(username)s'" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "" "Ĝuste ĉi tie aperos viaj dosieroj, sed vi ŝajne ankoraŭ nenion alŝutis." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 -msgid "Add media" -msgstr "Aldoni dosieron" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Ĉi tie ŝajne estas ankoraŭ neniuj dosieroj…" @@ -555,29 +615,35 @@ msgstr "flusimbolo" msgid "Atom feed" msgstr "Atom-a informfluo" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "Plinovaj" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Malplinovaj" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "Iri al paĝo:" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" -msgstr "Markita per: " +msgid "View more media tagged with" +msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" -msgstr "kaj" - -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -msgstr "Komento" +msgid "or" +msgstr "" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo index 0f7f4026..b9f8eeed 100644 Binary files a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po index 406e1923..ab8c6b3f 100644 --- a/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/es/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -15,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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-05 23:20+0000\n" -"Last-Translator: manolinux \n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" +"Last-Translator: cwebber \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mediagoblin/team/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -30,28 +30,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Archivo inválido para el formato seleccionado." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Nombre de usuario" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 msgid "Password" msgstr "Contraseña" -#: mediagoblin/auth/forms.py:35 -msgid "Passwords must match." -msgstr "Las contraseñas deben coincidir." - -#: mediagoblin/auth/forms.py:37 -msgid "Confirm password" -msgstr "Confirma tu contraseña" - -#: mediagoblin/auth/forms.py:39 -msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "" -"Escriba de nuevo aquí para asegurarse de que no hay faltas de ortografía." - -#: mediagoblin/auth/forms.py:42 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "Dirección de correo electrónico" @@ -67,7 +54,7 @@ msgstr "Lo sentimos, ya existe un usuario con ese nombre." msgid "Sorry, a user with that email address already exists." msgstr "Lo sentimos, ya existe un usuario con esa dirección de email." -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -75,26 +62,31 @@ 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:185 +#: mediagoblin/auth/views.py:186 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:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" "¡Debes iniciar sesión para que podamos saber a quién le enviamos el correo " "electrónico!" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "¡Ya has verificado tu dirección de correo!" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "Se reenvió tu correo electrónico de verificación." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -103,48 +95,77 @@ msgstr "" "porque su nombre de usuario está inactivo o la dirección de su cuenta de " "correo electrónico no ha sido verificada." +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Título" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Descripción de esta obra" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Etiquetas" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." -msgstr "Separa las etiquetas con comas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." +msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "Ficha" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "La ficha no puede estar vacía" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. 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:46 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Sitio web" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "Vieja contraseña" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" -msgstr "Nueva contraseña" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" +msgstr "" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -158,39 +179,43 @@ msgstr "Estás editando el contenido de otro usuario. Proceder con precaución." msgid "You are editing a user's profile. Proceed with caution." msgstr "Estás editando un perfil de usuario. Proceder con precaución." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "Contraseña incorrecta" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" -msgstr "¡Perfil editado!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" +msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" -msgstr "No se pudo encontrar la extensión del archivo en \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Archivo" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "Descripción de esta obra" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Debes proporcionar un archivo." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "¡Yujú! ¡Enviado!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "Tipo de archivo inválido." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Imagen de 404 goblin estresándose" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "¡Ups!" @@ -206,33 +231,30 @@ msgstr "" "Si estás seguro que la dirección es correcta, puede ser que la pagina haya " "sido movida o borrada." -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "Imagen de 404 goblin estresándose" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "Logo de MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Enviar contenido" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Añadir contenido" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "¡Verifica tu email!" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "Cerrar sesión" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Conectarse" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -244,7 +266,7 @@ msgstr "" msgid "Explore" msgstr "Explorar" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Hola, ¡bienvenido a este sitio de MediaGoblin!" @@ -273,25 +295,21 @@ msgstr "¿Aún no tienes una? ¡Es fácil!" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -"Crea una cuenta en este sitio\n" -" o\n" -" Instala MediaGoblin en tu propio servidor" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "El contenido más reciente" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "Ingrese su nueva contraseña" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Enviar" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -301,17 +319,6 @@ msgstr "Recuperar contraseña" msgid "Send instructions" msgstr "Enviar instrucciones" -#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 -msgid "Your password has been changed. Try to log in now." -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 msgid "" @@ -349,11 +356,11 @@ msgstr "¡Crea una aquí!" msgid "Forgot your password?" msgstr "¿Olvidaste tu contraseña?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "¡Crea una cuenta!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Crear" @@ -384,10 +391,16 @@ msgid "Cancel" msgstr "Cancelar" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Guardar cambios" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -399,13 +412,32 @@ msgstr "Editando el perfil de %(username)s" msgid "Media tagged with: %(tag_name)s" msgstr "Contenido etiquetado con: %(tag_name)s" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "Original" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Envía tu contenido" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -417,31 +449,57 @@ msgstr "Contenidos de %(username)s" msgid "%(username)s's media" msgstr "Contenido de %(username)s's" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" -msgstr "Por %(username)s en %(date)s" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" -msgstr "Pon un comentario." - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" -msgstr "en" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" -msgstr "¡Pon un comentario!" +msgid "Added on %(date)s." +msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 msgid "Edit" msgstr "Editar" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 msgid "Delete" msgstr "Borrar" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "en" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -530,31 +588,32 @@ 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í." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Editar perfil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Este usuario (todavia) no ha completado su perfil." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Ver todo el contenido de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "" "Aquí es donde tú contenido estará, pero parece que aún no has agregado nada." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 -msgid "Add media" -msgstr "Añadir contenido" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Parece que aún no hay ningún contenido aquí..." @@ -566,29 +625,35 @@ msgstr "ícono feed" msgid "Atom feed" msgstr "Atom feed" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "Recientes" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Antiguas" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "Ir a la página:" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" -msgstr "Etiquetado con" +msgid "View more media tagged with" +msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" -msgstr "y" - -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -msgstr "Comentario" +msgid "or" +msgstr "" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" diff --git a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo index ed1ea35d..b805cca5 100644 Binary files a/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/fr/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo index c0a1ecb6..94b378d2 100644 Binary files a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po index 512635e3..56f74573 100644 --- a/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ia/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -23,27 +23,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "" -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Nomine de usator" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "Adresse de e-posta" @@ -59,73 +47,109 @@ msgstr "" msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +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 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Sito web" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -140,39 +164,43 @@ msgstr "" msgid "You are editing a user's profile. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/submit/forms.py:25 -msgid "File" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" +#: mediagoblin/submit/forms.py:25 +msgid "File" msgstr "" -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" msgstr "" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "" @@ -186,33 +214,30 @@ msgid "" " been moved or deleted." msgstr "" -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Initiar session" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -222,7 +247,7 @@ msgstr "" msgid "Explore" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -246,21 +271,20 @@ msgstr "" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 @@ -271,15 +295,6 @@ msgstr "" msgid "Send instructions" 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 "" @@ -310,11 +325,11 @@ msgstr "" msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Crear un conto!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "" @@ -340,10 +355,16 @@ msgid "Cancel" msgstr "Cancellar" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -355,12 +376,31 @@ msgstr "" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 @@ -373,29 +413,55 @@ msgstr "" msgid "%(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -478,30 +544,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 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:152 -msgid "Add media" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -513,30 +580,36 @@ msgstr "" msgid "Atom feed" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +msgid "View more media tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +msgid "or" 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 "" diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo index 1319a605..d5fb3eac 100644 Binary files a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po index 96d1f0a2..6a8b8b65 100644 --- a/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/it/LC_MESSAGES/mediagoblin.po @@ -1,15 +1,16 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: +# , 2011. # , 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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -23,27 +24,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "documento non valido come tipo multimediale." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Nome utente" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 msgid "Password" msgstr "Password" -#: mediagoblin/auth/forms.py:35 -msgid "Passwords must match." -msgstr "Le password devono coincidere" - -#: mediagoblin/auth/forms.py:37 -msgid "Confirm password" -msgstr "Conferma password" - -#: mediagoblin/auth/forms.py:39 -msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "Scrivilo ancora qui per assicurarti che non ci siano errori" - -#: mediagoblin/auth/forms.py:42 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "Indirizzo email" @@ -57,9 +46,9 @@ msgstr "Spiacente, esiste già un utente con quel nome" #: mediagoblin/auth/views.py:77 msgid "Sorry, a user with that email address already exists." -msgstr "" +msgstr "Siamo spiacenti, un utente con quell'indirizzo email esiste già." -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -67,67 +56,106 @@ msgstr "" "Il tuo indirizzo email è stato verificato. Puoi ora fare login, modificare " "il tuo profilo, e inserire immagini!" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "La chiave di verifica o l'id utente è sbagliato" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" +"Devi entrare col tuo profilo così possiamo sapere a chi inviare l'email!" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" -msgstr "" +msgstr "Hai già verificato il tuo indirizzo email!" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "Rispedisci email di verifica" -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +"Impossibile inviare l'email di recupero password perchè il tuo nome utente è" +" inattivo o il tuo account email non è stato verificato." + +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titolo" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Descrizione di questo lavoro" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Tags" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Sito web" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" +msgstr "Password vecchia" + +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -144,39 +172,43 @@ msgstr "" msgid "You are editing a user's profile. Proceed with caution." msgstr "Stai modificando il profilo di un utente. Procedi con attenzione." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" +msgstr "Password errata" + +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Documento" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "Descrizione di questo lavoro" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Devi specificare un documento." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Evviva! " -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "" +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Immagine di 404 folletti che stressano" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Oops!" @@ -192,33 +224,30 @@ msgstr "" "Se sei sicuro che l'indirizzo è corretto, forse la pagina che stai cercando " "è stata spostata o cancellata." -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "Immagine di 404 folletti che stressano" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "MediaGoblin logo" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Inoltra file multimediale" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Aggiungi documenti multimediali" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" -msgstr "" +msgstr "Verifica la tua email!" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" -msgstr "" +msgstr "disconnettiti" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Accedi" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -230,63 +259,58 @@ msgstr "" msgid "Explore" msgstr "Esplora" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" -msgstr "" +msgstr "Ciao, benvenuto a questo sito MediaGoblin!" #: mediagoblin/templates/mediagoblin/root.html:28 msgid "" "This site is running MediaGoblin, an " "extraordinarily great piece of media hosting software." msgstr "" +"questo sito sta utilizzando Mediagoblin, un ottimo programma di " +"media hosting." #: mediagoblin/templates/mediagoblin/root.html:29 msgid "" "To add your own media, place comments, save your favourites and more, you " "can log in with your MediaGoblin account." msgstr "" +"Per aggiungere i tuoi file, scrivere commenti, salvare i tuoi preferiti e " +"altro, devi entrare col tuo profilo MediaGoblin." #: mediagoblin/templates/mediagoblin/root.html:31 msgid "Don't have one yet? It's easy!" -msgstr "" +msgstr "Non ne hai già uno? E' semplice!" #: mediagoblin/templates/mediagoblin/root.html:32 #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "Documenti multimediali più recenti" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "Inserisci la tua nuova password" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Conferma" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" -msgstr "" +msgstr "Recupera Password" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -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 "" +msgstr "Invia istruzioni" #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -301,6 +325,14 @@ msgid "" "If you think this is an error, just ignore this email and continue being\n" "a happy goblin!" msgstr "" +"Ciao %(username)s,\n" +"per cambiare la tua password MediaGoblin apri il seguente URL\n" +"nel tuo web browser:\n" +"\n" +"%(verification_url)s\n" +"\n" +"Se pensi che sia un errore, ignora semplicemente questa email e continua ad essere \n" +"un goblin felice!" #: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" @@ -318,11 +350,11 @@ msgstr "Creane uno qui!" msgid "Forgot your password?" msgstr "Hai dimenticato la password?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Crea un account!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Crea" @@ -353,10 +385,16 @@ msgid "Cancel" msgstr "Annulla" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Salva i cambiamenti" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -366,49 +404,94 @@ msgstr "Stai modificando il profilo di %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "" +msgstr "file taggato con:%(tag_name)s" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" +msgstr "Originale" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" msgstr "" #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Inoltra documento multimediale" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "" +msgstr "file di %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" msgstr "Documenti multimediali di %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" +msgstr "Modifica" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" +msgstr "Elimina" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "a" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -496,20 +579,24 @@ msgid "Here's a spot to tell others about yourself." msgstr "Ecco un posto dove raccontare agli altri di te." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Modifica profilo" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Questo utente non ha (ancora) compilato il proprio profilo." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Visualizza tutti i file multimediali di %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." @@ -517,11 +604,8 @@ msgstr "" "Questo è dove i tuoi documenti multimediali appariranno, ma sembra che tu " "non abbia ancora aggiunto niente." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 -msgid "Add media" -msgstr "Aggiungi documenti multimediali" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Non sembra ci sia ancora nessun documento multimediali qui.." @@ -533,49 +617,56 @@ msgstr "feed icon" msgid "Atom feed" msgstr "Atom feed" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "Più nuovo" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Più vecchio" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" +msgstr "Vai alla pagina:" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +msgid "View more media tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +msgid "or" 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 "Sono sicuro di volerlo cancellare" #: mediagoblin/user_pages/views.py:155 msgid "Oops, your comment was empty." -msgstr "" +msgstr "Oops, il tuo commento era vuoto." #: mediagoblin/user_pages/views.py:161 msgid "Your comment has been posted!" -msgstr "" +msgstr "Il tuo commento è stato aggiunto!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "" +msgstr "Hai cancellato il file" #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." msgstr "" +"Il file non è stato eliminato perchè non hai confermato di essere sicuro." #: mediagoblin/user_pages/views.py:198 msgid "You are about to delete another user's media. Proceed with caution." diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo index 39f3595b..21aeed26 100644 Binary files a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po index 3198eed9..7ed8652b 100644 --- a/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ja/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -23,27 +23,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "" -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "ユーザネーム" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "メールアドレス" @@ -59,73 +47,109 @@ msgstr "申し訳ありませんが、その名前を持つユーザーがすで msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "メアドが確認されています。これで、ログインしてプロファイルを編集し、画像を提出することができます!" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "検証キーまたはユーザーIDが間違っています" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "検証メールを再送しました。" -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "タイトル" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "タグ" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "スラグ" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "スラグは必要です。" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "自己紹介" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "URL" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -140,39 +164,43 @@ msgstr "あなたは、他のユーザーのメディアを編集しています msgid "You are editing a user's profile. Proceed with caution." msgstr "あなたは、他のユーザーのプロファイルを編集しています。ご注意ください。" -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file 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:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "ファイルを提供する必要があります。" -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "投稿終了!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" msgstr "" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "" @@ -186,33 +214,30 @@ msgid "" " been moved or deleted." msgstr "" -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "コンテンツを投稿" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "ログイン" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -222,7 +247,7 @@ msgstr "" msgid "Explore" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -246,22 +271,21 @@ msgstr "" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "送信" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -271,15 +295,6 @@ msgstr "" msgid "Send instructions" 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 "" @@ -310,11 +325,11 @@ msgstr "ここで作成!" msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "アカウントを作成!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "" @@ -345,10 +360,16 @@ msgid "Cancel" msgstr "キャンセル" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "投稿する" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -360,13 +381,32 @@ msgstr "%(username)sさんのプロフィールを編集中" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "コンテンツを投稿" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -378,29 +418,55 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)sさんのコンテンツ" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -483,30 +549,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "プロフィールを編集" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "%(username)sさんのコンテンツをすべて見る" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 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:152 -msgid "Add media" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -518,28 +585,34 @@ msgstr "" msgid "Atom feed" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" msgstr "" -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "View more media tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "or" msgstr "" #: mediagoblin/user_pages/forms.py:30 diff --git a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo index 842bfb9b..4d03c586 100644 Binary files a/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/nl/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo index c07f42be..11b00041 100644 Binary files a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po index 0b0c2a27..dcc82f90 100644 --- a/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/nn_NO/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -23,27 +23,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Ugyldig fil for mediatypen." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Brukarnamn" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 msgid "Password" msgstr "Passord" -#: mediagoblin/auth/forms.py:35 -msgid "Passwords must match." -msgstr "Passorda må vera like." - -#: mediagoblin/auth/forms.py:37 -msgid "Confirm password" -msgstr "Gjenta passord" - -#: mediagoblin/auth/forms.py:39 -msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "Skriv passordet omatt for å unngå stavefeil." - -#: mediagoblin/auth/forms.py:42 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "Epost" @@ -59,7 +47,7 @@ msgstr "Ein konto med dette brukarnamnet finst allereide." msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -67,68 +55,104 @@ msgstr "" "Kontoen din er stadfesta. Du kan no logga inn, endra profilen din og lasta " "opp filer." -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "Stadfestingsnykelen eller brukar-ID-en din er feil." -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "Send ein ny stadfestingsepost." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 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/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Tittel" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Skildring av mediefila" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Merkelappar" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "Nettnamn" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "Nettnamnet kan ikkje vera tomt" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." -msgstr "Nettnamnet (adressetittel) for mediefila di. Trengst ikkje endrast." +"The title part of this media's address. You usually don't need to change " +"this." +msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "Presentasjon" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Heimeside" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -143,39 +167,43 @@ msgstr "Trå varsamt, du endrar nokon andre sine mediefiler." msgid "You are editing a user's profile. Proceed with caution." msgstr "Trå varsamt, du endrar nokon andre sin profil." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Fil" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "Skildring av mediefila" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Du må velja ei fil." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Johoo! Opplasta!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "" +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Bilete av stressa 404-tusse." -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Oops." @@ -191,33 +219,30 @@ msgstr "" "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-tusse." - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Last opp" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Legg til mediefiler" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Logg inn" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -229,7 +254,7 @@ msgstr "" msgid "Explore" msgstr "Utforsk" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -253,22 +278,21 @@ msgstr "" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "Nyaste mediefiler" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "Fyll inn passord" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Send" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -278,17 +302,6 @@ msgstr "" msgid "Send instructions" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 -msgid "Your password has been changed. Try to log in now." -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 msgid "" @@ -326,11 +339,11 @@ msgstr "Lag ein!" msgid "Forgot your password?" msgstr "Gløymd passordet?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Lag ein konto." -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Opprett" @@ -361,10 +374,16 @@ msgid "Cancel" msgstr "Bryt av" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Lagra" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -376,13 +395,32 @@ msgstr "Endrar profilen til %(username)s" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Last opp" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -394,29 +432,55 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)s sine mediefiler" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -501,30 +565,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "Her kan du fortelja om deg sjølv." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Endra profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Brukaren har ikkje fylt ut profilen sin (enno)." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Sjå alle %(username)s sine mediefiler" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "Her kjem mediefilene dine." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 -msgid "Add media" -msgstr "Legg til mediefiler" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Ser ikkje ut til at det finst nokon mediefiler her nett no." @@ -536,30 +601,36 @@ msgstr " " msgid "Atom feed" msgstr "Atom-kjelde" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "Nyare" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Eldre" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +msgid "View more media tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +msgid "or" msgstr "" -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -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" diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo index 87e62764..5b7445f7 100644 Binary files a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po index f1c044d2..11400a2f 100644 --- a/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/pt_BR/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -9,9 +9,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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 23:32+0000\n" -"Last-Translator: osc \n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" +"Last-Translator: cwebber \n" "Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/mediagoblin/team/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,28 +24,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Arquivo inválido para esse tipo de mídia" -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Nome de Usuário" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 msgid "Password" msgstr "Senha" -#: mediagoblin/auth/forms.py:35 -msgid "Passwords must match." -msgstr "Senhas devem ser iguais." - -#: mediagoblin/auth/forms.py:37 -msgid "Confirm password" -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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "Endereço de email" @@ -61,7 +48,7 @@ msgstr "Desculpe, um usuário com este nome já existe." msgid "Sorry, a user with that email address already exists." msgstr "Desculpe, um usuário com esse email já esta cadastrado" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -69,23 +56,28 @@ 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:185 +#: mediagoblin/auth/views.py:186 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:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr " " -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "Você já verifico seu email!" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "O email de verificação foi reenviado." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -93,47 +85,77 @@ 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/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Título" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Descrição desse trabalho" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Etiquetas" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." -msgstr "Separar tags por virgulas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." +msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "Arquivo" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "O arquivo não pode estar vazio" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. 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:46 msgid "Bio" msgstr "Biografia" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Website" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "Senha antiga" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" -msgstr "Nova Senha" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" +msgstr "" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -147,39 +169,43 @@ msgstr "Você está editando a mídia de outro usuário. Tenha cuidado." msgid "You are editing a user's profile. Proceed with caution." msgstr "Você está editando um perfil de usuário. Tenha cuidado." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "Senha errada" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" -msgstr "Perfil editado!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" -msgstr " " +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" +msgstr "" + +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Arquivo" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "Descrição desse trabalho" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Você deve fornecer um arquivo." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Eba! Enviado!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "Tipo de arquivo inválido." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Imagem do goblin 404 aparecendo" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Oops" @@ -195,33 +221,30 @@ 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 "Imagem do goblin 404 aparecendo" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "Logo MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Enviar mídia" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Adicionar mídia" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "Verifique seu email!" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "Sair" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Entrar" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -233,7 +256,7 @@ msgstr "" msgid "Explore" msgstr "Explorar" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Olá, bemvindo ao site de MediaGoblin." @@ -257,22 +280,21 @@ msgstr " " #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "Mídia mais recente" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "Digite sua nova senha" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Enviar" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -282,17 +304,6 @@ msgstr "Recuperar senha" msgid "Send instructions" msgstr "Mandar instruções" -#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 -msgid "Your password has been changed. Try to log in now." -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 msgid "" @@ -331,11 +342,11 @@ msgstr "Crie uma aqui!" msgid "Forgot your password?" msgstr "Esqueceu sua senha?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Criar uma conta!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Criar" @@ -366,10 +377,16 @@ msgid "Cancel" msgstr "Cancelar" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Salvar mudanças" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -381,13 +398,32 @@ msgstr "Editando perfil de %(username)s" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "Original" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Envie sua mídia" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -399,31 +435,57 @@ msgstr "" msgid "%(username)s's media" msgstr "Mídia de %(username)s " -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" -msgstr "Postar um comentário" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" -msgstr "Postar comentário!" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 msgid "Edit" msgstr "Editar" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 msgid "Delete" msgstr "Apagar" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -509,20 +571,24 @@ msgid "Here's a spot to tell others about yourself." msgstr "Aqui é o lugar onde você fala de si para os outros." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Editar perfil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Esse usuário não preencheu seu perfil (ainda)." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Ver todas as mídias de %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." @@ -530,11 +596,8 @@ msgstr "" "Aqui é onde sua mídia vai aparecer, mas parece que você não adicionou nada " "ainda." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 -msgid "Add media" -msgstr "Adicionar mídia" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Aparentemente não há nenhuma mídia aqui ainda..." @@ -546,29 +609,35 @@ msgstr "ícone feed" msgid "Atom feed" msgstr "Atom feed" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "Mais novo" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Mais velho" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "Ir a página:" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +msgid "View more media tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" -msgstr "e" - -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -msgstr "Comentário" +msgid "or" +msgstr "" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo index e0a70ea9..5a711266 100644 Binary files a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po index b747fc3a..4981e988 100644 --- a/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ro/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -9,9 +9,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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 18:41+0000\n" -"Last-Translator: gap \n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" +"Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,27 +24,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Formatul fișierului nu corespunde cu tipul de media selectat." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Nume de utilizator" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 msgid "Password" msgstr "Parolă" -#: mediagoblin/auth/forms.py:35 -msgid "Passwords must match." -msgstr "Parolele trebuie să fie identice." - -#: mediagoblin/auth/forms.py:37 -msgid "Confirm password" -msgstr "Reintrodu parola" - -#: mediagoblin/auth/forms.py:39 -msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "Introdu parola din nou pentru verificare." - -#: mediagoblin/auth/forms.py:42 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "Adresa de e-mail" @@ -60,7 +48,7 @@ msgstr "Ne pare rău, există deja un utilizator cu același nume." msgid "Sorry, a user with that email address already exists." msgstr "Există deja un utilizator înregistrat cu această adresă de e-mail." -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -68,23 +56,28 @@ msgstr "" "Adresa ta de e-mail a fost verificată. Poți să te autentifici, să îți " "completezi profilul și să trimiți imagini!" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "Cheie de verificare sau user ID incorect." -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "Trebuie să fii autentificat ca să știm cui să trimitem mesajul!" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "Adresa ta de e-mail a fost deja verificată!" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "E-mail-ul de verificare a fost retrimis." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -92,48 +85,77 @@ 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 verificată." +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titlu" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Descrierea acestui fișier" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Tag-uri" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." -msgstr "Desparte tag-urile prin virgulă." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." +msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "Identificator" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "Identificatorul nu poate să lipsească" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. 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:46 msgid "Bio" msgstr "Biografie" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Sit Web" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "Vechea parolă" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" -msgstr "Noua parolă" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" +msgstr "" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -148,39 +170,43 @@ msgstr "Editezi fișierul unui alt utilizator. Se recomandă prudență." msgid "You are editing a user's profile. Proceed with caution." msgstr "Editezi profilul unui utilizator. Se recomandă prudență." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "Parolă incorectă" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" -msgstr "Profilul a fost modificat!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" -msgstr "Nu pot extrage extensia din „{filename}”" +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" +msgstr "" + +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" +msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Fișier" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "Descrierea acestui fișier" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Trebuie să selectezi un fișier." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Ura! Trimis!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "Tip de fișier incompatibil." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Imagine cu elful 404 stresat." -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Hopa!" @@ -196,33 +222,30 @@ msgstr "" "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" -msgstr "Imagine cu elful 404 stresat." - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "logo MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Transmite un fișier media" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Trimite fișier" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "Verifică adresa de e-mail!" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "ieșire" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Autentificare" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -234,7 +257,7 @@ msgstr "" msgid "Explore" msgstr "Explorează" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Salut, bine ai venit pe acest site MediaGoblin!" @@ -262,25 +285,21 @@ msgstr "Încă nu ai unul? E simplu!" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -"Creează un cont pe acest site\n" -" sau\n" -" Instalează MediaGoblin pe propriul tău server" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "Cele mai recente fișiere" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "Introdu noua parolă" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Trimite" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -290,17 +309,6 @@ msgstr "Recuperează parola" msgid "Send instructions" msgstr "Trimite instrucțiuni" -#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 -msgid "Your password has been changed. Try to log in now." -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 msgid "" @@ -338,11 +346,11 @@ msgstr "Creează-l aici!" msgid "Forgot your password?" msgstr "Ai uitat parola?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Creează un cont!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Creează" @@ -373,10 +381,16 @@ msgid "Cancel" msgstr "Anulare" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Salvează modificările" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -388,13 +402,32 @@ msgstr "Editare profil %(username)s" msgid "Media tagged with: %(tag_name)s" msgstr "Fișier etichetat cu tag-urile: %(tag_name)s" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "Original" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Trimite fișierele tale media" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -406,31 +439,57 @@ msgstr "Fișierele lui %(username)s" msgid "%(username)s's media" msgstr "Fișierele media ale lui %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" -msgstr "De %(username)s la %(date)s" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" -msgstr "Scrie un comentariu" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" -msgstr "la" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" -msgstr "Trimite comentariul" +msgid "Added on %(date)s." +msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 msgid "Edit" msgstr "Editare" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 msgid "Delete" msgstr "Șterge" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "la" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -515,20 +574,24 @@ msgid "Here's a spot to tell others about yourself." msgstr "Aici poți spune altora ceva despre tine." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Editare profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Acest utilizator nu și-a completat (încă) profilul." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Vezi toate fișierele media ale lui %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." @@ -536,11 +599,8 @@ msgstr "" "Aici vor apărea fișierele tale media, dar se pare că încă nu ai trimis " "nimic." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 -msgid "Add media" -msgstr "Trimite fișier" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Nu pare să existe niciun fișier media deocamdată..." @@ -552,29 +612,35 @@ msgstr "icon feed" msgid "Atom feed" msgstr "feed Atom" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "Mai noi" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Mai vechi" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "Salt la pagina:" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" -msgstr "Tag-uri" +msgid "View more media tagged with" +msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" -msgstr "și" - -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -msgstr "Scrie un comentariu" +msgid "or" +msgstr "" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo index 7e62de83..3ddb0c8e 100644 Binary files a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po index 098ea38c..38748a97 100644 --- a/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/ru/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 19:58+0000\n" -"Last-Translator: aleksejrs \n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" +"Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,27 +23,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Неправильный формат файла." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Логин" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "Адрес электронной почты" @@ -61,7 +49,7 @@ msgstr "" "Сожалеем, но на этот адрес электронной почты уже зарегистрирована другая " "учётная запись." -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -69,23 +57,28 @@ msgstr "" "Адрес вашей электронной потвержден. Вы теперь можете войти и начать " "редактировать свой профиль и загружать новые изображения!" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "Неверный ключ проверки или идентификатор пользователя" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "Вам надо представиться, чтобы мы знали, кому отправлять сообщение!" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "Вы уже потвердили свой адрес электронной почты!" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "Переслать сообщение с подтверждением аккаунта." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -94,48 +87,77 @@ msgstr "" "учётная запись неактивна, либо указанный в ней адрес электронной почты не " "был подтверждён." +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Название" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Описание этого произведения" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Метки" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." -msgstr "Разделяйте метки запятыми." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." +msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "Отличительная часть адреса" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "Отличительная часть адреса необходима" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -"Часть адреса этого файла, производная от его названия. Её обычно не нужно " -"изменять." -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "Биография" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Сайт" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "Старый пароль" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" -msgstr "Новый пароль" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" +msgstr "" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -150,39 +172,43 @@ msgstr "Вы редактируете файлы другого пользова msgid "You are editing a user's profile. Proceed with caution." msgstr "Вы редактируете профиль пользователя. Будьте осторожны." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "Неправильный пароль" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" -msgstr "Профиль изменён!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" +msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" -msgstr "В «{filename}» не обнаружено расширение имени файла" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file 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:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Вы должны загрузить файл." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Ура! Файл загружен!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "Неподходящий тип файла." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Изображение 404 нервничающего гоблина" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Ой!" @@ -196,33 +222,30 @@ msgid "" " been moved or deleted." msgstr "Возможно, страница, которую вы ищете, была удалена или переехала." -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "Изображение 404 нервничающего гоблина" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "Символ MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Загрузить файл" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Добавить файлы" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "Подтвердите ваш адрес электронной почты!" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "завершение сеанса" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Войти" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -234,7 +257,7 @@ msgstr "" msgid "Explore" msgstr "Смотреть" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Привет! Добро пожаловать на наш MediaGoblin’овый сайт!" @@ -263,25 +286,21 @@ msgstr "У вас её ещё нет? Не проблема!" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -"Создайте учётную запись на этом сайте\n" -" или\n" -" Установите MediaGoblin на собственный сервер" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "Самые новые файлы" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "Введите свой новый пароль" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Подтвердить" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -291,17 +310,6 @@ msgstr "Сброс пароля" msgid "Send instructions" 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 "" @@ -341,11 +349,11 @@ msgstr "Создайте здесь!" msgid "Forgot your password?" msgstr "Забыли свой пароль?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Создать аккаунт!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Создать" @@ -376,10 +384,16 @@ msgid "Cancel" msgstr "Отменить" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Сохранить изменения" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -391,13 +405,32 @@ msgstr "Редактирование профиля %(username)s" msgid "Media tagged with: %(tag_name)s" msgstr "Файлы с меткой: %(tag_name)s" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "Оригинал" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Загрузить файл(ы)" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -409,31 +442,57 @@ msgstr "Файлы %(username)s" msgid "%(username)s's media" msgstr "Файлы пользователя %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" -msgstr "Загружено %(username)s %(date)s" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" -msgstr "Оставить комментарий" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" -msgstr "в" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" -msgstr "Разместить комментарий!" +msgid "Added on %(date)s." +msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 msgid "Edit" msgstr "Изменить" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 msgid "Delete" msgstr "Удалить" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "в" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -520,30 +579,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "Здесь вы можете рассказать о себе." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Редактировать профиль" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Это пользователь не заполнил свой профайл (пока)." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Смотреть все файлы %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 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:152 -msgid "Add media" -msgstr "Добавить файлы" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Пока что тут файлов нет…" @@ -555,29 +615,35 @@ msgstr "значок ленты" msgid "Atom feed" msgstr "лента в формате Atom" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "Более новые" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Более старые" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "Перейти к странице:" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" -msgstr "Метки:" +msgid "View more media tagged with" +msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" -msgstr "и" - -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -msgstr "Комментарий" +msgid "or" +msgstr "" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo index 5ab7befa..2d3f505f 100644 Binary files a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po index 34cf1679..53ad3080 100644 --- a/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sk/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-10 23:09+0000\n" -"Last-Translator: martin \n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" +"Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,27 +23,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Odovzdaný nesprávny súbor pre daný typ média." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Prihlasovacie meno" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "E-mailová adresa" @@ -59,7 +47,7 @@ msgstr "Prepáč, rovnaké prihlasovacie meno už niekto používa." msgid "Sorry, a user with that email address already exists." msgstr "Prepáč, používateľ s rovnakou e-mailovou adresou už existuje." -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -67,70 +55,108 @@ 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 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" -msgstr "Nesprávny overovací kľúč alebo používateľské ID" +msgstr "Nesprávny overovací kľúč alebo používateľský identifikátor" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" -msgstr "Aby sme ti mohli zaslať e-mail, je potrebné byť prihláseným!" +msgstr "" +"Aby sme ti mohli zaslať e-mailovú správu, je potrebné byť prihláseným!" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "Tvoja e-mailová adresa už bola raz overená!" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." -msgstr "Opätovne zaslať overovaciu správu." +msgstr "Opätovne zaslať overovaciu správu na e-mail." + +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:270 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á." +"Nebolo ti možné zaslať e-mailovú správu ohľadom obnovy hesla, nakoľko je " +"tvoje používateľské meno buď neaktívne alebo e-mailová adresa účtu " +"neoverená." + +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Nadpis" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Charakteristika tohto diela" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" -msgstr "Štítky" +msgstr "Značky" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." -msgstr "Oddeľ štítky pomocou čiarky." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." +msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "Unikátna časť adresy" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" -msgstr "Unikátna časť adresy musí byť vyplnená" +msgstr "Unikátna časť adresy nesmie byť prázdna" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 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íš." +"The title part of this media's address. You usually don't need to change " +"this." +msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "Bio" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Webstránka" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "Staré heslo" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" -msgstr "Nové heslo" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" +msgstr "" #: mediagoblin/edit/views.py:65 msgid "An entry with that slug already exists for this user." @@ -138,45 +164,49 @@ msgstr "Položku s rovnakou unikátnou časťou adresy už niekde máš." #: mediagoblin/edit/views.py:86 msgid "You are editing another user's media. Proceed with caution." -msgstr "Upravuješ médiá niekoho iného. Pristupuj opatrne." +msgstr "Upravuješ médiá niekoho iného. Dbaj na to." #: mediagoblin/edit/views.py:156 msgid "You are editing a user's profile. Proceed with caution." -msgstr "Upravuješ používateľský profil. Pristupuj opatrne." +msgstr "Upravuješ používateľský profil. Dbaj na to." + +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "Nesprávne heslo" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" -msgstr "Profil upravený!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" +msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" -msgstr "Nebolo možné nájsť žiadnu príponu v súbore \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" +msgstr "" #: 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:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." -msgstr "Poskytni súbor." +msgstr "Musíš poskytnúť súbor." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Juchú! Úspešne vložené!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "Nesprávny typ súboru." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Obrázok stresujúceho goblina pri chybovom kóde č. 404" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Ajaj!" @@ -192,33 +222,30 @@ 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:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "MediaGoblin logo" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Vložiť výtvor" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Pridať výtvor" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" -msgstr "Over si e-mail!" +msgstr "Over si e-mailovú adresu!" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" -msgstr "odhlásenie" +msgstr "odhlásiť sa" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Prihlásenie" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -230,7 +257,7 @@ msgstr "" msgid "Explore" msgstr "Preskúmať" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "Ahoj, vitaj na tejto MediaGoblin stránke!" @@ -258,25 +285,21 @@ msgstr "Ešte žiaden nemáš? Je to jednoduché!" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" 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:44 +#: mediagoblin/templates/mediagoblin/root.html:40 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/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Vložiť" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -284,18 +307,7 @@ msgstr "Obnoviť heslo" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:30 msgid "Send instructions" -msgstr "Zaslať inštrukcie" - -#: 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." +msgstr "Zaslať postup" #: mediagoblin/templates/mediagoblin/auth/fp_verification_email.txt:19 #, python-format @@ -312,12 +324,11 @@ msgid "" 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" +"pre zmenu svojho hesla k GNU MediaGoblin účtu, otvor nasledujúci odkaz vo 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!" +"Pokiaľ si myslíš, že došlo k omylu, tak jednoducho ignoruj túto správu a buď šťastným goblinom!" #: mediagoblin/templates/mediagoblin/auth/login.html:30 msgid "Logging in failed!" @@ -329,17 +340,17 @@ msgstr "Ešte nemáš účet?" #: mediagoblin/templates/mediagoblin/auth/login.html:36 msgid "Create one here!" -msgstr "Vytvoriť jeden tu!" +msgstr "Vytvor si jeden tu!" #: mediagoblin/templates/mediagoblin/auth/login.html:42 msgid "Forgot your password?" msgstr "Zabudnuté heslo?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Vytvoriť účet!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Vytvoriť" @@ -355,7 +366,7 @@ msgid "" msgstr "" "Ahoj %(username)s,\n" "\n" -"pre aktiváciu tvojho GNU MediaGoblin účtu, otvor nasledujúci URL odkaz vo\n" +"pre aktiváciu tvojho GNU MediaGoblin účtu, otvor nasledujúci odkaz vo\n" "svojom prehliadači:\n" "\n" "%(verification_url)s" @@ -371,10 +382,16 @@ msgid "Cancel" msgstr "Zrušiť" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Uložiť zmeny" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -384,51 +401,96 @@ msgstr "Úprava profilu, ktorý vlastní %(username)s" #: mediagoblin/templates/mediagoblin/listings/tag.html:35 #, python-format msgid "Media tagged with: %(tag_name)s" -msgstr "Výtvory označené s: %(tag_name)s" +msgstr "Výtvory označené ako: %(tag_name)s" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "Originál" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Vlož svoj výtvor" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format msgid "%(username)s's media" -msgstr "Výtvory používateľa %(username)s" +msgstr "Výtvory, ktoré vlastní %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:37 #, python-format msgid "%(username)s's media" -msgstr "Výtvory, ktoré vlastní %(username)s" +msgstr "Výtvory, ktoré vlastní %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" -msgstr "Od %(username)s v čase %(date)s" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" -msgstr "Zaslať komentár" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" -msgstr "o" - -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" -msgstr "Zaslať komentár!" +msgid "Added on %(date)s." +msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 msgid "Edit" msgstr "Upraviť" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 msgid "Delete" msgstr "Odstrániť" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "o" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " +msgstr "" + #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 #, python-format msgid "Really delete %(title)s?" @@ -440,24 +502,24 @@ msgstr "Odstrániť navždy" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:22 msgid "Media processing panel" -msgstr "Sekcia spracovania médií" +msgstr "Sekcia spracovania výtvorov" #: 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." +msgstr "Tu môžeš sledovať priebeh spracovania výtvorov pre svoju galériu." #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:28 msgid "Media in-processing" -msgstr "Médiá v procese spracovania" +msgstr "Výtvory sa spracúvajú" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:46 msgid "No media in-processing" -msgstr "Žiadne médiá v procese spracovania" +msgstr "Žiadne výtvory sa nespracúvajú" #: mediagoblin/templates/mediagoblin/user_pages/processing_panel.html:50 msgid "These uploads failed to process:" -msgstr "Nasledovné vloženia neprešli spracovaním:" +msgstr "Nasledovné nahratia neprešli spracovaním:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:31 #: mediagoblin/templates/mediagoblin/user_pages/user.html:89 @@ -467,7 +529,7 @@ msgstr "Profil, ktorý vlastní %(username)s" #: mediagoblin/templates/mediagoblin/user_pages/user.html:43 msgid "Sorry, no such user found." -msgstr "Prepáč, používateľské meno nenájdené." +msgstr "Prepáč, zadané používateľské meno nenájdené." #: mediagoblin/templates/mediagoblin/user_pages/user.html:50 #: mediagoblin/templates/mediagoblin/user_pages/user.html:70 @@ -481,7 +543,7 @@ msgstr "Takmer hotovo! Ešte ti musí byť aktivovaný účet." #: mediagoblin/templates/mediagoblin/user_pages/user.html:58 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ť." +msgstr "E-mailová správa s popisom ako to spraviť, by mal zanedlho doraziť." #: mediagoblin/templates/mediagoblin/user_pages/user.html:62 msgid "In case it doesn't:" @@ -489,7 +551,7 @@ msgstr "V prípade, že sa tak nestalo:" #: mediagoblin/templates/mediagoblin/user_pages/user.html:65 msgid "Resend verification email" -msgstr "Opätovne zaslať overovaciu správu" +msgstr "Opätovne zaslať overovaciu správu na e-mail" #: mediagoblin/templates/mediagoblin/user_pages/user.html:73 msgid "" @@ -505,41 +567,42 @@ msgid "" "If you are that person but you've lost your verification email, you can log in and resend it." msgstr "" -"Pokiaľ si to ty, ale už nemáš overovaciu správu, tak sa môžeš prihlásiť a preposlať si ju." #: mediagoblin/templates/mediagoblin/user_pages/user.html:96 msgid "Here's a spot to tell others about yourself." -msgstr "Povedz tu o sebe ostatným." +msgstr "Miesto, kde smieš povedať čo to o sebe ostatným." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Upraviť profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." -msgstr "Dotyčná osoba ešte nevyplnila svoj profil (zatiaľ)." +msgstr "Dotyčný používateľ ešte nevyplnil svoj profil (zatiaľ)." + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, 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:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 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:152 -msgid "Add media" -msgstr "Pridať výtvor" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." -msgstr "Najskôr tu ešte nebudú žiadne výtvory..." +msgstr "Najskôr sa tu ešte nenachádzajú žiadne výtvory..." #: mediagoblin/templates/mediagoblin/utils/feed_link.html:21 msgid "feed icon" @@ -549,29 +612,35 @@ msgstr "ikona čítačky" 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:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Staršie" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" -msgstr "Ísť na stránku:" +msgstr "Prejsť na stránku:" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" -msgstr "Označené s" +msgid "View more media tagged with" +msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" -msgstr "a" - -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -msgstr "Komentár" +msgid "or" +msgstr "" #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" @@ -587,14 +656,14 @@ msgstr "Tvoj komentár bol zaslaný!" #: mediagoblin/user_pages/views.py:183 msgid "You deleted the media." -msgstr "Výtvor bol odstránený tebou." +msgstr "Výtvor bol tebou odstránený." #: mediagoblin/user_pages/views.py:190 msgid "The media was not deleted because you didn't check that you were sure." -msgstr "Výtvor nebol odstránený, nakoľko chýbala tvoja konfirmácia." +msgstr "Výtvor nebol odstránený, nakoľko chýbalo tvoje potvrdenie." #: mediagoblin/user_pages/views.py:198 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." +msgstr "Chystáš sa odstrániť výtvory niekoho iného. Dbaj na to." diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo index 9ad54a83..73bb4113 100644 Binary files a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po index ffd2c04c..c5d3104c 100644 --- a/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sl/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -23,27 +23,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Za vrsto vsebine je bila podana napačna datoteka." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Uporabniško ime" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 msgid "Password" msgstr "Geslo" -#: mediagoblin/auth/forms.py:35 -msgid "Passwords must match." -msgstr "Gesli morata biti enaki." - -#: mediagoblin/auth/forms.py:37 -msgid "Confirm password" -msgstr "Potrdite geslo" - -#: mediagoblin/auth/forms.py:39 -msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "" - -#: mediagoblin/auth/forms.py:42 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "E-poštni naslov" @@ -59,7 +47,7 @@ msgstr "Oprostite, uporabnik s tem imenom že obstaja." msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -67,67 +55,103 @@ msgstr "" "Vaš e-poštni naslov je bil potrjen. Sedaj se lahko prijavite, uredite svoj " "profil in pošljete slike." -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "Potrditveni ključ ali uporabniška identifikacija je napačna" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "Ponovno pošiljanje potrditvene e-pošte." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Naslov" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Oznake" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "Oznaka" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "Oznaka ne sme biti prazna" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "Biografija" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Spletna stran" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -142,39 +166,43 @@ msgstr "Urejate vsebino drugega uporabnika. Nadaljujte pazljivo." msgid "You are editing a user's profile. Proceed with caution." msgstr "Urejate uporabniški profil. Nadaljujte pazljivo." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Datoteka" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Podati morate datoteko." -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Juhej! Poslano." -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "" +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Slika napake 404 s paničnim škratom" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Opa!" @@ -190,33 +218,30 @@ msgstr "" "Če ste v točnost naslova prepričani, je bila iskana stran morda premaknjena " "ali pa izbrisana." -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "Slika napake 404 s paničnim škratom" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "Logotip MediaGoblin" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Pošlji vsebino" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Dodaj vsebino" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Prijava" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -226,7 +251,7 @@ msgstr "" msgid "Explore" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -250,22 +275,21 @@ msgstr "" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Pošlji" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -275,15 +299,6 @@ msgstr "" msgid "Send instructions" 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 "" @@ -314,11 +329,11 @@ msgstr "Ustvarite si ga." msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Ustvarite račun." -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Ustvari" @@ -350,10 +365,16 @@ msgid "Cancel" msgstr "Prekliči" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Shrani spremembe" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -365,13 +386,32 @@ msgstr "Urejanje profila – %(username)s" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Pošljite svojo vsebino" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -383,29 +423,55 @@ msgstr "" msgid "%(username)s's media" msgstr "Vsebina uporabnika %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -492,30 +558,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "Na tem mestu lahko drugim poveste nekaj o sebi." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Uredi profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Ta uporabnik še ni izpolnil svojega profila." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Prikaži vso vsebino uporabnika %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." msgstr "Tu bo prikazana vaša vsebina, a trenutno še niste dodali nič." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 -msgid "Add media" -msgstr "Dodaj vsebino" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Videti je, da tu še ni nobene vsebine ..." @@ -527,30 +594,36 @@ msgstr "Ikona vira" msgid "Atom feed" msgstr "Ikona Atom" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +msgid "View more media tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +msgid "or" msgstr "" -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -msgstr "Komentar" - #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" msgstr "" diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo index ece8989f..2a99cb53 100644 Binary files a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po index 942f7203..cdfdad05 100644 --- a/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sr/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: Serbian (http://www.transifex.net/projects/p/mediagoblin/team/sr/)\n" "MIME-Version: 1.0\n" @@ -22,27 +22,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "" -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "" @@ -58,73 +46,109 @@ msgstr "" msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -139,39 +163,43 @@ msgstr "" msgid "You are editing a user's profile. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/submit/forms.py:25 -msgid "File" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" +#: mediagoblin/submit/forms.py:25 +msgid "File" msgstr "" -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" msgstr "" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "" @@ -185,33 +213,30 @@ msgid "" " been moved or deleted." msgstr "" -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -221,7 +246,7 @@ msgstr "" msgid "Explore" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -245,21 +270,20 @@ msgstr "" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 @@ -270,15 +294,6 @@ msgstr "" msgid "Send instructions" 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 "" @@ -309,11 +324,11 @@ msgstr "" msgid "Forgot your password?" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "" @@ -339,10 +354,16 @@ msgid "Cancel" msgstr "" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -354,12 +375,31 @@ msgstr "" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 @@ -372,29 +412,55 @@ msgstr "" msgid "%(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -477,30 +543,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 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:152 -msgid "Add media" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -512,28 +579,34 @@ msgstr "" msgid "Atom feed" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" msgstr "" -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" +#: mediagoblin/templates/mediagoblin/utils/tags.html:20 +msgid "View more media tagged with" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/tags.html:25 +msgid "or" msgstr "" #: mediagoblin/user_pages/forms.py:30 diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo index c6cf0df9..d647e373 100644 Binary files a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po index e195ad70..acace870 100644 --- a/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/sv/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/mediagoblin/team/sv/)\n" "MIME-Version: 1.0\n" @@ -24,27 +24,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "Ogiltig fil för mediatypen." -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "Användarnamn" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 msgid "Password" msgstr "Lösenord" -#: mediagoblin/auth/forms.py:35 -msgid "Passwords must match." -msgstr "Lösenorden måste vara identiska." - -#: mediagoblin/auth/forms.py:37 -msgid "Confirm password" -msgstr "Bekräfta lösenord" - -#: mediagoblin/auth/forms.py:39 -msgid "Type it again here to make sure there are no spelling mistakes." -msgstr "Skriv in det igen för att undvika stavfel." - -#: mediagoblin/auth/forms.py:42 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "E-postadress" @@ -60,7 +48,7 @@ msgstr "En användare med det användarnamnet finns redan." msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" @@ -68,23 +56,28 @@ msgstr "" "Din e-postadress är verifierad. Du kan nu logga in, redigera din profil och " "ladda upp filer!" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "Verifieringsnyckeln eller användar-IDt är fel." -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "Skickade ett nytt verifierings-email." -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." @@ -92,45 +85,76 @@ 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/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "Titel" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "Beskrivning av verket" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "Taggar" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "Sökvägsnamn" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "Sökvägsnamnet kan inte vara tomt" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 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." +"The title part of this media's address. You usually don't need to change " +"this." +msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "Presentation" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "Hemsida" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -145,39 +169,43 @@ msgstr "Var försiktig, du redigerar någon annans inlägg." msgid "You are editing a user's profile. Proceed with caution." msgstr "Var försiktig, du redigerar en annan användares profil." -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" +msgstr "" + +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" #: mediagoblin/submit/forms.py:25 msgid "File" msgstr "Fil" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" -msgstr "Beskrivning av verket" - -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "Du måste ange en fil" -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "Tjohoo! Upladdat!" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." -msgstr "" +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" +msgstr "Bild av stressat 404-troll." -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "Ojoj!" @@ -193,33 +221,30 @@ msgstr "" "Om du är säker på att adressen stämmer så kanske sidan du letar efter har " "flyttats eller tagits bort." -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "Bild av stressat 404-troll." - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "MediaGoblin-logotyp" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" -msgstr "Ladda upp" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" +msgstr "Lägg till media" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "Logga in" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -231,7 +256,7 @@ msgstr "" msgid "Explore" msgstr "Utforska" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -255,22 +280,21 @@ msgstr "" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "Senast medier" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" -msgstr "Fyll i ditt lösenord" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" +msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "Skicka" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -280,17 +304,6 @@ msgstr "" msgid "Send instructions" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/fp_changed_success.html:22 -msgid "Your password has been changed. Try to log in now." -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 msgid "" @@ -329,11 +342,11 @@ msgstr "Skapa ett här!" msgid "Forgot your password?" msgstr "Glömt ditt lösenord?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "Skapa ett konto!" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "Skapa" @@ -364,10 +377,16 @@ msgid "Cancel" msgstr "Avbryt" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "Spara ändringar" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -379,13 +398,32 @@ msgstr "Redigerar %(username)ss profil" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" -msgstr "Ladda upp" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" +msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 #, python-format @@ -397,29 +435,55 @@ msgstr "" msgid "%(username)s's media" msgstr "%(username)ss media" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -508,20 +572,24 @@ msgid "Here's a spot to tell others about yourself." msgstr "Här kan du berätta för andra om dig själv." #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "Redigera profil" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "Den här användaren har inte fyllt i sin profilsida ännu." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "Se all media från %(username)s" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 msgid "" "This is where your media will appear, but you don't seem to have added " "anything yet." @@ -529,11 +597,8 @@ msgstr "" "Här kommer din media att dyka upp, du verkar inte ha lagt till någonting " "ännu." -#: mediagoblin/templates/mediagoblin/user_pages/user.html:152 -msgid "Add media" -msgstr "Lägg till media" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "Det verkar inte finnas någon media här ännu." @@ -545,30 +610,36 @@ msgstr "feed-ikon" msgid "Atom feed" msgstr "Atom-feed" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" -msgstr "Nyare" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" -msgstr "Äldre" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" +msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +msgid "View more media tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +msgid "or" msgstr "" -#: mediagoblin/user_pages/forms.py:24 -msgid "Comment" -msgstr "Kommentar" - #: mediagoblin/user_pages/forms.py:30 msgid "I am sure I want to delete this" msgstr "Jag är säker på att jag vill radera detta" diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo index cd9fab9f..5480404c 100644 Binary files a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.mo differ diff --git a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po index f7bbd6ac..14e12315 100644 --- a/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po +++ b/mediagoblin/i18n/te/LC_MESSAGES/mediagoblin.po @@ -1,5 +1,5 @@ # Translations template for PROJECT. -# Copyright (C) 2011 ORGANIZATION +# Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: @@ -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-12-04 10:24-0600\n" -"PO-Revision-Date: 2011-12-04 16:23+0000\n" +"POT-Creation-Date: 2012-01-07 13:47-0600\n" +"PO-Revision-Date: 2012-01-07 19:44+0000\n" "Last-Translator: cwebber \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -23,27 +23,15 @@ msgstr "" msgid "Invalid file given for media type." msgstr "" -#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:49 +#: mediagoblin/auth/forms.py:25 mediagoblin/auth/forms.py:41 msgid "Username" msgstr "వాడుకరి పేరు" -#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:53 +#: mediagoblin/auth/forms.py:30 mediagoblin/auth/forms.py:45 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 +#: mediagoblin/auth/forms.py:34 msgid "Email address" msgstr "ఈమెయిలు చిరునామా" @@ -59,73 +47,109 @@ msgstr "" msgid "Sorry, a user with that email address already exists." msgstr "" -#: mediagoblin/auth/views.py:179 +#: mediagoblin/auth/views.py:180 msgid "" "Your email address has been verified. You may now login, edit your profile, " "and submit images!" msgstr "" -#: mediagoblin/auth/views.py:185 +#: mediagoblin/auth/views.py:186 msgid "The verification key or user id is incorrect" msgstr "" -#: mediagoblin/auth/views.py:203 +#: mediagoblin/auth/views.py:204 msgid "You must be logged in so we know who to send the email to!" msgstr "" -#: mediagoblin/auth/views.py:211 +#: mediagoblin/auth/views.py:212 msgid "You've already verified your email address!" msgstr "" -#: mediagoblin/auth/views.py:224 +#: mediagoblin/auth/views.py:225 msgid "Resent your verification email." msgstr "" -#: mediagoblin/auth/views.py:265 +#: mediagoblin/auth/views.py:260 +msgid "" +"An email has been sent with instructions on how to change your password." +msgstr "" + +#: mediagoblin/auth/views.py:270 msgid "" "Could not send password recovery email as your username is inactive or your " "account's email address has not been verified." msgstr "" +#: mediagoblin/auth/views.py:282 +msgid "Couldn't find someone with that username or email." +msgstr "" + +#: mediagoblin/auth/views.py:330 +msgid "You can now log in using your new password." +msgstr "" + #: mediagoblin/edit/forms.py:24 mediagoblin/submit/forms.py:27 msgid "Title" msgstr "శీర్షిక" -#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:32 +#: mediagoblin/edit/forms.py:27 mediagoblin/submit/forms.py:30 +msgid "Description of this work" +msgstr "" + +#: mediagoblin/edit/forms.py:28 mediagoblin/submit/forms.py:31 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:32 mediagoblin/submit/forms.py:35 msgid "Tags" msgstr "" -#: mediagoblin/edit/forms.py:30 mediagoblin/submit/forms.py:34 -msgid "Seperate tags by commas." +#: mediagoblin/edit/forms.py:34 mediagoblin/submit/forms.py:37 +msgid "Separate tags by commas." msgstr "" -#: mediagoblin/edit/forms.py:33 +#: mediagoblin/edit/forms.py:37 msgid "Slug" msgstr "" -#: mediagoblin/edit/forms.py:34 +#: mediagoblin/edit/forms.py:38 msgid "The slug can't be empty" msgstr "" -#: mediagoblin/edit/forms.py:35 +#: mediagoblin/edit/forms.py:39 msgid "" -"The title part of this media's URL. You usually don't need to change this." +"The title part of this media's address. You usually don't need to change " +"this." msgstr "" -#: mediagoblin/edit/forms.py:42 +#: mediagoblin/edit/forms.py:46 msgid "Bio" msgstr "" -#: mediagoblin/edit/forms.py:45 +#: mediagoblin/edit/forms.py:48 +msgid "" +"You can use\n" +" \n" +" Markdown for formatting." +msgstr "" + +#: mediagoblin/edit/forms.py:53 msgid "Website" msgstr "" -#: mediagoblin/edit/forms.py:49 +#: mediagoblin/edit/forms.py:60 msgid "Old password" msgstr "" -#: mediagoblin/edit/forms.py:52 -msgid "New Password" +#: mediagoblin/edit/forms.py:62 +msgid "Enter your old password to prove you own this account." +msgstr "" + +#: mediagoblin/edit/forms.py:65 +msgid "New password" msgstr "" #: mediagoblin/edit/views.py:65 @@ -140,39 +164,43 @@ msgstr "" msgid "You are editing a user's profile. Proceed with caution." msgstr "" -#: mediagoblin/edit/views.py:171 +#: mediagoblin/edit/views.py:174 +msgid "Profile changes saved" +msgstr "" + +#: mediagoblin/edit/views.py:200 msgid "Wrong password" msgstr "" -#: mediagoblin/edit/views.py:192 -msgid "Profile edited!" +#: mediagoblin/edit/views.py:216 +msgid "Account settings saved" msgstr "" -#: mediagoblin/media_types/__init__.py:65 -msgid "Could not find any file extension in \"{filename}\"" +#: mediagoblin/media_types/__init__.py:77 +msgid "Could not extract any file extension from \"{filename}\"" msgstr "" -#: mediagoblin/submit/forms.py:25 -msgid "File" +#: mediagoblin/media_types/__init__.py:88 +msgid "Sorry, I don't support that file type :(" msgstr "" -#: mediagoblin/submit/forms.py:30 -msgid "Description of this work" +#: mediagoblin/submit/forms.py:25 +msgid "File" msgstr "" -#: mediagoblin/submit/views.py:49 +#: mediagoblin/submit/views.py:50 msgid "You must provide a file." msgstr "" -#: mediagoblin/submit/views.py:127 +#: mediagoblin/submit/views.py:128 msgid "Woohoo! Submitted!" msgstr "" -#: mediagoblin/submit/views.py:133 -msgid "Invalid file type." +#: mediagoblin/templates/mediagoblin/404.html:22 +msgid "Image of 404 goblin stressing out" msgstr "" -#: mediagoblin/templates/mediagoblin/404.html:21 +#: mediagoblin/templates/mediagoblin/404.html:23 msgid "Oops!" msgstr "" @@ -186,33 +214,30 @@ msgid "" " been moved or deleted." msgstr "" -#: mediagoblin/templates/mediagoblin/404.html:32 -msgid "Image of 404 goblin stressing out" -msgstr "" - -#: mediagoblin/templates/mediagoblin/base.html:49 +#: mediagoblin/templates/mediagoblin/base.html:48 msgid "MediaGoblin logo" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:54 -msgid "Submit media" +#: mediagoblin/templates/mediagoblin/base.html:53 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:157 +msgid "Add media" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:65 +#: mediagoblin/templates/mediagoblin/base.html:64 msgid "Verify your email!" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:72 +#: mediagoblin/templates/mediagoblin/base.html:71 msgid "log out" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:75 +#: mediagoblin/templates/mediagoblin/base.html:74 #: mediagoblin/templates/mediagoblin/auth/login.html:27 #: mediagoblin/templates/mediagoblin/auth/login.html:45 msgid "Log in" msgstr "" -#: mediagoblin/templates/mediagoblin/base.html:91 +#: mediagoblin/templates/mediagoblin/base.html:86 msgid "" "Powered by MediaGoblin, a GNU project" @@ -222,7 +247,7 @@ msgstr "" msgid "Explore" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:27 +#: mediagoblin/templates/mediagoblin/root.html:26 msgid "Hi there, welcome to this MediaGoblin site!" msgstr "" @@ -246,22 +271,21 @@ msgstr "" #, python-format msgid "" "Create an account at this site\n" -" or\n" -" Set up MediaGoblin on your own server" +" or\n" +" Set up MediaGoblin on your own server" msgstr "" -#: mediagoblin/templates/mediagoblin/root.html:44 +#: mediagoblin/templates/mediagoblin/root.html:40 msgid "Most recent media" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:29 -msgid "Enter your new password" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:32 +msgid "Set your new password" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/change_fp.html:33 -#: mediagoblin/templates/mediagoblin/submit/start.html:30 -msgid "Submit" -msgstr "దాఖలు చెయ్యి" +#: mediagoblin/templates/mediagoblin/auth/change_fp.html:35 +msgid "Set password" +msgstr "" #: mediagoblin/templates/mediagoblin/auth/forgot_password.html:27 msgid "Recover password" @@ -271,15 +295,6 @@ msgstr "" msgid "Send instructions" 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 "" @@ -310,11 +325,11 @@ msgstr "" msgid "Forgot your password?" msgstr "మీ సంకేతపదాన్ని మర్చిపోయారా?" -#: mediagoblin/templates/mediagoblin/auth/register.html:27 +#: mediagoblin/templates/mediagoblin/auth/register.html:32 msgid "Create an account!" msgstr "" -#: mediagoblin/templates/mediagoblin/auth/register.html:31 +#: mediagoblin/templates/mediagoblin/auth/register.html:36 msgid "Create" msgstr "" @@ -340,10 +355,16 @@ msgid "Cancel" msgstr "రద్దుచేయి" #: mediagoblin/templates/mediagoblin/edit/edit.html:37 +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:40 #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:35 msgid "Save changes" msgstr "మార్పులను భద్రపరచు" +#: mediagoblin/templates/mediagoblin/edit/edit_account.html:34 +#, python-format +msgid "Changing %(username)s's account settings" +msgstr "" + #: mediagoblin/templates/mediagoblin/edit/edit_profile.html:29 #, python-format msgid "Editing %(username)s's profile" @@ -355,12 +376,31 @@ msgstr "" msgid "Media tagged with: %(tag_name)s" msgstr "" -#: mediagoblin/templates/mediagoblin/media_displays/video.html:19 +#: mediagoblin/templates/mediagoblin/media_displays/ascii.html:34 +#: mediagoblin/templates/mediagoblin/media_displays/video.html:46 msgid "Original" msgstr "" +#: mediagoblin/templates/mediagoblin/media_displays/video.html:33 +msgid "" +"Sorry, this video will not work because \n" +"\t your web browser does not support HTML5 \n" +"\t video." +msgstr "" + +#: mediagoblin/templates/mediagoblin/media_displays/video.html:36 +msgid "" +"You can get a modern web browser that \n" +"\t can play this video at \n" +"\t http://getfirefox.com!" +msgstr "" + #: mediagoblin/templates/mediagoblin/submit/start.html:26 -msgid "Submit yer media" +msgid "Add your media" +msgstr "" + +#: mediagoblin/templates/mediagoblin/submit/start.html:30 +msgid "Add" msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/gallery.html:30 @@ -373,29 +413,55 @@ msgstr "" msgid "%(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:57 +#: mediagoblin/templates/mediagoblin/user_pages/media.html:60 #, python-format -msgid "By %(username)s on %(date)s" +msgid "Added on %(date)s." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:67 -msgid "Post a comment" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:69 +msgid "Edit" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:85 -msgid "at" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:73 +msgid "Delete" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:79 +#, python-format +msgid "%(comment_count)s comment" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:102 -msgid "Post comment!" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:81 +#, python-format +msgid "%(comment_count)s comments" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:124 -msgid "Edit" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:83 +msgid "No comments yet." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/media.html:130 -msgid "Delete" +#: mediagoblin/templates/mediagoblin/user_pages/media.html:91 +msgid "Add one" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:100 +msgid "" +"Type your comment here. You can use Markdown for" +" formatting." +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:104 +msgid "Add this comment" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:126 +msgid "at" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/media.html:141 +#, python-format +msgid "

    ❖ Browsing media by %(username)s

    " msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/media_confirm_delete.html:30 @@ -478,30 +544,31 @@ msgid "Here's a spot to tell others about yourself." msgstr "" #: mediagoblin/templates/mediagoblin/user_pages/user.html:101 -#: mediagoblin/templates/mediagoblin/user_pages/user.html:119 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:118 msgid "Edit profile" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:107 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:106 msgid "This user hasn't filled in their profile (yet)." msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:133 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:125 +msgid "Change account settings" +msgstr "" + +#: mediagoblin/templates/mediagoblin/user_pages/user.html:138 #, python-format msgid "View all of %(username)s's media" msgstr "" -#: mediagoblin/templates/mediagoblin/user_pages/user.html:146 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:151 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:152 -msgid "Add media" -msgstr "" - -#: mediagoblin/templates/mediagoblin/user_pages/user.html:158 +#: mediagoblin/templates/mediagoblin/user_pages/user.html:163 +#: mediagoblin/templates/mediagoblin/utils/object_gallery.html:72 msgid "There doesn't seem to be any media here yet..." msgstr "" @@ -513,30 +580,36 @@ msgstr "" msgid "Atom feed" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:40 -msgid "Newer" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:39 +msgid "← Newer" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:46 -msgid "Older" +#: mediagoblin/templates/mediagoblin/utils/pagination.html:45 +msgid "Older →" msgstr "" -#: mediagoblin/templates/mediagoblin/utils/pagination.html:50 +#: mediagoblin/templates/mediagoblin/utils/pagination.html:48 msgid "Go to page:" msgstr "" +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:27 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:32 +msgid "newer" +msgstr "" + +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:38 +#: mediagoblin/templates/mediagoblin/utils/prev_next.html:43 +msgid "older" +msgstr "" + #: mediagoblin/templates/mediagoblin/utils/tags.html:20 -msgid "Tagged with" +msgid "View more media tagged with" msgstr "" #: mediagoblin/templates/mediagoblin/utils/tags.html:25 -msgid "and" +msgid "or" 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 "" diff --git a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo index 6dda94b7..a7820c49 100644 Binary files a/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo and b/mediagoblin/i18n/zh_TW/LC_MESSAGES/mediagoblin.mo differ -- cgit v1.2.3 From f42e49c3ad1c446e7899e7b76cd7fa381d5bba7c Mon Sep 17 00:00:00 2001 From: Elrond Date: Thu, 5 Jan 2012 00:18:17 +0100 Subject: Add DB Mixin classes and use them A bunch of functions on the db objects are really more like "utility functions": They could live outside the classes and be called "by hand" passing the appropiate reference. They usually only use the public API of the object and rarely use database related stuff. Goals: - First, simple: Share the code with the SQL objects, so that the code doesn't need to be duplicated. - Second, it might unclutter the db models and make them more into "model only" stuff. - Doesn't really hurt. --- mediagoblin/db/mixin.py | 90 ++++++++++++++++++++++++++++++++++++++++++ mediagoblin/db/mongo/models.py | 63 ++--------------------------- mediagoblin/db/sql/models.py | 5 ++- 3 files changed, 97 insertions(+), 61 deletions(-) create mode 100644 mediagoblin/db/mixin.py diff --git a/mediagoblin/db/mixin.py b/mediagoblin/db/mixin.py new file mode 100644 index 00000000..4fb325d2 --- /dev/null +++ b/mediagoblin/db/mixin.py @@ -0,0 +1,90 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011,2012 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 . + +""" +This module contains some Mixin classes for the db objects. + +A bunch of functions on the db objects are really more like +"utility functions": They could live outside the classes +and be called "by hand" passing the appropiate reference. +They usually only use the public API of the object and +rarely use database related stuff. + +These functions now live here and get "mixed in" into the +real objects. +""" + +from mediagoblin.auth import lib as auth_lib +from mediagoblin.tools import common + + +class UserMixin(object): + def check_login(self, password): + """ + See if a user can login with this password + """ + return auth_lib.bcrypt_check_password( + password, self.pw_hash) + + +class MediaEntryMixin(object): + def get_display_media(self, media_map, + fetch_order=common.DISPLAY_IMAGE_FETCHING_ORDER): + """ + Find the best media for display. + + Args: + - media_map: a dict like + {u'image_size': [u'dir1', u'dir2', u'image.jpg']} + - fetch_order: the order we should try fetching images in + + Returns: + (media_size, media_path) + """ + media_sizes = media_map.keys() + + for media_size in common.DISPLAY_IMAGE_FETCHING_ORDER: + if media_size in media_sizes: + return media_map[media_size] + + def main_mediafile(self): + pass + + def url_for_self(self, urlgen): + """ + Generate an appropriate url for ourselves + + Use a slug if we have one, else use our '_id'. + """ + uploader = self.get_uploader + + if self.get('slug'): + return urlgen( + 'mediagoblin.user_pages.media_home', + user=uploader.username, + media=self.slug) + else: + return urlgen( + 'mediagoblin.user_pages.media_home', + user=uploader.username, + media=unicode(self._id)) + + def get_fail_exception(self): + """ + Get the exception that's appropriate for this error + """ + if self['fail_error']: + return common.import_component(self['fail_error']) diff --git a/mediagoblin/db/mongo/models.py b/mediagoblin/db/mongo/models.py index 5de59c12..906d2849 100644 --- a/mediagoblin/db/mongo/models.py +++ b/mediagoblin/db/mongo/models.py @@ -18,12 +18,12 @@ import datetime from mongokit import Document -from mediagoblin.auth import lib as auth_lib from mediagoblin import mg_globals from mediagoblin.db.mongo import migrations from mediagoblin.db.mongo.util import ASCENDING, DESCENDING, ObjectId from mediagoblin.tools.pagination import Pagination -from mediagoblin.tools import url, common +from mediagoblin.tools import url +from mediagoblin.db.mixin import UserMixin, MediaEntryMixin ################### # Custom validators @@ -34,7 +34,7 @@ from mediagoblin.tools import url, common ######## -class User(Document): +class User(Document, UserMixin): """ A user of MediaGoblin. @@ -89,15 +89,8 @@ class User(Document): 'status': u'needs_email_verification', 'is_admin': False} - def check_login(self, password): - """ - See if a user can login with this password - """ - return auth_lib.bcrypt_check_password( - password, self.pw_hash) - -class MediaEntry(Document): +class MediaEntry(Document, MediaEntryMixin): """ Record of a piece of media. @@ -224,28 +217,6 @@ class MediaEntry(Document): return self.db.MediaComment.find({ 'media_entry': self._id}).sort('created', order) - def get_display_media(self, media_map, - fetch_order=common.DISPLAY_IMAGE_FETCHING_ORDER): - """ - Find the best media for display. - - Args: - - media_map: a dict like - {u'image_size': [u'dir1', u'dir2', u'image.jpg']} - - fetch_order: the order we should try fetching images in - - Returns: - (media_size, media_path) - """ - media_sizes = media_map.keys() - - for media_size in common.DISPLAY_IMAGE_FETCHING_ORDER: - if media_size in media_sizes: - return media_map[media_size] - - def main_mediafile(self): - pass - def generate_slug(self): self.slug = url.slugify(self.title) @@ -255,25 +226,6 @@ class MediaEntry(Document): if duplicate: self.slug = "%s-%s" % (self._id, self.slug) - def url_for_self(self, urlgen): - """ - Generate an appropriate url for ourselves - - Use a slug if we have one, else use our '_id'. - """ - uploader = self.get_uploader - - if self.get('slug'): - return urlgen( - 'mediagoblin.user_pages.media_home', - user=uploader.username, - media=self.slug) - else: - return urlgen( - 'mediagoblin.user_pages.media_home', - user=uploader.username, - media=unicode(self._id)) - def url_to_prev(self, urlgen): """ Provide a url to the previous entry from this user, if there is one @@ -301,13 +253,6 @@ class MediaEntry(Document): def get_uploader(self): return self.db.User.find_one({'_id': self.uploader}) - def get_fail_exception(self): - """ - Get the exception that's appropriate for this error - """ - if self['fail_error']: - return common.import_component(self['fail_error']) - class MediaComment(Document): """ diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py index 31a6ed3b..95821b4f 100644 --- a/mediagoblin/db/sql/models.py +++ b/mediagoblin/db/sql/models.py @@ -7,6 +7,7 @@ from sqlalchemy import ( from sqlalchemy.orm import relationship from mediagoblin.db.sql.base import GMGTableBase +from mediagoblin.db.mixin import UserMixin, MediaEntryMixin Base = declarative_base(cls=GMGTableBase) @@ -24,7 +25,7 @@ class SimpleFieldAlias(object): setattr(instance, self.fieldname, val) -class User(Base): +class User(Base, UserMixin): __tablename__ = "users" id = Column(Integer, primary_key=True) @@ -48,7 +49,7 @@ class User(Base): _id = SimpleFieldAlias("id") -class MediaEntry(Base): +class MediaEntry(Base, MediaEntryMixin): __tablename__ = "media_entries" id = Column(Integer, primary_key=True) -- cgit v1.2.3 From 7cbbf3e75b2dc67068ec270e53249d95224a86cc Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 9 Jan 2012 14:22:28 +0100 Subject: Create a default logging config paste uses paste.ini to configure python's logging module. Until now, there was NO config, not even a useful default one. This means: any messages went away unseen. Not good. The new default logs everything to stderr at level INFO and higher. Maybe not the best, but a good starting point. --- paste.ini | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/paste.ini b/paste.ini index c729e41d..13c15209 100644 --- a/paste.ini +++ b/paste.ini @@ -19,6 +19,28 @@ use = egg:mediagoblin#app filter-with = beaker config = %(here)s/mediagoblin_local.ini %(here)s/mediagoblin.ini +[loggers] +keys = root + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = INFO +handlers = console + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(asctime)s %(levelname)-7.7s [%(name)s] %(message)s + [app:publicstore_serve] use = egg:Paste#static document_root = %(here)s/user_dev/media/public/ -- cgit v1.2.3 From 1b876ac2ea58830b187463dd3de75299fa257212 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 9 Jan 2012 14:26:01 +0100 Subject: Warn about unknown staticdirect paths. Use pkg_resource to check for the existence of any files referenced by staticdirect. If they don't exist, warn about this. This might raise false warnings in the future for more advanced setups. --- mediagoblin/staticdirect.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mediagoblin/staticdirect.py b/mediagoblin/staticdirect.py index c6d2b374..2bddb160 100644 --- a/mediagoblin/staticdirect.py +++ b/mediagoblin/staticdirect.py @@ -14,9 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -import pkg_resources -import urlparse - #################################### # Staticdirect infrastructure. # Borrowed largely from cc.engine @@ -26,7 +23,9 @@ import urlparse #################################### import pkg_resources -import urlparse +import logging + +_log = logging.getLogger(__name__) class StaticDirect(object): @@ -37,6 +36,10 @@ class StaticDirect(object): if filepath in self.cache: return self.cache[filepath] + if not pkg_resources.resource_exists('mediagoblin', + 'static' + filepath): + _log.info("StaticDirect resource %r not found locally", + filepath) static_direction = self.cache[filepath] = self.get(filepath) return static_direction -- cgit v1.2.3 From 1dc7f28d2476135f9548a92ec1147659f1a4e810 Mon Sep 17 00:00:00 2001 From: Elrond Date: Mon, 9 Jan 2012 14:33:57 +0100 Subject: Fix reset.css reference and drop link to video-js.css 1. reset.css was moved to /css/extlib/ some time ago. So update the staticdirect link to it. 2. We don't have video-js.css (any more?). Drop link to it. --- mediagoblin/templates/mediagoblin/base.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/base.html b/mediagoblin/templates/mediagoblin/base.html index 82ee41b7..5335ebe3 100644 --- a/mediagoblin/templates/mediagoblin/base.html +++ b/mediagoblin/templates/mediagoblin/base.html @@ -22,11 +22,9 @@ {% block title %}{{ app_config['html_title'] }}{% endblock %} + href="{{ request.staticdirect('/css/extlib/reset.css') }}"/> - -- cgit v1.2.3 From c2d6792ddb8d968e0c93a7cdd1da7bdae3b5fa36 Mon Sep 17 00:00:00 2001 From: Elrond Date: Tue, 10 Jan 2012 12:52:01 +0100 Subject: Test Suite: Enable attachments, add failing test attachments are an optional part. But it doesn't hurt to enable them in the test suite at all. Also (with enabled attachmemtns) the main media view fails, if one isn't logged in (joar found it!). So add a simple (currently failing) test for this. --- mediagoblin/tests/test_mgoblin_app.ini | 3 +++ mediagoblin/tests/test_submission.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/mediagoblin/tests/test_mgoblin_app.ini b/mediagoblin/tests/test_mgoblin_app.ini index 2525a4f9..c91ed92b 100644 --- a/mediagoblin/tests/test_mgoblin_app.ini +++ b/mediagoblin/tests/test_mgoblin_app.ini @@ -7,6 +7,9 @@ db_name = __mediagoblin_tests__ # tag parsing tags_max_length = 50 +# So we can start to test attachments: +allow_attachments = True + # Celery shouldn't be set up by the application as it's setup via # mediagoblin.init.celery.from_celery celery_setup_elsewhere = true diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py index 2b17c515..b3c11249 100644 --- a/mediagoblin/tests/test_submission.py +++ b/mediagoblin/tests/test_submission.py @@ -51,11 +51,17 @@ class TestSubmission: self.test_user = test_user + self.login() + + def login(self): self.test_app.post( '/auth/login/', { 'username': u'chris', 'password': 'toast'}) + def logout(self): + self.test_app.get('/auth/logout/') + def test_missing_fields(self): # Test blank form # --------------- @@ -95,6 +101,14 @@ class TestSubmission: assert template.TEMPLATE_TEST_CONTEXT.has_key( 'mediagoblin/user_pages/user.html') + # Make sure the media view is at least reachable, logged in... + self.test_app.get('/u/chris/m/normal-upload-1/') + # ... and logged out too. + self.logout() + self.test_app.get('/u/chris/m/normal-upload-1/') + # Log back in for the remaining tests. + self.login() + # Test PNG # -------- template.clear_test_template_context() -- cgit v1.2.3 From 914b8bcde3e01c2dd3e5679fb7733fc194b34d68 Mon Sep 17 00:00:00 2001 From: Joar Wandborg Date: Tue, 10 Jan 2012 13:12:14 +0100 Subject: Added check for request.user to media.html attachment-related conditional --- mediagoblin/templates/mediagoblin/user_pages/media.html | 1 + 1 file changed, 1 insertion(+) diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 10525f4c..583e4ebd 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -158,6 +158,7 @@

{% endif %} {% if app_config['allow_attachments'] + and request.user and (media.uploader == request.user._id or request.user.is_admin) %}

-- cgit v1.2.3 From 1df68a3524d92caee5601a8acc011ac8e1fe16d4 Mon Sep 17 00:00:00 2001 From: Michele Azzolari Date: Thu, 5 Jan 2012 18:48:23 +0100 Subject: Fixed #724 and added extra infos to the atom feed (author uri and links to the html version of each entry) --- mediagoblin/db/mongo/models.py | 8 +++++--- mediagoblin/listings/views.py | 24 ++++++++++++++++++++---- mediagoblin/user_pages/views.py | 28 ++++++++++++++++++++++++---- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/mediagoblin/db/mongo/models.py b/mediagoblin/db/mongo/models.py index 5de59c12..f1e8eae6 100644 --- a/mediagoblin/db/mongo/models.py +++ b/mediagoblin/db/mongo/models.py @@ -255,7 +255,7 @@ class MediaEntry(Document): if duplicate: self.slug = "%s-%s" % (self._id, self.slug) - def url_for_self(self, urlgen): + def url_for_self(self, urlgen, **extra_args): """ Generate an appropriate url for ourselves @@ -267,12 +267,14 @@ class MediaEntry(Document): return urlgen( 'mediagoblin.user_pages.media_home', user=uploader.username, - media=self.slug) + media=self.slug, + **extra_args) else: return urlgen( 'mediagoblin.user_pages.media_home', user=uploader.username, - media=unicode(self._id)) + media=unicode(self._id), + **extra_args) def url_to_prev(self, urlgen): """ diff --git a/mediagoblin/listings/views.py b/mediagoblin/listings/views.py index 3ecf06f4..ca8e8229 100644 --- a/mediagoblin/listings/views.py +++ b/mediagoblin/listings/views.py @@ -77,17 +77,33 @@ def tag_atom_feed(request): cursor = cursor.sort('created', DESCENDING) cursor = cursor.limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS) + """ + ATOM feed id is a tag URI (see http://en.wikipedia.org/wiki/Tag_URI) + """ feed = AtomFeed( "MediaGoblin: Feed for tag '%s'" % tag_slug, feed_url=request.url, - url=request.host_url) - + id='tag:'+request.host+',2011:gallery.tag-%s' % tag_slug, + links=[{'href': request.urlgen( + 'mediagoblin.listings.tags_listing', + qualified=True, tag=tag_slug ), + 'rel': 'alternate', + 'type': 'text/html'}]) for entry in cursor: feed.add(entry.get('title'), entry.get('description_html'), + id=entry.url_for_self(request.urlgen,qualified=True), content_type='html', - author=entry.get_uploader.username, + author={'name': entry.get_uploader.username, + 'uri': request.urlgen( + 'mediagoblin.user_pages.user_home', + qualified=True, user=entry.get_uploader.username)}, updated=entry.get('created'), - url=entry.url_for_self(request.urlgen)) + links=[{ + 'href':entry.url_for_self( + request.urlgen, + qualified=True), + 'rel': 'alternate', + 'type': 'text/html'}]) return feed.get_response() diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py index f721f012..a234722f 100644 --- a/mediagoblin/user_pages/views.py +++ b/mediagoblin/user_pages/views.py @@ -225,17 +225,37 @@ def atom_feed(request): .sort('created', DESCENDING) \ .limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS) - feed = AtomFeed(request.matchdict['user'], + """ + ATOM feed id is a tag URI (see http://en.wikipedia.org/wiki/Tag_URI) + """ + feed = AtomFeed( + "MediaGoblin: Feed for user '%s'" % request.matchdict['user'], feed_url=request.url, - url=request.host_url) + id='tag:'+request.host+',2011:gallery.user-'+request.matchdict['user'], + links=[{ + 'href': request.urlgen( + 'mediagoblin.user_pages.user_home', + qualified=True,user=request.matchdict['user']), + 'rel': 'alternate', + 'type': 'text/html'}]) for entry in cursor: feed.add(entry.get('title'), entry.get('description_html'), + id=entry.url_for_self(request.urlgen,qualified=True), content_type='html', - author=request.matchdict['user'], + author={ + 'name': entry.get_uploader.username, + 'uri': request.urlgen( + 'mediagoblin.user_pages.user_home', + qualified=True, user=entry.get_uploader.username)}, updated=entry.get('created'), - url=entry.url_for_self(request.urlgen)) + links=[{ + 'href': entry.url_for_self( + request.urlgen, + qualified=True), + 'rel': 'alternate', + 'type': 'text/html'}]) return feed.get_response() -- cgit v1.2.3 From cb7ae1e4331f3521b2028388c3d4ff2555d61eb3 Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 11 Jan 2012 11:16:35 +0100 Subject: Fix url_for_self mixup Move changes from mongo/models:url_for_self back into mixin:url_for_self. --- mediagoblin/db/mixin.py | 8 +++++--- mediagoblin/db/mongo/models.py | 21 --------------------- 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/mediagoblin/db/mixin.py b/mediagoblin/db/mixin.py index 4fb325d2..5145289e 100644 --- a/mediagoblin/db/mixin.py +++ b/mediagoblin/db/mixin.py @@ -63,7 +63,7 @@ class MediaEntryMixin(object): def main_mediafile(self): pass - def url_for_self(self, urlgen): + def url_for_self(self, urlgen, **extra_args): """ Generate an appropriate url for ourselves @@ -75,12 +75,14 @@ class MediaEntryMixin(object): return urlgen( 'mediagoblin.user_pages.media_home', user=uploader.username, - media=self.slug) + media=self.slug, + **extra_args) else: return urlgen( 'mediagoblin.user_pages.media_home', user=uploader.username, - media=unicode(self._id)) + media=unicode(self._id), + **extra_args) def get_fail_exception(self): """ diff --git a/mediagoblin/db/mongo/models.py b/mediagoblin/db/mongo/models.py index d9b5a570..906d2849 100644 --- a/mediagoblin/db/mongo/models.py +++ b/mediagoblin/db/mongo/models.py @@ -226,27 +226,6 @@ class MediaEntry(Document, MediaEntryMixin): if duplicate: self.slug = "%s-%s" % (self._id, self.slug) - def url_for_self(self, urlgen, **extra_args): - """ - Generate an appropriate url for ourselves - - Use a slug if we have one, else use our '_id'. - """ - uploader = self.get_uploader - - if self.get('slug'): - return urlgen( - 'mediagoblin.user_pages.media_home', - user=uploader.username, - media=self.slug, - **extra_args) - else: - return urlgen( - 'mediagoblin.user_pages.media_home', - user=uploader.username, - media=unicode(self._id), - **extra_args) - def url_to_prev(self, urlgen): """ Provide a url to the previous entry from this user, if there is one -- cgit v1.2.3 From 0ab21f981a8a170f5bf4e83f7d56d3ed8fdae467 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sun, 25 Dec 2011 20:04:41 +0100 Subject: Dot-Notation: Some random places --- mediagoblin/auth/views.py | 2 +- mediagoblin/edit/views.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mediagoblin/auth/views.py b/mediagoblin/auth/views.py index 88dc40ad..c04a49a7 100644 --- a/mediagoblin/auth/views.py +++ b/mediagoblin/auth/views.py @@ -205,7 +205,7 @@ def resend_activation(request): return redirect(request, 'mediagoblin.auth.login') - if request.user["email_verified"]: + if request.user.email_verified: messages.add_message( request, messages.ERROR, diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index bae85c5d..ec748028 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -46,7 +46,7 @@ def edit_media(request, media): title=media.title, slug=media.slug, description=media.description, - tags=media_tags_as_string(media['tags'])) + tags=media_tags_as_string(media.tags)) form = forms.EditForm( request.POST, @@ -165,7 +165,7 @@ def edit_profile(request): user.url = unicode(request.POST['url']) user.bio = unicode(request.POST['bio']) - user.bio_html = cleaned_markdown_conversion(user['bio']) + user.bio_html = cleaned_markdown_conversion(user.bio) user.save() @@ -193,7 +193,7 @@ def edit_account(request): if request.method == 'POST' and form.validate(): password_matches = auth_lib.bcrypt_check_password( request.POST['old_password'], - user['pw_hash']) + user.pw_hash) if (request.POST['old_password'] or request.POST['new_password']) and not \ password_matches: @@ -206,7 +206,7 @@ def edit_account(request): 'form': form}) if password_matches: - user['pw_hash'] = auth_lib.bcrypt_gen_password_hash( + user.pw_hash = auth_lib.bcrypt_gen_password_hash( request.POST['new_password']) user.save() @@ -216,7 +216,7 @@ def edit_account(request): _("Account settings saved")) return redirect(request, 'mediagoblin.user_pages.user_home', - user=user['username']) + user=user.username) return render_to_response( request, -- cgit v1.2.3 From 02db7e0a83fc06eaa8e96888f6c9e4fb44e7cbe2 Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 31 Dec 2011 23:01:34 +0100 Subject: Add MediaFile table and related infrastructure. - This adds a new SQL table field type for path tuples. They're stored as '/' separated unicode strings. - Uses it to implement a MediaFile table. - Add relationship and proxy fields on MediaEntry to give a nice media_files "view" there. - Let the converter fill the MediaFile. --- mediagoblin/db/sql/convert.py | 7 ++++++- mediagoblin/db/sql/extratypes.py | 18 ++++++++++++++++++ mediagoblin/db/sql/models.py | 27 +++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 mediagoblin/db/sql/extratypes.py diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py index 6698b767..88614fd4 100644 --- a/mediagoblin/db/sql/convert.py +++ b/mediagoblin/db/sql/convert.py @@ -2,7 +2,7 @@ from mediagoblin.init import setup_global_and_app_config, setup_database from mediagoblin.db.mongo.util import ObjectId from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment, - Tag, MediaTag) + Tag, MediaTag, MediaFile) from mediagoblin.db.sql.open import setup_connection_and_db_from_config as \ sql_connect from mediagoblin.db.mongo.open import setup_connection_and_db_from_config as \ @@ -70,6 +70,11 @@ def convert_media_entries(mk_db): session.flush() add_obj_ids(entry, new_entry) + for key, value in entry.media_files.iteritems(): + new_file = MediaFile(name=key, file_path=value) + new_file.media_entry = new_entry.id + Session.add(new_file) + session.commit() session.close() diff --git a/mediagoblin/db/sql/extratypes.py b/mediagoblin/db/sql/extratypes.py new file mode 100644 index 00000000..88f556d9 --- /dev/null +++ b/mediagoblin/db/sql/extratypes.py @@ -0,0 +1,18 @@ +from sqlalchemy.types import TypeDecorator, Unicode + + +class PathTupleWithSlashes(TypeDecorator): + "Represents a Tuple of strings as a slash separated string." + + impl = Unicode + + def process_bind_param(self, value, dialect): + if value is not None: + assert len(value), "Does not support empty lists" + value = '/'.join(value) + return value + + def process_result_value(self, value, dialect): + if value is not None: + value = tuple(value.split('/')) + return value diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py index 95821b4f..91092f33 100644 --- a/mediagoblin/db/sql/models.py +++ b/mediagoblin/db/sql/models.py @@ -5,7 +5,10 @@ from sqlalchemy import ( Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey, UniqueConstraint) from sqlalchemy.orm import relationship +from sqlalchemy.orm.collections import attribute_mapped_collection +from sqlalchemy.ext.associationproxy import association_proxy +from mediagoblin.db.sql.extratypes import PathTupleWithSlashes from mediagoblin.db.sql.base import GMGTableBase from mediagoblin.db.mixin import UserMixin, MediaEntryMixin @@ -65,7 +68,7 @@ class MediaEntry(Base, MediaEntryMixin): fail_error = Column(Unicode) fail_metadata = Column(UnicodeText) - queued_media_file = Column(Unicode) + queued_media_file = Column(PathTupleWithSlashes) queued_task_id = Column(Unicode) @@ -75,13 +78,33 @@ class MediaEntry(Base, MediaEntryMixin): get_uploader = relationship(User) + media_files_helper = relationship("MediaFile", + collection_class=attribute_mapped_collection("name"), + cascade="all, delete-orphan" + ) + media_files = association_proxy('media_files_helper', 'file_path', + creator=lambda k,v: MediaFile(name=k, file_path=v) + ) + ## TODO - # media_files # media_data # attachment_files # fail_error +class MediaFile(Base): + __tablename__ = "mediafiles" + + media_entry = Column( + Integer, ForeignKey(MediaEntry.id), + nullable=False, primary_key=True) + name = Column(Unicode, primary_key=True) + file_path = Column(PathTupleWithSlashes) + + def __repr__(self): + return "" % (self.name, self.file_path) + + class Tag(Base): __tablename__ = "tags" -- cgit v1.2.3 From 20659de2344ccb8d14f8deaeaf9628d84a966e5a Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 13 Jan 2012 17:38:20 +0100 Subject: Add CC0 license header to Sphinx MediaGoblin theme (mg.css) --- docs/source/themes/mg/static/mg.css | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/source/themes/mg/static/mg.css b/docs/source/themes/mg/static/mg.css index b9355a5d..96344df4 100644 --- a/docs/source/themes/mg/static/mg.css +++ b/docs/source/themes/mg/static/mg.css @@ -1,3 +1,15 @@ +/* + +MediaGoblin theme - MediaGoblin-style Sphinx documentation theme + +Written in 2012 by Jef van Schendel + +To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty. + +You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see . + +*/ + @import url("basic.css"); /* text fonts and styles */ -- cgit v1.2.3 From fafec727402ef3fa4d806b200f1d86cb91cd6362 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Fri, 13 Jan 2012 23:23:02 +0100 Subject: Remove unnecessary piece of text in media.html. Fix "Markdown text" indentation so they are the same. --- mediagoblin/edit/forms.py | 7 +++---- mediagoblin/templates/mediagoblin/user_pages/media.html | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index 09955874..5c191fba 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -45,10 +45,9 @@ class EditProfileForm(wtforms.Form): bio = wtforms.TextAreaField( _('Bio'), [wtforms.validators.Length(min=0, max=500)], - description=_( - """You can use - - Markdown for formatting.""")) + description=_("""You can use + + Markdown for formatting.""")) url = wtforms.TextField( _('Website'), [wtforms.validators.Optional(), diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 583e4ebd..865a94ab 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -97,7 +97,7 @@ user= media.get_uploader.username, media=media._id) }}" method="POST" id="form_comment">

- {% trans %}Type your comment here. You can use Markdown for formatting.{% endtrans %} + {% trans %}You can use Markdown for formatting.{% endtrans %}

{{ wtforms_util.render_divs(comment_form) }}
-- cgit v1.2.3 From 762d4a0c48e582dba78a27f1a42e367d3f14a891 Mon Sep 17 00:00:00 2001 From: Elrond Date: Fri, 13 Jan 2012 23:38:21 +0100 Subject: Fix request.user==None error If one isn't logged in and views the profile of a user without media, one gets a problem, because request.user is None and has no _id attribute. Fix this. --- mediagoblin/templates/mediagoblin/user_pages/user.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediagoblin/templates/mediagoblin/user_pages/user.html b/mediagoblin/templates/mediagoblin/user_pages/user.html index 0937f97a..d3b4021d 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/user.html +++ b/mediagoblin/templates/mediagoblin/user_pages/user.html @@ -145,7 +145,7 @@ {% include "mediagoblin/utils/feed_link.html" %}
{% else %} - {% if request.user._id == user._id %} + {% if request.user and (request.user._id == user._id) %}

{% trans -%} -- cgit v1.2.3 From 4670ff1c56ed58591945bbf665bbd9d7f72b71a9 Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 13 Jan 2012 20:26:36 -0600 Subject: Simple translation update script --- devtools/update_translations.sh | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 devtools/update_translations.sh diff --git a/devtools/update_translations.sh b/devtools/update_translations.sh new file mode 100644 index 00000000..1708e7e0 --- /dev/null +++ b/devtools/update_translations.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# 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 . + +# exit if anything fails +set -e + +echo "==> checking out master" +git checkout master + +echo "==> pulling git master" +git pull + +echo "==> pulling present translations" +./bin/tx pull -a +git add mediagoblin/i18n/ +git commit -m "Committing present MediaGoblin translations before pushing extracted messages" + +echo "==> Extracting translations" +./bin/pybabel extract -F babel.ini -o mediagoblin/i18n/en/LC_MESSAGES/mediagoblin.po . + +echo "==> Pushing extracted translations to Transifex" +./bin/tx push -s + +# gets the new strings added to all files +echo "==> Re-Pulling translations from Transifex" +./bin/tx pull -a + +echo "==> Compiling .mo files" +./bin/pybabel compile -D mediagoblin -d mediagoblin/i18n/ + +echo "==> Committing to git" +git add mediagoblin/i18n/ +git commit -m "Committing extracted and compiled translations" -- cgit v1.2.3 From 1b5bbc0a8522b384084345cbb4f4917a8db015bf Mon Sep 17 00:00:00 2001 From: Christopher Allan Webber Date: Fri, 13 Jan 2012 20:27:53 -0600 Subject: make this script executable --- devtools/update_translations.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 devtools/update_translations.sh diff --git a/devtools/update_translations.sh b/devtools/update_translations.sh old mode 100644 new mode 100755 -- cgit v1.2.3 From 9c947004139d0d0ae5a879cd4c120891f8a8d51e Mon Sep 17 00:00:00 2001 From: Elrond Date: Sat, 14 Jan 2012 12:54:16 +0100 Subject: Move maketarball.sh into devtools/ Now that there is a devtools directory, use it! --- devtools/maketarball.sh | 178 ++++++++++++++++++++++++++++++++++++++++++++++++ maketarball.sh | 178 ------------------------------------------------ 2 files changed, 178 insertions(+), 178 deletions(-) create mode 100755 devtools/maketarball.sh delete mode 100755 maketarball.sh diff --git a/devtools/maketarball.sh b/devtools/maketarball.sh new file mode 100755 index 00000000..5f17e578 --- /dev/null +++ b/devtools/maketarball.sh @@ -0,0 +1,178 @@ +#!/bin/bash + +# 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 . + + +# usage: maketarball [-drh] REVISH +# +# Creates a tarball of the repository at rev REVISH. + +# If -d is passed in, then it adds the date to the directory name. +# +# If -r is passed in, then it does some additional things required +# for a release-ready tarball. +# +# If -h is passed in, shows help and exits. +# +# Examples: +# +# ./maketarball v0.0.2 +# ./maketarball -d master +# ./maketarball -r v0.0.2 + + +USAGE="Usage: $0 -h | [-dr] REVISH" + +REVISH="none" +PREFIX="none" +NOWDATE="" +RELEASE="no" + +while getopts ":dhr" opt; +do + case "$opt" in + h) + echo "$USAGE" + echo "" + echo "Creates a tarball of the repository at rev REVISH." + echo "" + echo " -h Shows this help message" + echo " -d Includes date in tar file name and directory" + echo " -r Performs other release-related actions" + exit 0 + ;; + d) + NOWDATE=`date "+%Y-%m-%d-"` + shift $((OPTIND-1)) + ;; + r) + RELEASE="yes" + shift $((OPTIND-1)) + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + echo "$USAGE" >&2 + ;; + esac +done + +if [[ -z "$1" ]]; then + echo "$USAGE"; + exit 1; +fi + +REVISH=$1 +PREFIX="$NOWDATE$REVISH" + +# convert PREFIX to all lowercase and nix the v from tag names. +PREFIX=`echo "$PREFIX" | tr '[A-Z]' '[a-z]' | sed s/v//` + +# build the filename base minus the .tar.gz stuff--this is also +# the directory in the tarball. +FNBASE="mediagoblin-$PREFIX" + +STARTDIR=`pwd` + +function cleanup { + pushd $STARTDIR + + if [[ -e tmp ]] + then + echo "+ cleaning up tmp/" + rm -rf tmp + fi + popd +} + +echo "+ Building tarball from: $REVISH" +echo "+ Using prefix: $PREFIX" +echo "+ Release?: $RELEASE" + +echo "" + +if [[ -e tmp ]] +then + echo "+ there's an existing tmp/. please remove it." + exit 1 +fi + +mkdir $STARTDIR/tmp +echo "+ generating archive...." +git archive \ + --format=tar \ + --prefix=$FNBASE/ \ + $REVISH > tmp/$FNBASE.tar + +if [[ $? -ne 0 ]] +then + echo "+ git archive command failed. See above text for reason." + cleanup + exit 1 +fi + + +if [[ $RELEASE = "yes" ]] +then + pushd tmp/ + tar -xvf $FNBASE.tar + + pushd $FNBASE + pushd docs + + echo "+ generating html docs" + make html + if [[ $? -ne 0 ]] + then + echo "+ sphinx docs generation failed. See above text for reason." + cleanup + exit 1 + fi + + # NOTE: this doesn't work for gmg prior to v0.0.4. + echo "+ generating texinfo docs (doesn't work prior to v0.0.4)" + make info + popd + + echo "+ moving docs to the right place" + if [[ -e docs/build/html/ ]] + then + mv docs/build/html/ docs/html/ + mv docs/build/texinfo/ docs/texinfo/ + + rm -rf docs/build/ + rm -rf docs/source/mgext/*.pyc + else + # this is the old directory structure pre-0.0.4 + mv docs/_build/html/ docs/html/ + + rm -rf docs/_build/ + rm -rf docs/mgext/*.pyc + fi + + popd + + tar -cvf $FNBASE.tar $FNBASE + popd +fi + + +echo "+ compressing...." +gzip tmp/$FNBASE.tar + +echo "+ archive at tmp/$FNBASE.tar.gz" + +echo "+ done." diff --git a/maketarball.sh b/maketarball.sh deleted file mode 100755 index 5f17e578..00000000 --- a/maketarball.sh +++ /dev/null @@ -1,178 +0,0 @@ -#!/bin/bash - -# 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 . - - -# usage: maketarball [-drh] REVISH -# -# Creates a tarball of the repository at rev REVISH. - -# If -d is passed in, then it adds the date to the directory name. -# -# If -r is passed in, then it does some additional things required -# for a release-ready tarball. -# -# If -h is passed in, shows help and exits. -# -# Examples: -# -# ./maketarball v0.0.2 -# ./maketarball -d master -# ./maketarball -r v0.0.2 - - -USAGE="Usage: $0 -h | [-dr] REVISH" - -REVISH="none" -PREFIX="none" -NOWDATE="" -RELEASE="no" - -while getopts ":dhr" opt; -do - case "$opt" in - h) - echo "$USAGE" - echo "" - echo "Creates a tarball of the repository at rev REVISH." - echo "" - echo " -h Shows this help message" - echo " -d Includes date in tar file name and directory" - echo " -r Performs other release-related actions" - exit 0 - ;; - d) - NOWDATE=`date "+%Y-%m-%d-"` - shift $((OPTIND-1)) - ;; - r) - RELEASE="yes" - shift $((OPTIND-1)) - ;; - \?) - echo "Invalid option: -$OPTARG" >&2 - echo "$USAGE" >&2 - ;; - esac -done - -if [[ -z "$1" ]]; then - echo "$USAGE"; - exit 1; -fi - -REVISH=$1 -PREFIX="$NOWDATE$REVISH" - -# convert PREFIX to all lowercase and nix the v from tag names. -PREFIX=`echo "$PREFIX" | tr '[A-Z]' '[a-z]' | sed s/v//` - -# build the filename base minus the .tar.gz stuff--this is also -# the directory in the tarball. -FNBASE="mediagoblin-$PREFIX" - -STARTDIR=`pwd` - -function cleanup { - pushd $STARTDIR - - if [[ -e tmp ]] - then - echo "+ cleaning up tmp/" - rm -rf tmp - fi - popd -} - -echo "+ Building tarball from: $REVISH" -echo "+ Using prefix: $PREFIX" -echo "+ Release?: $RELEASE" - -echo "" - -if [[ -e tmp ]] -then - echo "+ there's an existing tmp/. please remove it." - exit 1 -fi - -mkdir $STARTDIR/tmp -echo "+ generating archive...." -git archive \ - --format=tar \ - --prefix=$FNBASE/ \ - $REVISH > tmp/$FNBASE.tar - -if [[ $? -ne 0 ]] -then - echo "+ git archive command failed. See above text for reason." - cleanup - exit 1 -fi - - -if [[ $RELEASE = "yes" ]] -then - pushd tmp/ - tar -xvf $FNBASE.tar - - pushd $FNBASE - pushd docs - - echo "+ generating html docs" - make html - if [[ $? -ne 0 ]] - then - echo "+ sphinx docs generation failed. See above text for reason." - cleanup - exit 1 - fi - - # NOTE: this doesn't work for gmg prior to v0.0.4. - echo "+ generating texinfo docs (doesn't work prior to v0.0.4)" - make info - popd - - echo "+ moving docs to the right place" - if [[ -e docs/build/html/ ]] - then - mv docs/build/html/ docs/html/ - mv docs/build/texinfo/ docs/texinfo/ - - rm -rf docs/build/ - rm -rf docs/source/mgext/*.pyc - else - # this is the old directory structure pre-0.0.4 - mv docs/_build/html/ docs/html/ - - rm -rf docs/_build/ - rm -rf docs/mgext/*.pyc - fi - - popd - - tar -cvf $FNBASE.tar $FNBASE - popd -fi - - -echo "+ compressing...." -gzip tmp/$FNBASE.tar - -echo "+ archive at tmp/$FNBASE.tar.gz" - -echo "+ done." -- cgit v1.2.3 From 52fc51f6a9b6379d39d391bd54473eebb6d23cd5 Mon Sep 17 00:00:00 2001 From: Elrond Date: Fri, 13 Jan 2012 22:59:14 +0100 Subject: Drop sessions with invalid ObjectIds The session can contain invalid objectids when switching a more or less live instance (with logged in users) from mongo to sql or vice versa. So drop the complete session and force the user to login again. --- mediagoblin/tools/request.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mediagoblin/tools/request.py b/mediagoblin/tools/request.py index b1cbe119..7e193125 100644 --- a/mediagoblin/tools/request.py +++ b/mediagoblin/tools/request.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 . -from mediagoblin.db.util import ObjectId +from mediagoblin.db.util import ObjectId, InvalidId def setup_user_in_request(request): """ @@ -25,13 +25,17 @@ def setup_user_in_request(request): request.user = None return - user = None - user = request.app.db.User.one( - {'_id': ObjectId(request.session['user_id'])}) + try: + oid = ObjectId(request.session['user_id']) + except InvalidId: + user = None + else: + user = request.db.User.one({'_id': oid}) if not user: # Something's wrong... this user doesn't exist? Invalidate # this session. + print "Killing session for %r" % request.session['user_id'] request.session.invalidate() request.user = user -- cgit v1.2.3 From b6997919563ab2553e9dc4af1d4cb06c1544a5ce Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 15 Jan 2012 17:07:15 +0100 Subject: Small margin/font-weight fix --- mediagoblin/static/css/base.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index c2d45a1b..5b37a362 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -48,6 +48,7 @@ h1 { margin-top: 15px; color: #fff; font-size: 1.875em; + font-weight: bold; } h2 { @@ -63,6 +64,7 @@ h3 { p { margin-top: 0px; + margin-bottom: 20px; } a { -- cgit v1.2.3 From 62f2557cae03bd4675fc67a7775d3c715a2f2a62 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 15 Jan 2012 17:10:35 +0100 Subject: Another small text style fix --- mediagoblin/static/css/base.css | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 5b37a362..44c7cd0c 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -43,12 +43,18 @@ form { /* text styles */ +h1,h2,h3,p { + margin-bottom: 20px; +} + +h1,h2,h3 { + font-weight: bold; +} + h1 { - margin-bottom: 15px; margin-top: 15px; color: #fff; font-size: 1.875em; - font-weight: bold; } h2 { @@ -64,7 +70,6 @@ h3 { p { margin-top: 0px; - margin-bottom: 20px; } a { -- cgit v1.2.3 From 8c7701f9f1653cf4038143cfb7a497ae21edf108 Mon Sep 17 00:00:00 2001 From: Jef van Schendel Date: Sun, 15 Jan 2012 17:23:21 +0100 Subject: Small fix to simplify font style --- mediagoblin/static/css/base.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mediagoblin/static/css/base.css b/mediagoblin/static/css/base.css index 44c7cd0c..efd7b561 100644 --- a/mediagoblin/static/css/base.css +++ b/mediagoblin/static/css/base.css @@ -32,8 +32,7 @@ body { padding: none; margin: 0px; height: 100%; - font: 16px "HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif; - font-family:'Lato', sans-serif; + font: 16px 'Lato', 'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif; } form { -- cgit v1.2.3

{{ media_entry['title'] }}{{ media_entry['created'].strftime("%m-%d-%Y %I:%M %p") }}{{ media_entry.created.strftime("%m-%d-%Y %I:%M %p") }}
{{ media_entry['title'] }}{{ media_entry.title }} {{ media_entry.created.strftime("%m-%d-%Y %I:%M %p") }}
{{ media_entry['title'] }}{{ media_entry.title }} {{ media_entry['created'].strftime("%m-%d-%Y %I:%M %p") }} {{ media_entry.get_fail_exception().general_message }}